@layerzerolabs/lz-v2-utilities 2.1.6 → 2.1.7
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/index.cjs +64 -63
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.mjs +58 -59
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -5
package/dist/index.cjs
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var address = require('@ethersproject/address');
|
|
4
|
+
var bytes = require('@ethersproject/bytes');
|
|
3
5
|
var web3_js = require('@solana/web3.js');
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
+
var abi = require('@ethersproject/abi');
|
|
7
|
+
var bignumber = require('@ethersproject/bignumber');
|
|
8
|
+
var solidity = require('@ethersproject/solidity');
|
|
6
9
|
var invariant = require('tiny-invariant');
|
|
10
|
+
var keccak256 = require('@ethersproject/keccak256');
|
|
7
11
|
|
|
8
12
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
13
|
|
|
@@ -14,13 +18,13 @@ async function sleep(timeout) {
|
|
|
14
18
|
await new Promise((resolve) => setTimeout(resolve, timeout));
|
|
15
19
|
}
|
|
16
20
|
function hexZeroPadTo32(addr) {
|
|
17
|
-
return
|
|
21
|
+
return bytes.hexZeroPad(addr, 32);
|
|
18
22
|
}
|
|
19
23
|
function bytes32ToEthAddress(bytes32) {
|
|
20
24
|
if (bytes32 instanceof Uint8Array) {
|
|
21
|
-
bytes32 =
|
|
25
|
+
bytes32 = bytes.hexlify(bytes32);
|
|
22
26
|
}
|
|
23
|
-
return
|
|
27
|
+
return address.getAddress(bytes32.slice(-40));
|
|
24
28
|
}
|
|
25
29
|
function trim0x(str) {
|
|
26
30
|
return str.replace(/^0x/, "");
|
|
@@ -29,7 +33,7 @@ function addressToBytes32(address) {
|
|
|
29
33
|
if (isSolanaAddress(address)) {
|
|
30
34
|
return new web3_js.PublicKey(address).toBytes();
|
|
31
35
|
} else if (address.startsWith("0x") && address.length <= 66) {
|
|
32
|
-
return
|
|
36
|
+
return bytes.arrayify(hexZeroPadTo32(address));
|
|
33
37
|
}
|
|
34
38
|
throw new Error("Invalid address");
|
|
35
39
|
}
|
|
@@ -116,12 +120,12 @@ var parseError = (errorData, intf) => {
|
|
|
116
120
|
function parseBuildInError(errorData) {
|
|
117
121
|
if (errorData.startsWith("0x08c379a0")) {
|
|
118
122
|
const content = `0x${errorData.substring(10)}`;
|
|
119
|
-
const reason =
|
|
123
|
+
const reason = abi.defaultAbiCoder.decode(["string"], content);
|
|
120
124
|
return reason[0];
|
|
121
125
|
}
|
|
122
126
|
if (errorData.startsWith("0x4e487b71")) {
|
|
123
127
|
const content = `0x${errorData.substring(10)}`;
|
|
124
|
-
const code =
|
|
128
|
+
const code = abi.defaultAbiCoder.decode(["uint"], content);
|
|
125
129
|
return code[0];
|
|
126
130
|
}
|
|
127
131
|
if (errorData === "0x") {
|
|
@@ -134,20 +138,20 @@ var OptionType = /* @__PURE__ */ ((OptionType2) => {
|
|
|
134
138
|
OptionType2[OptionType2["TYPE_3"] = 3] = "TYPE_3";
|
|
135
139
|
return OptionType2;
|
|
136
140
|
})(OptionType || {});
|
|
137
|
-
var MAX_UINT_128 =
|
|
141
|
+
var MAX_UINT_128 = bignumber.BigNumber.from("0xffffffffffffffffffffffffffffffff");
|
|
138
142
|
function optionsType1(_extraGas) {
|
|
139
|
-
const extraGas =
|
|
143
|
+
const extraGas = bignumber.BigNumber.from(_extraGas);
|
|
140
144
|
invariant__default.default(extraGas.lte(MAX_UINT_128), "extraGas should be less than MAX_UINT_128");
|
|
141
|
-
return
|
|
145
|
+
return solidity.pack(["uint16", "uint256"], [1 /* TYPE_1 */, extraGas]);
|
|
142
146
|
}
|
|
143
147
|
function optionsType2(_extraGas, _dstNativeAmt, _dstNativeAddress) {
|
|
144
|
-
const extraGas =
|
|
148
|
+
const extraGas = bignumber.BigNumber.from(_extraGas);
|
|
145
149
|
invariant__default.default(extraGas.lte(MAX_UINT_128), "extraGas should be less than MAX_UINT_128");
|
|
146
|
-
const dstNativeAmt =
|
|
150
|
+
const dstNativeAmt = bignumber.BigNumber.from(_dstNativeAmt);
|
|
147
151
|
invariant__default.default(dstNativeAmt.lte(MAX_UINT_128), "dstNativeAmt should be less than MAX_UINT_128");
|
|
148
|
-
return
|
|
152
|
+
return solidity.pack(
|
|
149
153
|
["uint16", "uint256", "uint256", "bytes"],
|
|
150
|
-
[2 /* TYPE_2 */,
|
|
154
|
+
[2 /* TYPE_2 */, bignumber.BigNumber.from(extraGas), bignumber.BigNumber.from(dstNativeAmt), _dstNativeAddress]
|
|
151
155
|
);
|
|
152
156
|
}
|
|
153
157
|
var WorkerId = /* @__PURE__ */ ((WorkerId2) => {
|
|
@@ -184,42 +188,42 @@ var Options = class _Options {
|
|
|
184
188
|
*/
|
|
185
189
|
static fromOptions(optionsHex) {
|
|
186
190
|
const options = new _Options();
|
|
187
|
-
const optionsBytes =
|
|
188
|
-
const optionsType =
|
|
191
|
+
const optionsBytes = bytes.arrayify(optionsHex);
|
|
192
|
+
const optionsType = bignumber.BigNumber.from(optionsBytes.slice(0, 2)).toNumber();
|
|
189
193
|
if (optionsType === 3 /* TYPE_3 */) {
|
|
190
194
|
let cursor = 2;
|
|
191
195
|
while (cursor < optionsBytes.byteLength) {
|
|
192
|
-
const workerId =
|
|
196
|
+
const workerId = bignumber.BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber();
|
|
193
197
|
cursor += 1;
|
|
194
|
-
const size =
|
|
198
|
+
const size = bignumber.BigNumber.from(optionsBytes.slice(cursor, cursor + 2)).toNumber();
|
|
195
199
|
cursor += 2;
|
|
196
200
|
if (workerId === 1 /* EXECUTOR */) {
|
|
197
|
-
const optionType =
|
|
201
|
+
const optionType = bignumber.BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber();
|
|
198
202
|
cursor += 1;
|
|
199
203
|
const params = optionsBytes.slice(cursor, cursor + size - 1);
|
|
200
204
|
cursor += size - 1;
|
|
201
|
-
options.addOption(workerId, { type: optionType, params:
|
|
205
|
+
options.addOption(workerId, { type: optionType, params: bytes.hexlify(params) });
|
|
202
206
|
} else if (workerId === 2 /* VERIFIER */) {
|
|
203
|
-
const verifierIdx =
|
|
207
|
+
const verifierIdx = bignumber.BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber();
|
|
204
208
|
cursor += 1;
|
|
205
|
-
const optionType =
|
|
209
|
+
const optionType = bignumber.BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber();
|
|
206
210
|
cursor += 1;
|
|
207
211
|
const params = optionsBytes.slice(cursor, cursor + size - 2);
|
|
208
212
|
cursor += size - 2;
|
|
209
213
|
options.addOption(workerId, {
|
|
210
214
|
type: optionType,
|
|
211
215
|
index: verifierIdx,
|
|
212
|
-
params:
|
|
216
|
+
params: bytes.hexlify(params)
|
|
213
217
|
});
|
|
214
218
|
}
|
|
215
219
|
}
|
|
216
220
|
} else if (optionsType === 2 /* TYPE_2 */) {
|
|
217
|
-
const extraGas =
|
|
218
|
-
const dstNativeAmt =
|
|
219
|
-
const dstNativeAddress =
|
|
221
|
+
const extraGas = bignumber.BigNumber.from(optionsBytes.slice(2, 34)).toBigInt();
|
|
222
|
+
const dstNativeAmt = bignumber.BigNumber.from(optionsBytes.slice(34, 66)).toBigInt();
|
|
223
|
+
const dstNativeAddress = bytes.hexlify(optionsBytes.slice(66, optionsBytes.byteLength));
|
|
220
224
|
options.addExecutorLzReceiveOption(extraGas).addExecutorNativeDropOption(dstNativeAmt, dstNativeAddress);
|
|
221
225
|
} else if (optionsType === 1 /* TYPE_1 */) {
|
|
222
|
-
const extraGas =
|
|
226
|
+
const extraGas = bignumber.BigNumber.from(optionsBytes.slice(2, 34)).toBigInt();
|
|
223
227
|
options.addExecutorLzReceiveOption(extraGas);
|
|
224
228
|
}
|
|
225
229
|
return options;
|
|
@@ -230,13 +234,13 @@ var Options = class _Options {
|
|
|
230
234
|
* @param {NativeDrop} nativeDrop
|
|
231
235
|
*/
|
|
232
236
|
addExecutorLzReceiveOption(gasLimit, nativeDrop = 0) {
|
|
233
|
-
const gasLimitBN =
|
|
237
|
+
const gasLimitBN = bignumber.BigNumber.from(gasLimit);
|
|
234
238
|
invariant__default.default(gasLimitBN.lte(MAX_UINT_128), "gasLimit shouldn't be greater than MAX_UINT_128");
|
|
235
|
-
const nativeDropBN =
|
|
239
|
+
const nativeDropBN = bignumber.BigNumber.from(nativeDrop);
|
|
236
240
|
invariant__default.default(nativeDropBN.lte(MAX_UINT_128), "value shouldn't be greater than MAX_UINT_128");
|
|
237
241
|
this.addOption(1 /* EXECUTOR */, {
|
|
238
242
|
type: 1 /* LZ_RECEIVE */,
|
|
239
|
-
params: nativeDropBN.eq(0) ?
|
|
243
|
+
params: nativeDropBN.eq(0) ? solidity.pack(["uint128"], [gasLimitBN]) : solidity.pack(["uint128", "uint128"], [gasLimitBN, nativeDropBN])
|
|
240
244
|
});
|
|
241
245
|
return this;
|
|
242
246
|
}
|
|
@@ -246,11 +250,11 @@ var Options = class _Options {
|
|
|
246
250
|
* @param {string} receiver
|
|
247
251
|
*/
|
|
248
252
|
addExecutorNativeDropOption(nativeDrop, receiver) {
|
|
249
|
-
const amountBN =
|
|
253
|
+
const amountBN = bignumber.BigNumber.from(nativeDrop);
|
|
250
254
|
invariant__default.default(amountBN.lte(MAX_UINT_128), "nativeDrop shouldn't be greater than MAX_UINT_128");
|
|
251
255
|
this.addOption(1 /* EXECUTOR */, {
|
|
252
256
|
type: 2 /* NATIVE_DROP */,
|
|
253
|
-
params:
|
|
257
|
+
params: solidity.pack(["uint128", "bytes32"], [amountBN, hexZeroPadTo32(receiver)])
|
|
254
258
|
});
|
|
255
259
|
return this;
|
|
256
260
|
}
|
|
@@ -261,19 +265,16 @@ var Options = class _Options {
|
|
|
261
265
|
* @param {NativeDrop} nativeDrop
|
|
262
266
|
*/
|
|
263
267
|
addExecutorComposeOption(index, gasLimit, nativeDrop = 0) {
|
|
264
|
-
const gasLimitBN =
|
|
268
|
+
const gasLimitBN = bignumber.BigNumber.from(gasLimit);
|
|
265
269
|
invariant__default.default(gasLimitBN.lte(MAX_UINT_128), "gasLimit shouldn't be greater than MAX_UINT_128");
|
|
266
|
-
const nativeDropBN =
|
|
270
|
+
const nativeDropBN = bignumber.BigNumber.from(nativeDrop);
|
|
267
271
|
invariant__default.default(nativeDropBN.lte(MAX_UINT_128), "nativeDrop shouldn't be greater than MAX_UINT_128");
|
|
268
272
|
const option = nativeDropBN.gt(0) ? {
|
|
269
273
|
type: 3 /* COMPOSE */,
|
|
270
|
-
params:
|
|
271
|
-
["uint16", "uint128", "uint128"],
|
|
272
|
-
[index, gasLimitBN, nativeDropBN]
|
|
273
|
-
)
|
|
274
|
+
params: solidity.pack(["uint16", "uint128", "uint128"], [index, gasLimitBN, nativeDropBN])
|
|
274
275
|
} : {
|
|
275
276
|
type: 3 /* COMPOSE */,
|
|
276
|
-
params:
|
|
277
|
+
params: solidity.pack(["uint16", "uint128"], [index, gasLimitBN])
|
|
277
278
|
};
|
|
278
279
|
this.addOption(1 /* EXECUTOR */, option);
|
|
279
280
|
return this;
|
|
@@ -304,12 +305,12 @@ var Options = class _Options {
|
|
|
304
305
|
* Serialize Options to hex string.
|
|
305
306
|
*/
|
|
306
307
|
toHex() {
|
|
307
|
-
let hex =
|
|
308
|
+
let hex = solidity.pack(["uint16"], [3 /* TYPE_3 */]);
|
|
308
309
|
this.workerOptions.forEach((w) => {
|
|
309
310
|
for (const option of w.options) {
|
|
310
311
|
if (w.workerId === 1 /* EXECUTOR */) {
|
|
311
312
|
hex += trim0x(
|
|
312
|
-
|
|
313
|
+
solidity.pack(
|
|
313
314
|
["uint8", "uint16", "uint8", "bytes"],
|
|
314
315
|
[w.workerId, trim0x(option.params).length / 2 + 1, option.type, option.params]
|
|
315
316
|
)
|
|
@@ -317,7 +318,7 @@ var Options = class _Options {
|
|
|
317
318
|
} else if (w.workerId === 2 /* VERIFIER */) {
|
|
318
319
|
const verifierOption = option;
|
|
319
320
|
hex += trim0x(
|
|
320
|
-
|
|
321
|
+
solidity.pack(
|
|
321
322
|
["uint8", "uint16", "uint8", "uint8", "bytes"],
|
|
322
323
|
[
|
|
323
324
|
w.workerId,
|
|
@@ -337,7 +338,7 @@ var Options = class _Options {
|
|
|
337
338
|
* Serialize Options to Uint8Array.
|
|
338
339
|
*/
|
|
339
340
|
toBytes() {
|
|
340
|
-
return
|
|
341
|
+
return bytes.arrayify(this.toHex());
|
|
341
342
|
}
|
|
342
343
|
addOption(workerId, option) {
|
|
343
344
|
const worker = this.workerOptions.find((w) => w.workerId === workerId);
|
|
@@ -355,15 +356,15 @@ var Options = class _Options {
|
|
|
355
356
|
if (!options || options.length === 0) {
|
|
356
357
|
return;
|
|
357
358
|
}
|
|
358
|
-
let totalGas =
|
|
359
|
-
let totalValue =
|
|
359
|
+
let totalGas = bignumber.BigNumber.from(0).toBigInt();
|
|
360
|
+
let totalValue = bignumber.BigNumber.from(0).toBigInt();
|
|
360
361
|
for (const option of options) {
|
|
361
362
|
const buffer = Buffer.from(trim0x(option.params), "hex");
|
|
362
|
-
const gas =
|
|
363
|
+
const gas = bignumber.BigNumber.from(buffer.subarray(0, 16)).toBigInt();
|
|
363
364
|
if (buffer.length === 16) {
|
|
364
|
-
return { gas, value:
|
|
365
|
+
return { gas, value: bignumber.BigNumber.from(0).toBigInt() };
|
|
365
366
|
}
|
|
366
|
-
const value =
|
|
367
|
+
const value = bignumber.BigNumber.from(buffer.subarray(16, 32)).toBigInt();
|
|
367
368
|
totalGas = totalGas + gas;
|
|
368
369
|
totalValue = totalValue + value;
|
|
369
370
|
}
|
|
@@ -379,8 +380,8 @@ var Options = class _Options {
|
|
|
379
380
|
}
|
|
380
381
|
const results = options.reduce((acc, cur) => {
|
|
381
382
|
const buffer = Buffer.from(trim0x(cur.params), "hex");
|
|
382
|
-
const amount =
|
|
383
|
-
const receiver =
|
|
383
|
+
const amount = bignumber.BigNumber.from(buffer.subarray(0, 16)).toBigInt();
|
|
384
|
+
const receiver = bytes.hexlify(buffer.subarray(16, 48));
|
|
384
385
|
if (acc[receiver]) {
|
|
385
386
|
acc[receiver]["amount"] = acc[receiver].amount + amount;
|
|
386
387
|
} else {
|
|
@@ -401,9 +402,9 @@ var Options = class _Options {
|
|
|
401
402
|
const results = options.reduce(
|
|
402
403
|
(acc, cur) => {
|
|
403
404
|
const buffer = Buffer.from(trim0x(cur.params), "hex");
|
|
404
|
-
const index =
|
|
405
|
-
const gas =
|
|
406
|
-
const value = (buffer.length === 34 ?
|
|
405
|
+
const index = bignumber.BigNumber.from(buffer.subarray(0, 2)).toNumber();
|
|
406
|
+
const gas = bignumber.BigNumber.from(buffer.subarray(2, 18)).toBigInt();
|
|
407
|
+
const value = (buffer.length === 34 ? bignumber.BigNumber.from(buffer.subarray(18, 34)) : bignumber.BigNumber.from(0)).toBigInt();
|
|
407
408
|
if (acc[index]) {
|
|
408
409
|
acc[index]["gas"] = acc[index].gas + gas;
|
|
409
410
|
acc[index]["value"] = acc[index].value + value;
|
|
@@ -522,7 +523,7 @@ var PacketV1Codec = class _PacketV1Codec {
|
|
|
522
523
|
return "0x" + this.buffer.slice(MESSAGE_OFFSET).toString("hex");
|
|
523
524
|
}
|
|
524
525
|
payloadHash() {
|
|
525
|
-
return keccak256(this.payload());
|
|
526
|
+
return keccak256.keccak256(this.payload());
|
|
526
527
|
}
|
|
527
528
|
payload() {
|
|
528
529
|
return "0x" + this.buffer.slice(GUID_OFFSET).toString("hex");
|
|
@@ -531,7 +532,7 @@ var PacketV1Codec = class _PacketV1Codec {
|
|
|
531
532
|
return "0x" + this.buffer.slice(0, GUID_OFFSET).toString("hex");
|
|
532
533
|
}
|
|
533
534
|
headerHash() {
|
|
534
|
-
return keccak256(this.header());
|
|
535
|
+
return keccak256.keccak256(this.header());
|
|
535
536
|
}
|
|
536
537
|
/**
|
|
537
538
|
* deserialize packet from hex string
|
|
@@ -556,11 +557,11 @@ var PacketV1Codec = class _PacketV1Codec {
|
|
|
556
557
|
}
|
|
557
558
|
};
|
|
558
559
|
function calculateGuid(packetHead) {
|
|
559
|
-
return keccak256(
|
|
560
|
-
|
|
560
|
+
return keccak256.keccak256(
|
|
561
|
+
solidity.pack(
|
|
561
562
|
["uint64", "uint32", "bytes32", "uint32", "bytes32"],
|
|
562
563
|
[
|
|
563
|
-
|
|
564
|
+
bignumber.BigNumber.from(packetHead.nonce),
|
|
564
565
|
packetHead.srcEid,
|
|
565
566
|
addressToBytes32(packetHead.sender),
|
|
566
567
|
packetHead.dstEid,
|
|
@@ -569,9 +570,6 @@ function calculateGuid(packetHead) {
|
|
|
569
570
|
)
|
|
570
571
|
);
|
|
571
572
|
}
|
|
572
|
-
function keccak256(message) {
|
|
573
|
-
return ethers.ethers.utils.keccak256(message);
|
|
574
|
-
}
|
|
575
573
|
|
|
576
574
|
// src/codec/packet-serializer.ts
|
|
577
575
|
var PacketSerializer = class {
|
|
@@ -589,6 +587,10 @@ var PacketSerializer = class {
|
|
|
589
587
|
}
|
|
590
588
|
};
|
|
591
589
|
|
|
590
|
+
Object.defineProperty(exports, "keccak256", {
|
|
591
|
+
enumerable: true,
|
|
592
|
+
get: function () { return keccak256.keccak256; }
|
|
593
|
+
});
|
|
592
594
|
exports.ExecutorOptionType = ExecutorOptionType;
|
|
593
595
|
exports.OptionType = OptionType;
|
|
594
596
|
exports.Options = Options;
|
|
@@ -601,7 +603,6 @@ exports.bytes32ToEthAddress = bytes32ToEthAddress;
|
|
|
601
603
|
exports.calculateGuid = calculateGuid;
|
|
602
604
|
exports.hexZeroPadTo32 = hexZeroPadTo32;
|
|
603
605
|
exports.isSolanaAddress = isSolanaAddress;
|
|
604
|
-
exports.keccak256 = keccak256;
|
|
605
606
|
exports.optionsType1 = optionsType1;
|
|
606
607
|
exports.optionsType2 = optionsType2;
|
|
607
608
|
exports.packetToMessageOrigin = packetToMessageOrigin;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/utils.ts","../src/utils/hex.ts","../src/utils/precrime.ts","../src/utils/parse-error.ts","../src/options/options.ts","../src/model/packet.ts","../src/codec/packet-v1-codec.ts","../src/codec/packet-serializer.ts"],"names":["ethers","OptionType","WorkerId","ExecutorOptionType","VerifierOptionType"],"mappings":";AAAA,eAAsB,MAAM,SAAiB;AACzC,QAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAC/D;;;ACFA,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,gBAAgB;AAElB,SAAS,eAAe,MAAsB;AACjD,SAAO,OAAO,MAAM,WAAW,MAAM,EAAE;AAC3C;AAEO,SAAS,oBAAoB,SAAsC;AACtE,MAAI,mBAAmB,YAAY;AAC/B,cAAU,OAAO,MAAM,QAAQ,OAAO;AAAA,EAC1C;AACA,SAAO,OAAO,MAAM,WAAW,QAAQ,MAAM,GAAG,CAAC;AACrD;AAEO,SAAS,OAAO,KAAqB;AACxC,SAAO,IAAI,QAAQ,OAAO,EAAE;AAChC;AAMO,SAAS,iBAAiB,SAA6B;AAC1D,MAAI,gBAAgB,OAAO,GAAG;AAC1B,WAAO,IAAI,UAAU,OAAO,EAAE,QAAQ;AAAA,EAC1C,WAAW,QAAQ,WAAW,IAAI,KAAK,QAAQ,UAAU,IAAI;AACzD,WAAO,SAAS,eAAe,OAAO,CAAC;AAAA,EAC3C;AACA,QAAM,IAAI,MAAM,iBAAiB;AACrC;AAEA,IAAM,qBAAqB;AAEpB,SAAS,gBAAgB,SAA0B;AACtD,SAAO,mBAAmB,KAAK,OAAO;AAC1C;;;AChCA,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB;AAC9B,IAAM,yBAAyB;AAC/B,IAAM,eAAe;AAEd,SAAS,oBAAoB,gBAAwC;AACxE,QAAM,OAAO,OAAO,cAAc;AAClC,QAAM,UAAU,SAAS,KAAK,MAAM,GAAG,CAAC,GAAG,EAAE;AAC7C,MAAI,YAAY,GAAG;AACf,WAAO,sBAAsB,cAAc;AAAA,EAC/C,WAAW,YAAY,GAAG;AACtB,WAAO,sBAAsB,cAAc;AAAA,EAC/C;AACA,QAAM,IAAI,MAAM,wCAAwC,OAAO,EAAE;AACrE;AAEA,SAAS,sBAAsB,gBAA0C;AACrE,QAAM,OAAO,OAAO,cAAc;AAClC,QAAM,UAAU,SAAS,KAAK,MAAM,GAAG,CAAC,GAAG,EAAE;AAC7C,QAAM,eAAe,SAAS,KAAK,MAAM,GAAG,EAAE,GAAG,EAAE;AACnD,QAAM,qBAAqB,SAAS,KAAK,MAAM,IAAI,EAAE,GAAG,EAAE;AAC1D,QAAM,oBAAoB,KAAK,MAAM,IAAI,KAAK,qBAAqB,EAAE;AACrE,QAAM,uBAAuB,KAAK;AAAA,IAC9B,KAAK,qBAAqB;AAAA,IAC1B,KAAK,qBAAqB,KAAK,qBAAqB;AAAA,EACxD;AAEA,QAAM,yBAAmC,CAAC;AAC1C,QAAM,4BAAsC,CAAC;AAC7C,MAAI,QAAQ;AACZ,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,oBAAoB,KAAK;AACzC,2BAAuB,KAAK,SAAS,kBAAkB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;AAC7E,8BAA0B,KAAK,KAAK,qBAAqB,MAAM,OAAO,GAAG,CAAC,EAAE;AAC5E,aAAS;AACT,WAAO;AAAA,EACX;AACA,SAAO,EAAE,SAAS,cAAc,YAAY,wBAAwB,iBAAiB,0BAA0B;AACnH;AAEA,SAAS,sBAAsB,gBAA0C;AACrE,QAAM,SAAS,OAAO,KAAK,OAAO,cAAc,GAAG,KAAK;AACxD,QAAM,UAAU,OAAO,aAAa,qBAAqB;AACzD,QAAM,eAAe,OAAO,gBAAgB,qBAAqB;AACjE,QAAM,QAAQ,IAAI,MAAoB;AACtC,MAAI,OAAO,SAAS,wBAAwB;AACxC,UAAM,aAAa,OAAO,aAAa,sBAAsB;AAC7D,aAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACjC,YAAM,SAAS,eAAe,KAAK,IAAI,IAAI;AAC3C,YAAM,MAAM,OAAO,aAAa,MAAM;AACtC,YAAM,kBAAkB,OAAO,OAAO,MAAM,SAAS,GAAG,SAAS,IAAI,EAAE,EAAE,SAAS,KAAK;AACvF,YAAM,cAAc,OAAO,OAAO,MAAM,SAAS,IAAI,IAAI,SAAS,IAAI,KAAK,EAAE,EAAE,SAAS,KAAK;AAC7F,YAAM,KAAK;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AACA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;;;ACpEA,SAAS,UAAAA,eAAc;AAEhB,IAAM,aAAa,CACtB,WACA,SACwE;AACxE,QAAM,eAAe,kBAAkB,SAAS;AAChD,MAAI,iBAAiB,QAAW;AAC5B,WAAO;AAAA,EACX;AAEA,MAAI,MAAM;AACN,QAAI;AACA,aAAO,KAAK,WAAW,SAAS;AAAA,IACpC,SAAS,GAAG;AACR,cAAQ,MAAM,CAAC;AAAA,IACnB;AAAA,EACJ;AACJ;AAEA,SAAS,kBAAkB,WAAuC;AAC9D,MAAI,UAAU,WAAW,YAAY,GAAG;AAGpC,UAAM,UAAU,KAAK,UAAU,UAAU,EAAE,CAAC;AAC5C,UAAM,SAASA,QAAO,MAAM,gBAAgB,OAAO,CAAC,QAAQ,GAAG,OAAO;AAEtE,WAAO,OAAO,CAAC;AAAA,EACnB;AAEA,MAAI,UAAU,WAAW,YAAY,GAAG;AAEpC,UAAM,UAAU,KAAK,UAAU,UAAU,EAAE,CAAC;AAC5C,UAAM,OAAOA,QAAO,MAAM,gBAAgB,OAAO,CAAC,MAAM,GAAG,OAAO;AAElE,WAAO,KAAK,CAAC;AAAA,EACjB;AAEA,MAAI,cAAc,MAAM;AACpB,WAAO;AAAA,EACX;AACJ;;;ACzCA,SAAS,UAAAA,eAAc;AACvB,OAAO,eAAe;AAaf,IAAK,aAAL,kBAAKC,gBAAL;AASH,EAAAA,wBAAA,YAAS,KAAT;AASA,EAAAA,wBAAA,YAAS,KAAT;AAKA,EAAAA,wBAAA,YAAS,KAAT;AAvBQ,SAAAA;AAAA,GAAA;AA0BZ,IAAM,eAAeD,QAAO,UAAU,KAAK,oCAAoC;AAOxE,SAAS,aAAa,WAA6B;AACtD,QAAM,WAAWA,QAAO,UAAU,KAAK,SAAS;AAChD,YAAU,SAAS,IAAI,YAAY,GAAG,2CAA2C;AACjF,SAAOA,QAAO,MAAM,aAAa,CAAC,UAAU,SAAS,GAAG,CAAC,gBAAmB,QAAQ,CAAC;AACzF;AASO,SAAS,aAAa,WAAqB,eAA2B,mBAAmC;AAC5G,QAAM,WAAWA,QAAO,UAAU,KAAK,SAAS;AAChD,YAAU,SAAS,IAAI,YAAY,GAAG,2CAA2C;AACjF,QAAM,eAAeA,QAAO,UAAU,KAAK,aAAa;AACxD,YAAU,aAAa,IAAI,YAAY,GAAG,+CAA+C;AACzF,SAAOA,QAAO,MAAM;AAAA,IAChB,CAAC,UAAU,WAAW,WAAW,OAAO;AAAA,IACxC,CAAC,gBAAmBA,QAAO,UAAU,KAAK,QAAQ,GAAGA,QAAO,UAAU,KAAK,YAAY,GAAG,iBAAiB;AAAA,EAC/G;AACJ;AAKO,IAAK,WAAL,kBAAKE,cAAL;AACH,EAAAA,oBAAA,cAAW,KAAX;AACA,EAAAA,oBAAA,cAAW,KAAX;AACA,EAAAA,oBAAA,cAAW,OAAX;AAHQ,SAAAA;AAAA,GAAA;AAuBL,IAAK,qBAAL,kBAAKC,wBAAL;AACH,EAAAA,wCAAA,gBAAa,KAAb;AACA,EAAAA,wCAAA,iBAAc,KAAd;AACA,EAAAA,wCAAA,aAAU,KAAV;AACA,EAAAA,wCAAA,aAAU,KAAV;AAJQ,SAAAA;AAAA,GAAA;AAUL,IAAK,qBAAL,kBAAKC,wBAAL;AACH,EAAAA,wCAAA,cAAW,KAAX;AADQ,SAAAA;AAAA,GAAA;AAOL,IAAM,UAAN,MAAM,SAAQ;AAAA,EACP,gBAAiC,CAAC;AAAA;AAAA,EAGlC,cAAc;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA,EAKzB,OAAc,aAAsB;AAChC,WAAO,IAAI,SAAQ;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAc,YAAY,YAA6B;AACnD,UAAM,UAAU,IAAI,SAAQ;AAC5B,UAAM,eAAeJ,QAAO,MAAM,SAAS,UAAU;AAErD,UAAM,cAAcA,QAAO,UAAU,KAAK,aAAa,MAAM,GAAG,CAAC,CAAC,EAAE,SAAS;AAC7E,QAAI,gBAAgB,gBAAmB;AACnC,UAAI,SAAS;AACb,aAAO,SAAS,aAAa,YAAY;AACrC,cAAM,WAAWA,QAAO,UAAU,KAAK,aAAa,MAAM,QAAQ,SAAS,CAAC,CAAC,EAAE,SAAS;AACxF,kBAAU;AAEV,cAAM,OAAOA,QAAO,UAAU,KAAK,aAAa,MAAM,QAAQ,SAAS,CAAC,CAAC,EAAE,SAAS;AACpF,kBAAU;AAEV,YAAI,aAAa,kBAAmB;AAChC,gBAAM,aAAaA,QAAO,UAAU,KAAK,aAAa,MAAM,QAAQ,SAAS,CAAC,CAAC,EAAE,SAAS;AAC1F,oBAAU;AACV,gBAAM,SAAS,aAAa,MAAM,QAAQ,SAAS,OAAO,CAAC;AAC3D,oBAAU,OAAO;AACjB,kBAAQ,UAAU,UAAU,EAAE,MAAM,YAAY,QAAQA,QAAO,MAAM,QAAQ,MAAM,EAAE,CAAC;AAAA,QAC1F,WAAW,aAAa,kBAAmB;AACvC,gBAAM,cAAcA,QAAO,UAAU,KAAK,aAAa,MAAM,QAAQ,SAAS,CAAC,CAAC,EAAE,SAAS;AAC3F,oBAAU;AACV,gBAAM,aAAaA,QAAO,UAAU,KAAK,aAAa,MAAM,QAAQ,SAAS,CAAC,CAAC,EAAE,SAAS;AAC1F,oBAAU;AACV,gBAAM,SAAS,aAAa,MAAM,QAAQ,SAAS,OAAO,CAAC;AAC3D,oBAAU,OAAO;AACjB,kBAAQ,UAAU,UAA0B;AAAA,YACxC,MAAM;AAAA,YACN,OAAO;AAAA,YACP,QAAQA,QAAO,MAAM,QAAQ,MAAM;AAAA,UACvC,CAAC;AAAA,QACL;AAAA,MAEJ;AAAA,IACJ,WAAW,gBAAgB,gBAAmB;AAC1C,YAAM,WAAWA,QAAO,UAAU,KAAK,aAAa,MAAM,GAAG,EAAE,CAAC,EAAE,SAAS;AAC3E,YAAM,eAAeA,QAAO,UAAU,KAAK,aAAa,MAAM,IAAI,EAAE,CAAC,EAAE,SAAS;AAChF,YAAM,mBAAmBA,QAAO,MAAM,QAAQ,aAAa,MAAM,IAAI,aAAa,UAAU,CAAC;AAC7F,cAAQ,2BAA2B,QAAQ,EAAE,4BAA4B,cAAc,gBAAgB;AAAA,IAC3G,WAAW,gBAAgB,gBAAmB;AAC1C,YAAM,WAAWA,QAAO,UAAU,KAAK,aAAa,MAAM,GAAG,EAAE,CAAC,EAAE,SAAS;AAC3E,cAAQ,2BAA2B,QAAQ;AAAA,IAC/C;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,2BAA2B,UAAoB,aAAyB,GAAY;AACvF,UAAM,aAAaA,QAAO,UAAU,KAAK,QAAQ;AACjD,cAAU,WAAW,IAAI,YAAY,GAAG,iDAAiD;AACzF,UAAM,eAAeA,QAAO,UAAU,KAAK,UAAU;AACrD,cAAU,aAAa,IAAI,YAAY,GAAG,8CAA8C;AACxF,SAAK,UAAU,kBAAmB;AAAA,MAC9B,MAAM;AAAA,MACN,QAAQ,aAAa,GAAG,CAAC,IACnBA,QAAO,MAAM,aAAa,CAAC,SAAS,GAAG,CAAC,UAAU,CAAC,IACnDA,QAAO,MAAM,aAAa,CAAC,WAAW,SAAS,GAAG,CAAC,YAAY,YAAY,CAAC;AAAA,IACtF,CAAC;AACD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,4BAA4B,YAAwB,UAA2B;AAClF,UAAM,WAAWA,QAAO,UAAU,KAAK,UAAU;AACjD,cAAU,SAAS,IAAI,YAAY,GAAG,mDAAmD;AACzF,SAAK,UAAU,kBAAmB;AAAA,MAC9B,MAAM;AAAA,MACN,QAAQA,QAAO,MAAM,aAAa,CAAC,WAAW,SAAS,GAAG,CAAC,UAAU,eAAe,QAAQ,CAAC,CAAC;AAAA,IAClG,CAAC;AACD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,yBAAyB,OAAe,UAAoB,aAAyB,GAAY;AACpG,UAAM,aAAaA,QAAO,UAAU,KAAK,QAAQ;AACjD,cAAU,WAAW,IAAI,YAAY,GAAG,iDAAiD;AACzF,UAAM,eAAeA,QAAO,UAAU,KAAK,UAAU;AACrD,cAAU,aAAa,IAAI,YAAY,GAAG,mDAAmD;AAC7F,UAAM,SAAS,aAAa,GAAG,CAAC,IAC1B;AAAA,MACI,MAAM;AAAA,MACN,QAAQA,QAAO,MAAM;AAAA,QACjB,CAAC,UAAU,WAAW,SAAS;AAAA,QAC/B,CAAC,OAAO,YAAY,YAAY;AAAA,MACpC;AAAA,IACJ,IACA;AAAA,MACI,MAAM;AAAA,MACN,QAAQA,QAAO,MAAM,aAAa,CAAC,UAAU,SAAS,GAAG,CAAC,OAAO,UAAU,CAAC;AAAA,IAChF;AAEN,SAAK,UAAU,kBAAmB,MAAM;AACxC,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKO,oCAA6C;AAChD,SAAK,UAAU,kBAAmB;AAAA,MAC9B,MAAM;AAAA,MACN,QAAQ;AAAA,IACZ,CAAC;AACD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,0BAA0B,aAA8B;AAC3D,SAAK,UAAU,kBAAmC;AAAA,MAC9C,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,IACZ,CAAC;AACD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKO,QAAgB;AAEnB,QAAI,MAAMA,QAAO,MAAM,aAAa,CAAC,QAAQ,GAAG,CAAC,cAAiB,CAAC;AACnE,SAAK,cAAc,QAAQ,CAAC,MAAM;AAC9B,iBAAW,UAAU,EAAE,SAAS;AAC5B,YAAI,EAAE,aAAa,kBAAmB;AAClC,iBAAO;AAAA,YACHA,QAAO,MAAM;AAAA,cACT,CAAC,SAAS,UAAU,SAAS,OAAO;AAAA,cACpC,CAAC,EAAE,UAAU,OAAO,OAAO,MAAM,EAAE,SAAS,IAAI,GAAG,OAAO,MAAM,OAAO,MAAM;AAAA,YACjF;AAAA,UACJ;AAAA,QACJ,WAAW,EAAE,aAAa,kBAAmB;AACzC,gBAAM,iBAAiB;AACvB,iBAAO;AAAA,YACHA,QAAO,MAAM;AAAA,cACT,CAAC,SAAS,UAAU,SAAS,SAAS,OAAO;AAAA,cAC7C;AAAA,gBACI,EAAE;AAAA,gBACF,OAAO,OAAO,MAAM,EAAE,SAAS,IAAI;AAAA,gBACnC,eAAe;AAAA,gBACf,eAAe;AAAA,gBACf,eAAe;AAAA,cACnB;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MAEJ;AAAA,IACJ,CAAC;AACD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKO,UAAsB;AACzB,WAAOA,QAAO,MAAM,SAAS,KAAK,MAAM,CAAC;AAAA,EAC7C;AAAA,EAEQ,UAAU,UAAkB,QAAsB;AACtD,UAAM,SAAS,KAAK,cAAc,KAAK,CAAC,MAAM,EAAE,aAAa,QAAQ;AACrE,QAAI,QAAQ;AACR,aAAO,QAAQ,KAAK,MAAM;AAAA,IAC9B,OAAO;AACH,WAAK,cAAc,KAAK,EAAE,UAAU,SAAS,CAAC,MAAM,EAAE,CAAC;AAAA,IAC3D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKO,gCAA4E;AAC/E,UAAM,UAAU,KAAK,YAAY,kBAAmB,kBAA6B;AACjF,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AAClC;AAAA,IACJ;AACA,QAAI,WAAWA,QAAO,UAAU,KAAK,CAAC,EAAE,SAAS;AACjD,QAAI,aAAaA,QAAO,UAAU,KAAK,CAAC,EAAE,SAAS;AACnD,eAAW,UAAU,SAAS;AAC1B,YAAM,SAAS,OAAO,KAAK,OAAO,OAAO,MAAM,GAAG,KAAK;AACvD,YAAM,MAAMA,QAAO,UAAU,KAAK,OAAO,SAAS,GAAG,EAAE,CAAC,EAAE,SAAS;AACnE,UAAI,OAAO,WAAW,IAAI;AACtB,eAAO,EAAE,KAAK,OAAOA,QAAO,UAAU,KAAK,CAAC,EAAE,SAAS,EAAE;AAAA,MAC7D;AACA,YAAM,QAAQA,QAAO,UAAU,KAAK,OAAO,SAAS,IAAI,EAAE,CAAC,EAAE,SAAS;AACtE,iBAAW,WAAW;AACtB,mBAAa,aAAa;AAAA,IAC9B;AAEA,WAAO,EAAE,KAAK,UAAU,OAAO,WAAW;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKO,iCAAyE;AAC5E,UAAM,UAAU,KAAK,YAAY,kBAAmB,mBAA8B;AAClF,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AAClC,aAAO,CAAC;AAAA,IACZ;AAEA,UAAM,UAAU,QAAQ,OAAO,CAAC,KAA8D,QAAgB;AAC1G,YAAM,SAAS,OAAO,KAAK,OAAO,IAAI,MAAM,GAAG,KAAK;AACpD,YAAM,SAASA,QAAO,UAAU,KAAK,OAAO,SAAS,GAAG,EAAE,CAAC,EAAE,SAAS;AACtE,YAAM,WAAWA,QAAO,MAAM,QAAQ,OAAO,SAAS,IAAI,EAAE,CAAC;AAC7D,UAAI,IAAI,QAAQ,GAAG;AACf,YAAI,QAAQ,EAAE,QAAQ,IAAI,IAAI,QAAQ,EAAE,SAAS;AAAA,MACrD,OAAO;AACH,YAAI,QAAQ,IAAI,EAAE,QAAQ,SAAS;AAAA,MACvC;AACA,aAAO;AAAA,IACX,GAAG,CAAC,CAAC;AACL,WAAO,OAAO,OAAO,OAAO;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKO,8BAA+E;AAClF,UAAM,UAAU,KAAK,YAAY,kBAAmB,eAA0B;AAC9E,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AAClC,aAAO,CAAC;AAAA,IACZ;AACA,UAAM,UAAU,QAAQ;AAAA,MACpB,CAAC,KAAuE,QAAgB;AACpF,cAAM,SAAS,OAAO,KAAK,OAAO,IAAI,MAAM,GAAG,KAAK;AACpD,cAAM,QAAQA,QAAO,UAAU,KAAK,OAAO,SAAS,GAAG,CAAC,CAAC,EAAE,SAAS;AACpE,cAAM,MAAMA,QAAO,UAAU,KAAK,OAAO,SAAS,GAAG,EAAE,CAAC,EAAE,SAAS;AACnE,cAAM,SACF,OAAO,WAAW,KAAKA,QAAO,UAAU,KAAK,OAAO,SAAS,IAAI,EAAE,CAAC,IAAIA,QAAO,UAAU,KAAK,CAAC,GACjG,SAAS;AACX,YAAI,IAAI,KAAK,GAAG;AACZ,cAAI,KAAK,EAAE,KAAK,IAAI,IAAI,KAAK,EAAE,MAAM;AACrC,cAAI,KAAK,EAAE,OAAO,IAAI,IAAI,KAAK,EAAE,QAAQ;AAAA,QAC7C,OAAO;AACH,cAAI,KAAK,IAAI,EAAE,OAAO,KAAK,MAAM;AAAA,QACrC;AACA,eAAO;AAAA,MACX;AAAA,MACA,CAAC;AAAA,IACL;AACA,WAAO,OAAO,OAAO,OAAO;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKO,uCAAgD;AACnD,UAAM,SAAS,KAAK,YAAY,kBAAmB,eAA0B;AAC7E,WAAO,WAAW;AAAA,EACtB;AAAA,EAEQ,YAAY,UAAkB,YAAmD;AACrF,UAAM,SAAS,KAAK,cAAc,KAAK,CAAC,MAAM,EAAE,aAAa,QAAQ;AACrE,QAAI,QAAQ;AACR,UAAI,eAAe,iBAA4B;AAC3C,eAAO,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AAAA,MAC3D;AACA,aAAO,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU;AAAA,IAC7D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,mBAAmB,aAAqB,YAAgD;AAC3F,UAAM,SAAS,KAAK,cAAc,KAAK,CAAC,MAAM,EAAE,aAAa,gBAAiB;AAC9E,QAAI,QAAQ;AACR,YAAM,MAAM,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,cAAe,EAAqB,UAAU,WAAW;AAC3G,UAAI,KAAK;AACL,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,EACJ;AACJ;;;AC/YO,SAAS,sBAAsB,QAA+B;AACjE,SAAO;AAAA,IACH,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,IACf,OAAO,OAAO;AAAA,EAClB;AACJ;;;AChCA,SAAS,UAAAA,eAAc;AAOvB,IAAM,wBAAwB;AAE9B,IAAM,eAAe;AAErB,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAE3B,IAAM,cAAc;AACpB,IAAM,iBAAiB;AAEhB,IAAM,gBAAN,MAAM,eAAc;AAAA,EACvB;AAAA,EAEA,OAAO,KAAK,gBAAuC;AAC/C,WAAO,IAAI,eAAc,cAAc;AAAA,EAC3C;AAAA,EAEA,OAAO,UAAU,SAAoC;AACjD,WAAO,IAAI,eAAc,OAAO,OAAO,KAAK,OAAO,EAAE,SAAS,KAAK,CAAC;AAAA,EACxE;AAAA,EAEU,YAAY,gBAAwB;AAC1C,SAAK,SAAS,OAAO,KAAK,OAAO,cAAc,GAAG,KAAK;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAO,QAAwB;AAClC,UAAM,UAAU,OAAO,OAAO,OAAO;AACrC,UAAM,SAAS,OAAO,MAAM,iBAAiB,QAAQ,SAAS,CAAC;AAC/D,WAAO,WAAW,OAAO,SAAS,qBAAqB;AACvD,WAAO,iBAAiB,OAAO,OAAO,KAAK,GAAG,YAAY;AAC1D,WAAO,cAAc,OAAO,QAAQ,gBAAgB;AACpD,WAAO,MAAM,OAAO,eAAe,OAAO,MAAM,CAAC,GAAG,oBAAoB,IAAI,KAAK;AACjF,WAAO,cAAc,OAAO,QAAQ,gBAAgB;AACpD,WAAO,MAAM,OAAO,eAAe,OAAO,QAAQ,CAAC,GAAG,oBAAoB,IAAI,KAAK;AACnF,WAAO,MAAM,OAAO,OAAO,IAAI,GAAG,aAAa,IAAI,KAAK;AACxD,WAAO,MAAM,SAAS,gBAAgB,QAAQ,SAAS,GAAG,KAAK;AAC/D,WAAO,OAAO,OAAO,SAAS,KAAK;AAAA,EACvC;AAAA,EAEA,UAAkB;AACd,WAAO,KAAK,OAAO,UAAU,qBAAqB;AAAA,EACtD;AAAA,EAEA,QAAgB;AACZ,WAAO,KAAK,OAAO,gBAAgB,YAAY,EAAE,SAAS;AAAA,EAC9D;AAAA,EAEA,SAAiB;AACb,WAAO,KAAK,OAAO,aAAa,gBAAgB;AAAA,EACpD;AAAA,EAEA,SAAiB;AACb,WAAO,OAAO,KAAK,OAAO,MAAM,oBAAoB,gBAAgB,EAAE,SAAS,KAAK;AAAA,EACxF;AAAA,EAEA,mBAA2B;AACvB,WAAO,oBAAoB,KAAK,OAAO,CAAC;AAAA,EAC5C;AAAA,EAEA,SAAiB;AACb,WAAO,KAAK,OAAO,aAAa,gBAAgB;AAAA,EACpD;AAAA,EAEA,WAAmB;AACf,WAAO,OAAO,KAAK,OAAO,MAAM,oBAAoB,WAAW,EAAE,SAAS,KAAK;AAAA,EACnF;AAAA,EAEA,qBAA6B;AACzB,WAAO,oBAAoB,KAAK,SAAS,CAAC;AAAA,EAC9C;AAAA,EAEA,OAAe;AACX,WAAO,OAAO,KAAK,OAAO,MAAM,aAAa,cAAc,EAAE,SAAS,KAAK;AAAA,EAC/E;AAAA,EAEA,UAAkB;AACd,WAAO,OAAO,KAAK,OAAO,MAAM,cAAc,EAAE,SAAS,KAAK;AAAA,EAClE;AAAA,EAEA,cAAsB;AAClB,WAAO,UAAU,KAAK,QAAQ,CAAC;AAAA,EACnC;AAAA,EAEA,UAAkB;AACd,WAAO,OAAO,KAAK,OAAO,MAAM,WAAW,EAAE,SAAS,KAAK;AAAA,EAC/D;AAAA,EAEA,SAAiB;AACb,WAAO,OAAO,KAAK,OAAO,MAAM,GAAG,WAAW,EAAE,SAAS,KAAK;AAAA,EAClE;AAAA,EAEA,aAAqB;AACjB,WAAO,UAAU,KAAK,OAAO,CAAC;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAiB;AACb,WAAO,KAAK,SAAS;AAAA,EACzB;AAAA,EAEA,WAAmB;AACf,WAAO;AAAA,MACH,SAAS,KAAK,QAAQ;AAAA,MACtB,OAAO,KAAK,MAAM;AAAA,MAClB,QAAQ,KAAK,OAAO;AAAA,MACpB,QAAQ,KAAK,OAAO;AAAA,MACpB,QAAQ,KAAK,OAAO;AAAA,MACpB,UAAU,KAAK,SAAS;AAAA,MACxB,MAAM,KAAK,KAAK;AAAA,MAChB,SAAS,KAAK,QAAQ;AAAA;AAAA,MAEtB,SAAS,KAAK,QAAQ;AAAA,IAC1B;AAAA,EACJ;AACJ;AAEO,SAAS,cAAc,YAAkC;AAC5D,SAAO;AAAA,IACHA,QAAO,MAAM;AAAA,MACT,CAAC,UAAU,UAAU,WAAW,UAAU,SAAS;AAAA,MACnD;AAAA,QACIA,QAAO,UAAU,KAAK,WAAW,KAAK;AAAA,QACtC,WAAW;AAAA,QACX,iBAAiB,WAAW,MAAM;AAAA,QAClC,WAAW;AAAA,QACX,iBAAiB,WAAW,QAAQ;AAAA,MACxC;AAAA,IACJ;AAAA,EACJ;AACJ;AAEO,SAAS,UAAU,SAAyB;AAC/C,SAAOA,QAAO,MAAM,UAAU,OAAO;AACzC;;;AChJO,IAAM,mBAAN,MAAuB;AAAA,EAC1B,OAAO,UAAU,QAAwB;AACrC,WAAO,cAAc,OAAO,MAAM;AAAA,EACtC;AAAA,EAEA,OAAO,YAAY,WAAwC;AACvD,QAAI;AACJ,QAAI,qBAAqB,YAAY;AACjC,cAAQ,cAAc,UAAU,SAAS;AAAA,IAC7C,OAAO;AACH,cAAQ,cAAc,KAAK,SAAS;AAAA,IACxC;AACA,WAAO,MAAM,SAAS;AAAA,EAC1B;AACJ","sourcesContent":["export async function sleep(timeout: number) {\n await new Promise((resolve) => setTimeout(resolve, timeout))\n}\n","import { PublicKey } from '@solana/web3.js'\nimport { ethers } from 'ethers'\nimport { arrayify } from 'ethers/lib/utils'\n\nexport function hexZeroPadTo32(addr: string): string {\n return ethers.utils.hexZeroPad(addr, 32)\n}\n\nexport function bytes32ToEthAddress(bytes32: string | Uint8Array): string {\n if (bytes32 instanceof Uint8Array) {\n bytes32 = ethers.utils.hexlify(bytes32)\n }\n return ethers.utils.getAddress(bytes32.slice(-40))\n}\n\nexport function trim0x(str: string): string {\n return str.replace(/^0x/, '')\n}\n\n/**\n * Convert address to bytes32\n * @param address 0x prefixed address(20bytes or 32bytes) or solana address\n */\nexport function addressToBytes32(address: string): Uint8Array {\n if (isSolanaAddress(address)) {\n return new PublicKey(address).toBytes()\n } else if (address.startsWith('0x') && address.length <= 66) {\n return arrayify(hexZeroPadTo32(address))\n }\n throw new Error('Invalid address')\n}\n\nconst solanaAddressRegex = /^([1-9A-HJ-NP-Za-km-z]{32,44})$/\n\nexport function isSolanaAddress(address: string): boolean {\n return solanaAddressRegex.test(address)\n}\n","import { PreCrimePeer, PrecrimeConfig, PrecrimeConfigV1, PrecrimeConfigV2 } from '../model'\n\nimport { trim0x } from './hex'\n\nconst CONFIG_VERSION_OFFSET = 0\nconst MAX_BATCH_SIZE_OFFSET = 2\nconst NUMBER_OF_PEERS_OFFSET = 10\nconst PEERS_OFFSET = 12\n\nexport function parsePrecrimeConfig(precrimeConfig: string): PrecrimeConfig {\n const data = trim0x(precrimeConfig)\n const version = parseInt(data.slice(0, 4), 16)\n if (version === 1) {\n return parsePrecrimeConfigV1(precrimeConfig)\n } else if (version === 2) {\n return parsePrecrimeConfigV2(precrimeConfig)\n }\n throw new Error(`Unsupported precrime config version: ${version}`)\n}\n\nfunction parsePrecrimeConfigV1(precrimeConfig: string): PrecrimeConfigV1 {\n const data = trim0x(precrimeConfig)\n const version = parseInt(data.slice(0, 4), 16)\n const maxBatchSize = parseInt(data.slice(4, 20), 16)\n const remoteChainsLength = parseInt(data.slice(20, 84), 16)\n const remoteChainsBytes = data.slice(84, 84 + remoteChainsLength * 64)\n const remoteAddressesBytes = data.slice(\n 84 + remoteChainsLength * 64,\n 84 + remoteChainsLength * 64 + remoteChainsLength * 64\n )\n\n const remoteChainsBytesArray: number[] = []\n const remoteAddressesBytesArray: string[] = []\n let start = 0\n let end = 64\n for (let i = 0; i < remoteChainsLength; i++) {\n remoteChainsBytesArray.push(parseInt(remoteChainsBytes.slice(start, end), 16))\n remoteAddressesBytesArray.push(`0x${remoteAddressesBytes.slice(start, end)}`)\n start += 64\n end += 64\n }\n return { version, maxBatchSize, remoteEids: remoteChainsBytesArray, remoteAddresses: remoteAddressesBytesArray }\n}\n\nfunction parsePrecrimeConfigV2(precrimeConfig: string): PrecrimeConfigV2 {\n const buffer = Buffer.from(trim0x(precrimeConfig), 'hex')\n const version = buffer.readUInt16BE(CONFIG_VERSION_OFFSET)\n const maxBatchSize = buffer.readBigUint64BE(MAX_BATCH_SIZE_OFFSET)\n const peers = new Array<PreCrimePeer>()\n if (buffer.length > NUMBER_OF_PEERS_OFFSET) {\n const numOfPeers = buffer.readUInt16BE(NUMBER_OF_PEERS_OFFSET)\n for (let i = 0; i < numOfPeers; i++) {\n const offset = PEERS_OFFSET + i * (4 + 2 * 32)\n const eid = buffer.readUInt32BE(offset)\n const preCrimeAddress = '0x' + buffer.slice(offset + 4, offset + 4 + 32).toString('hex')\n const oappAddress = '0x' + buffer.slice(offset + 4 + 32, offset + 4 + 32 + 32).toString('hex')\n peers.push({\n eid,\n preCrimeAddress,\n oappAddress,\n })\n }\n }\n return {\n version,\n maxBatchSize,\n peers,\n }\n}\n","import { ethers } from 'ethers'\n\nexport const parseError = (\n errorData: string,\n intf?: ethers.utils.Interface\n): ReturnType<ethers.utils.Interface['parseError']> | string | undefined => {\n const buildInError = parseBuildInError(errorData)\n if (buildInError !== undefined) {\n return buildInError\n }\n\n if (intf) {\n try {\n return intf.parseError(errorData)\n } catch (e) {\n console.error(e)\n }\n }\n}\n\nfunction parseBuildInError(errorData: string): string | undefined {\n if (errorData.startsWith('0x08c379a0')) {\n // decode Error(string)\n\n const content = `0x${errorData.substring(10)}`\n const reason = ethers.utils.defaultAbiCoder.decode(['string'], content)\n\n return reason[0] // reason: string; for standard revert error string\n }\n\n if (errorData.startsWith('0x4e487b71')) {\n // decode Panic(uint)\n const content = `0x${errorData.substring(10)}`\n const code = ethers.utils.defaultAbiCoder.decode(['uint'], content)\n\n return code[0]\n }\n\n if (errorData === '0x') {\n return ''\n }\n}\n","import { ethers } from 'ethers'\nimport invariant from 'tiny-invariant'\n\nimport { hexZeroPadTo32, trim0x } from '../utils'\n\n// gasLimit input type\nexport type GasLimit = string | number | bigint\n\n// native drop input type\nexport type NativeDrop = string | number | bigint\n\n/**\n * Enumerates the supported option types.\n */\nexport enum OptionType {\n /**\n * Allows the specification of the gas allowance for the remote executor transaction, measured in destination gas\n * units.\n *\n * Format:\n * bytes [2 32 ]\n * fields [type extraGas]\n */\n TYPE_1 = 1,\n\n /**\n * Combines the functionality of TYPE_1 along with destination gas drop to a remote address.\n *\n * Format:\n * bytes [2 32 32 bytes[] ]\n * fields [type extraGas dstNativeAmt dstNativeAddress]\n */\n TYPE_2 = 2,\n\n /**\n * EndpointV2 specific options.\n */\n TYPE_3 = 3,\n}\n\nconst MAX_UINT_128 = ethers.BigNumber.from('0xffffffffffffffffffffffffffffffff')\n\n/**\n * Builds OptionsType.TYPE_1.\n *\n * @param {GasLimit} _extraGas The gas allowance for the remote executor transaction, measured in destination gas units.\n */\nexport function optionsType1(_extraGas: GasLimit): string {\n const extraGas = ethers.BigNumber.from(_extraGas)\n invariant(extraGas.lte(MAX_UINT_128), 'extraGas should be less than MAX_UINT_128')\n return ethers.utils.solidityPack(['uint16', 'uint256'], [OptionType.TYPE_1, extraGas])\n}\n\n/**\n * Builds OptionsType.TYPE_2.\n *\n * @param {GasLimit} _extraGas The gas allowance for the remote executor transaction, measured in destination gas units.\n * @param {NativeDrop} _dstNativeAmt The amount of native token to be sent to the destination chain.\n * @param {string} _dstNativeAddress The destination address of _dstNativeAmt.\n */\nexport function optionsType2(_extraGas: GasLimit, _dstNativeAmt: NativeDrop, _dstNativeAddress: string): string {\n const extraGas = ethers.BigNumber.from(_extraGas)\n invariant(extraGas.lte(MAX_UINT_128), 'extraGas should be less than MAX_UINT_128')\n const dstNativeAmt = ethers.BigNumber.from(_dstNativeAmt)\n invariant(dstNativeAmt.lte(MAX_UINT_128), 'dstNativeAmt should be less than MAX_UINT_128')\n return ethers.utils.solidityPack(\n ['uint16', 'uint256', 'uint256', 'bytes'],\n [OptionType.TYPE_2, ethers.BigNumber.from(extraGas), ethers.BigNumber.from(dstNativeAmt), _dstNativeAddress]\n )\n}\n\n/**\n * Enumerates the supported worker IDs.\n */\nexport enum WorkerId {\n EXECUTOR = 1,\n VERIFIER = 2,\n TREASURY = 255,\n}\n\nexport type WorkerOptions = {\n workerId: number // uint8\n options: Option[] // toBytes: num(uint8),[type(uint8),size(uint16),data],[type(uint8),size(uint16),data],[type(uint8),size(uint16),data]...\n}\n\nexport type Option = {\n type: number // uint8\n params: string // bytes\n}\n\nexport type VerifierOption = Option & {\n index: number // uint8\n}\n\n/**\n * Enumerates the supported executor option types.\n */\nexport enum ExecutorOptionType {\n LZ_RECEIVE = 1,\n NATIVE_DROP = 2,\n COMPOSE = 3,\n ORDERED = 4,\n}\n\n/**\n * Enumerates the supported verifier option types.\n */\nexport enum VerifierOptionType {\n PRECRIME = 1,\n}\n\n/**\n * Options builder, available only for EndpointV2.\n */\nexport class Options {\n protected workerOptions: WorkerOptions[] = []\n\n // dissuade public instantiation\n protected constructor() {}\n\n /**\n * Create a new options instance.\n */\n public static newOptions(): Options {\n return new Options()\n }\n\n /**\n * Create an options instance from a hex string.\n * @param {string} optionsHex The hex string to decode.\n */\n public static fromOptions(optionsHex: string): Options {\n const options = new Options()\n const optionsBytes = ethers.utils.arrayify(optionsHex)\n // 0-2 bytes is options type\n const optionsType = ethers.BigNumber.from(optionsBytes.slice(0, 2)).toNumber()\n if (optionsType === OptionType.TYPE_3) {\n let cursor = 2\n while (cursor < optionsBytes.byteLength) {\n const workerId = ethers.BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n\n const size = ethers.BigNumber.from(optionsBytes.slice(cursor, cursor + 2)).toNumber()\n cursor += 2\n\n if (workerId === WorkerId.EXECUTOR) {\n const optionType = ethers.BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n const params = optionsBytes.slice(cursor, cursor + size - 1)\n cursor += size - 1\n options.addOption(workerId, { type: optionType, params: ethers.utils.hexlify(params) })\n } else if (workerId === WorkerId.VERIFIER) {\n const verifierIdx = ethers.BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n const optionType = ethers.BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n const params = optionsBytes.slice(cursor, cursor + size - 2)\n cursor += size - 2\n options.addOption(workerId, <VerifierOption>{\n type: optionType,\n index: verifierIdx,\n params: ethers.utils.hexlify(params),\n })\n }\n // TODO - other workerId\n }\n } else if (optionsType === OptionType.TYPE_2) {\n const extraGas = ethers.BigNumber.from(optionsBytes.slice(2, 34)).toBigInt()\n const dstNativeAmt = ethers.BigNumber.from(optionsBytes.slice(34, 66)).toBigInt()\n const dstNativeAddress = ethers.utils.hexlify(optionsBytes.slice(66, optionsBytes.byteLength))\n options.addExecutorLzReceiveOption(extraGas).addExecutorNativeDropOption(dstNativeAmt, dstNativeAddress)\n } else if (optionsType === OptionType.TYPE_1) {\n const extraGas = ethers.BigNumber.from(optionsBytes.slice(2, 34)).toBigInt()\n options.addExecutorLzReceiveOption(extraGas)\n }\n\n return options\n }\n\n /**\n * Add ExecutorOptionType.LZ_RECEIVE option.\n * @param {GasLimit} gasLimit\n * @param {NativeDrop} nativeDrop\n */\n public addExecutorLzReceiveOption(gasLimit: GasLimit, nativeDrop: NativeDrop = 0): Options {\n const gasLimitBN = ethers.BigNumber.from(gasLimit)\n invariant(gasLimitBN.lte(MAX_UINT_128), \"gasLimit shouldn't be greater than MAX_UINT_128\")\n const nativeDropBN = ethers.BigNumber.from(nativeDrop)\n invariant(nativeDropBN.lte(MAX_UINT_128), \"value shouldn't be greater than MAX_UINT_128\")\n this.addOption(WorkerId.EXECUTOR, {\n type: ExecutorOptionType.LZ_RECEIVE,\n params: nativeDropBN.eq(0)\n ? ethers.utils.solidityPack(['uint128'], [gasLimitBN])\n : ethers.utils.solidityPack(['uint128', 'uint128'], [gasLimitBN, nativeDropBN]),\n })\n return this\n }\n\n /**\n * Add ExecutorOptionType.NATIVE_DROP option.\n * @param {NativeDrop} nativeDrop\n * @param {string} receiver\n */\n public addExecutorNativeDropOption(nativeDrop: NativeDrop, receiver: string): Options {\n const amountBN = ethers.BigNumber.from(nativeDrop)\n invariant(amountBN.lte(MAX_UINT_128), \"nativeDrop shouldn't be greater than MAX_UINT_128\")\n this.addOption(WorkerId.EXECUTOR, {\n type: ExecutorOptionType.NATIVE_DROP,\n params: ethers.utils.solidityPack(['uint128', 'bytes32'], [amountBN, hexZeroPadTo32(receiver)]),\n })\n return this\n }\n\n /**\n * Add ExecutorOptionType.COMPOSE option.\n * @param {number} index\n * @param {GasLimit} gasLimit\n * @param {NativeDrop} nativeDrop\n */\n public addExecutorComposeOption(index: number, gasLimit: GasLimit, nativeDrop: NativeDrop = 0): Options {\n const gasLimitBN = ethers.BigNumber.from(gasLimit)\n invariant(gasLimitBN.lte(MAX_UINT_128), \"gasLimit shouldn't be greater than MAX_UINT_128\")\n const nativeDropBN = ethers.BigNumber.from(nativeDrop)\n invariant(nativeDropBN.lte(MAX_UINT_128), \"nativeDrop shouldn't be greater than MAX_UINT_128\")\n const option = nativeDropBN.gt(0)\n ? {\n type: ExecutorOptionType.COMPOSE,\n params: ethers.utils.solidityPack(\n ['uint16', 'uint128', 'uint128'],\n [index, gasLimitBN, nativeDropBN]\n ),\n }\n : {\n type: ExecutorOptionType.COMPOSE,\n params: ethers.utils.solidityPack(['uint16', 'uint128'], [index, gasLimitBN]),\n }\n\n this.addOption(WorkerId.EXECUTOR, option)\n return this\n }\n\n /**\n * Add ExecutorOptionType.ORDERED option.\n */\n public addExecutorOrderedExecutionOption(): Options {\n this.addOption(WorkerId.EXECUTOR, {\n type: ExecutorOptionType.ORDERED,\n params: '0x',\n })\n return this\n }\n\n /**\n * Add VerifierOptionType.PRECRIME option.\n * @param {number} verifierIdx\n */\n public addVerifierPrecrimeOption(verifierIdx: number): Options {\n this.addOption(WorkerId.VERIFIER, <VerifierOption>{\n type: VerifierOptionType.PRECRIME,\n index: verifierIdx,\n params: '0x',\n })\n return this\n }\n\n /**\n * Serialize Options to hex string.\n */\n public toHex(): string {\n // output encoded hex, type(uint16)\n let hex = ethers.utils.solidityPack(['uint16'], [OptionType.TYPE_3])\n this.workerOptions.forEach((w) => {\n for (const option of w.options) {\n if (w.workerId === WorkerId.EXECUTOR) {\n hex += trim0x(\n ethers.utils.solidityPack(\n ['uint8', 'uint16', 'uint8', 'bytes'],\n [w.workerId, trim0x(option.params).length / 2 + 1, option.type, option.params]\n )\n )\n } else if (w.workerId === WorkerId.VERIFIER) {\n const verifierOption = option as VerifierOption\n hex += trim0x(\n ethers.utils.solidityPack(\n ['uint8', 'uint16', 'uint8', 'uint8', 'bytes'],\n [\n w.workerId,\n trim0x(option.params).length / 2 + 2,\n verifierOption.index,\n verifierOption.type,\n verifierOption.params,\n ]\n )\n )\n }\n // TODO other workerId\n }\n })\n return hex\n }\n\n /**\n * Serialize Options to Uint8Array.\n */\n public toBytes(): Uint8Array {\n return ethers.utils.arrayify(this.toHex())\n }\n\n private addOption(workerId: number, option: Option): void {\n const worker = this.workerOptions.find((w) => w.workerId === workerId)\n if (worker) {\n worker.options.push(option)\n } else {\n this.workerOptions.push({ workerId, options: [option] })\n }\n }\n\n /**\n * Decode ExecutorOptionType.LZ_RECEIVE option. Returns undefined if the option is not present.\n */\n public decodeExecutorLzReceiveOption(): { gas: bigint; value: bigint } | undefined {\n const options = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.LZ_RECEIVE) as Option[]\n if (!options || options.length === 0) {\n return\n }\n let totalGas = ethers.BigNumber.from(0).toBigInt()\n let totalValue = ethers.BigNumber.from(0).toBigInt()\n for (const option of options) {\n const buffer = Buffer.from(trim0x(option.params), 'hex')\n const gas = ethers.BigNumber.from(buffer.subarray(0, 16)).toBigInt()\n if (buffer.length === 16) {\n return { gas, value: ethers.BigNumber.from(0).toBigInt() }\n }\n const value = ethers.BigNumber.from(buffer.subarray(16, 32)).toBigInt()\n totalGas = totalGas + gas\n totalValue = totalValue + value\n }\n\n return { gas: totalGas, value: totalValue }\n }\n\n /**\n * Decode ExecutorOptionType.NATIVE_DROP options. Returns undefined if the options is not present.\n */\n public decodeExecutorNativeDropOption(): { amount: bigint; receiver: string }[] {\n const options = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.NATIVE_DROP) as Option[]\n if (!options || options.length === 0) {\n return []\n }\n\n const results = options.reduce((acc: { [key: string]: { amount: bigint; receiver: string } }, cur: Option) => {\n const buffer = Buffer.from(trim0x(cur.params), 'hex')\n const amount = ethers.BigNumber.from(buffer.subarray(0, 16)).toBigInt()\n const receiver = ethers.utils.hexlify(buffer.subarray(16, 48))\n if (acc[receiver]) {\n acc[receiver]['amount'] = acc[receiver].amount + amount\n } else {\n acc[receiver] = { amount, receiver }\n }\n return acc\n }, {})\n return Object.values(results)\n }\n\n /**\n * Decode ExecutorOptionType.COMPOSE options. Returns undefined if the options is not present.\n */\n public decodeExecutorComposeOption(): { index: number; gas: bigint; value: bigint }[] {\n const options = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.COMPOSE) as Option[]\n if (!options || options.length === 0) {\n return []\n }\n const results = options.reduce(\n (acc: { [key: number]: { index: number; gas: bigint; value: bigint } }, cur: Option) => {\n const buffer = Buffer.from(trim0x(cur.params), 'hex')\n const index = ethers.BigNumber.from(buffer.subarray(0, 2)).toNumber()\n const gas = ethers.BigNumber.from(buffer.subarray(2, 18)).toBigInt()\n const value = (\n buffer.length === 34 ? ethers.BigNumber.from(buffer.subarray(18, 34)) : ethers.BigNumber.from(0)\n ).toBigInt()\n if (acc[index]) {\n acc[index]['gas'] = acc[index].gas + gas\n acc[index]['value'] = acc[index].value + value\n } else {\n acc[index] = { index, gas, value }\n }\n return acc\n },\n {}\n )\n return Object.values(results)\n }\n\n /**\n * Decode ExecutorOptionType.ORDERED options. Returns undefined if the options is not present.\n */\n public decodeExecutorOrderedExecutionOption(): boolean {\n const option = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.ORDERED) as Option\n return option !== undefined\n }\n\n private findOptions(workerId: number, optionType: number): Option[] | Option | undefined {\n const worker = this.workerOptions.find((w) => w.workerId === workerId)\n if (worker) {\n if (optionType === ExecutorOptionType.ORDERED) {\n return worker.options.find((o) => o.type === optionType)\n }\n return worker.options.filter((o) => o.type === optionType)\n }\n }\n\n /**\n * Find VerifierOption by verifierIdx and optionType. Returns undefined if the option is not present.\n * @param {number} verifierIdx\n * @param {number} optionType\n */\n public findVerifierOption(verifierIdx: number, optionType: number): VerifierOption | undefined {\n const worker = this.workerOptions.find((w) => w.workerId === WorkerId.VERIFIER)\n if (worker) {\n const opt = worker.options.find((o) => o.type === optionType && (o as VerifierOption).index === verifierIdx)\n if (opt) {\n return opt as VerifierOption\n }\n }\n }\n}\n","export type PacketPath = {\n srcEid: number\n sender: string\n dstEid: number\n receiver: string\n}\n\nexport type PacketHeader = {\n version: number\n nonce: string\n} & PacketPath\n\nexport type Packet = PacketHeader & {\n guid: string\n message: string\n // derived\n payload: string // payload = guid + message\n}\n\n// message origin\nexport type MessageOrigin = {\n srcEid: number\n sender: string\n nonce: string\n}\n\nexport function packetToMessageOrigin(packet: Packet): MessageOrigin {\n return {\n srcEid: packet.srcEid,\n sender: packet.sender,\n nonce: packet.nonce,\n }\n}\n","import { ethers } from 'ethers'\n\nimport { Packet, PacketHeader } from '../model'\nimport { addressToBytes32, bytes32ToEthAddress, hexZeroPadTo32, trim0x } from '../utils'\n\n// header (version + path + guid)\n// version\nconst PACKET_VERSION_OFFSET = 0\n// nonce\nconst NONCE_OFFSET = 1\n// path\nconst SRC_CHAIN_OFFSET = 9\nconst SRC_ADDRESS_OFFSET = 13\nconst DST_CHAIN_OFFSET = 45\nconst DST_ADDRESS_OFFSET = 49\n// payload (guid + message)\nconst GUID_OFFSET = 81 // keccak256(nonce + path)\nconst MESSAGE_OFFSET = 113\n\nexport class PacketV1Codec {\n buffer: Buffer\n\n static from(payloadEncoded: string): PacketV1Codec {\n return new PacketV1Codec(payloadEncoded)\n }\n\n static fromBytes(payload: Uint8Array): PacketV1Codec {\n return new PacketV1Codec('0x' + Buffer.from(payload).toString('hex'))\n }\n\n protected constructor(payloadEncoded: string) {\n this.buffer = Buffer.from(trim0x(payloadEncoded), 'hex')\n }\n\n /**\n * encode packet to hex string\n */\n static encode(packet: Packet): string {\n const message = trim0x(packet.message)\n const buffer = Buffer.alloc(MESSAGE_OFFSET + message.length / 2)\n buffer.writeUInt8(packet.version, PACKET_VERSION_OFFSET)\n buffer.writeBigUInt64BE(BigInt(packet.nonce), NONCE_OFFSET)\n buffer.writeUInt32BE(packet.srcEid, SRC_CHAIN_OFFSET)\n buffer.write(trim0x(hexZeroPadTo32(packet.sender)), SRC_ADDRESS_OFFSET, 32, 'hex')\n buffer.writeUInt32BE(packet.dstEid, DST_CHAIN_OFFSET)\n buffer.write(trim0x(hexZeroPadTo32(packet.receiver)), DST_ADDRESS_OFFSET, 32, 'hex')\n buffer.write(trim0x(packet.guid), GUID_OFFSET, 32, 'hex')\n buffer.write(message, MESSAGE_OFFSET, message.length / 2, 'hex')\n return '0x' + buffer.toString('hex')\n }\n\n version(): number {\n return this.buffer.readUInt8(PACKET_VERSION_OFFSET)\n }\n\n nonce(): string {\n return this.buffer.readBigUint64BE(NONCE_OFFSET).toString()\n }\n\n srcEid(): number {\n return this.buffer.readUint32BE(SRC_CHAIN_OFFSET)\n }\n\n sender(): string {\n return '0x' + this.buffer.slice(SRC_ADDRESS_OFFSET, DST_CHAIN_OFFSET).toString('hex')\n }\n\n senderAddressB20(): string {\n return bytes32ToEthAddress(this.sender())\n }\n\n dstEid(): number {\n return this.buffer.readUint32BE(DST_CHAIN_OFFSET)\n }\n\n receiver(): string {\n return '0x' + this.buffer.slice(DST_ADDRESS_OFFSET, GUID_OFFSET).toString('hex')\n }\n\n receiverAddressB20(): string {\n return bytes32ToEthAddress(this.receiver())\n }\n\n guid(): string {\n return '0x' + this.buffer.slice(GUID_OFFSET, MESSAGE_OFFSET).toString('hex')\n }\n\n message(): string {\n return '0x' + this.buffer.slice(MESSAGE_OFFSET).toString('hex')\n }\n\n payloadHash(): string {\n return keccak256(this.payload())\n }\n\n payload(): string {\n return '0x' + this.buffer.slice(GUID_OFFSET).toString('hex')\n }\n\n header(): string {\n return '0x' + this.buffer.slice(0, GUID_OFFSET).toString('hex')\n }\n\n headerHash(): string {\n return keccak256(this.header())\n }\n\n /**\n * deserialize packet from hex string\n * @deprecated use toPacket instead\n */\n decode(): Packet {\n return this.toPacket()\n }\n\n toPacket(): Packet {\n return {\n version: this.version(),\n nonce: this.nonce(),\n srcEid: this.srcEid(),\n sender: this.sender(),\n dstEid: this.dstEid(),\n receiver: this.receiver(),\n guid: this.guid(),\n message: this.message(),\n // derived\n payload: this.payload(),\n }\n }\n}\n\nexport function calculateGuid(packetHead: PacketHeader): string {\n return keccak256(\n ethers.utils.solidityPack(\n ['uint64', 'uint32', 'bytes32', 'uint32', 'bytes32'],\n [\n ethers.BigNumber.from(packetHead.nonce),\n packetHead.srcEid,\n addressToBytes32(packetHead.sender),\n packetHead.dstEid,\n addressToBytes32(packetHead.receiver),\n ]\n )\n )\n}\n\nexport function keccak256(message: string): string {\n return ethers.utils.keccak256(message)\n}\n","import { Packet } from '../model'\n\nimport { PacketV1Codec } from './packet-v1-codec'\n\nexport class PacketSerializer {\n static serialize(packet: Packet): string {\n return PacketV1Codec.encode(packet)\n }\n\n static deserialize(bytesLike: Uint8Array | string): Packet {\n let codec: PacketV1Codec\n if (bytesLike instanceof Uint8Array) {\n codec = PacketV1Codec.fromBytes(bytesLike)\n } else {\n codec = PacketV1Codec.from(bytesLike)\n }\n return codec.toPacket()\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/utils.ts","../src/utils/hex.ts","../src/utils/precrime.ts","../src/utils/parse-error.ts","../src/options/options.ts","../src/model/packet.ts","../src/codec/packet-v1-codec.ts","../src/codec/packet-serializer.ts"],"names":["arrayify","hexlify","OptionType","WorkerId","ExecutorOptionType","VerifierOptionType","BigNumber","solidityPack","keccak256"],"mappings":"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","sourcesContent":["export async function sleep(timeout: number) {\n await new Promise((resolve) => setTimeout(resolve, timeout))\n}\n","import { getAddress } from '@ethersproject/address'\nimport { arrayify, hexZeroPad, hexlify } from '@ethersproject/bytes'\nimport { PublicKey } from '@solana/web3.js'\n\nexport function hexZeroPadTo32(addr: string): string {\n return hexZeroPad(addr, 32)\n}\n\nexport function bytes32ToEthAddress(bytes32: string | Uint8Array): string {\n if (bytes32 instanceof Uint8Array) {\n bytes32 = hexlify(bytes32)\n }\n return getAddress(bytes32.slice(-40))\n}\n\nexport function trim0x(str: string): string {\n return str.replace(/^0x/, '')\n}\n\n/**\n * Convert address to bytes32\n * @param address 0x prefixed address(20bytes or 32bytes) or solana address\n */\nexport function addressToBytes32(address: string): Uint8Array {\n if (isSolanaAddress(address)) {\n return new PublicKey(address).toBytes()\n } else if (address.startsWith('0x') && address.length <= 66) {\n return arrayify(hexZeroPadTo32(address))\n }\n throw new Error('Invalid address')\n}\n\nconst solanaAddressRegex = /^([1-9A-HJ-NP-Za-km-z]{32,44})$/\n\nexport function isSolanaAddress(address: string): boolean {\n return solanaAddressRegex.test(address)\n}\n","import { PreCrimePeer, PrecrimeConfig, PrecrimeConfigV1, PrecrimeConfigV2 } from '../model'\n\nimport { trim0x } from './hex'\n\nconst CONFIG_VERSION_OFFSET = 0\nconst MAX_BATCH_SIZE_OFFSET = 2\nconst NUMBER_OF_PEERS_OFFSET = 10\nconst PEERS_OFFSET = 12\n\nexport function parsePrecrimeConfig(precrimeConfig: string): PrecrimeConfig {\n const data = trim0x(precrimeConfig)\n const version = parseInt(data.slice(0, 4), 16)\n if (version === 1) {\n return parsePrecrimeConfigV1(precrimeConfig)\n } else if (version === 2) {\n return parsePrecrimeConfigV2(precrimeConfig)\n }\n throw new Error(`Unsupported precrime config version: ${version}`)\n}\n\nfunction parsePrecrimeConfigV1(precrimeConfig: string): PrecrimeConfigV1 {\n const data = trim0x(precrimeConfig)\n const version = parseInt(data.slice(0, 4), 16)\n const maxBatchSize = parseInt(data.slice(4, 20), 16)\n const remoteChainsLength = parseInt(data.slice(20, 84), 16)\n const remoteChainsBytes = data.slice(84, 84 + remoteChainsLength * 64)\n const remoteAddressesBytes = data.slice(\n 84 + remoteChainsLength * 64,\n 84 + remoteChainsLength * 64 + remoteChainsLength * 64\n )\n\n const remoteChainsBytesArray: number[] = []\n const remoteAddressesBytesArray: string[] = []\n let start = 0\n let end = 64\n for (let i = 0; i < remoteChainsLength; i++) {\n remoteChainsBytesArray.push(parseInt(remoteChainsBytes.slice(start, end), 16))\n remoteAddressesBytesArray.push(`0x${remoteAddressesBytes.slice(start, end)}`)\n start += 64\n end += 64\n }\n return { version, maxBatchSize, remoteEids: remoteChainsBytesArray, remoteAddresses: remoteAddressesBytesArray }\n}\n\nfunction parsePrecrimeConfigV2(precrimeConfig: string): PrecrimeConfigV2 {\n const buffer = Buffer.from(trim0x(precrimeConfig), 'hex')\n const version = buffer.readUInt16BE(CONFIG_VERSION_OFFSET)\n const maxBatchSize = buffer.readBigUint64BE(MAX_BATCH_SIZE_OFFSET)\n const peers = new Array<PreCrimePeer>()\n if (buffer.length > NUMBER_OF_PEERS_OFFSET) {\n const numOfPeers = buffer.readUInt16BE(NUMBER_OF_PEERS_OFFSET)\n for (let i = 0; i < numOfPeers; i++) {\n const offset = PEERS_OFFSET + i * (4 + 2 * 32)\n const eid = buffer.readUInt32BE(offset)\n const preCrimeAddress = '0x' + buffer.slice(offset + 4, offset + 4 + 32).toString('hex')\n const oappAddress = '0x' + buffer.slice(offset + 4 + 32, offset + 4 + 32 + 32).toString('hex')\n peers.push({\n eid,\n preCrimeAddress,\n oappAddress,\n })\n }\n }\n return {\n version,\n maxBatchSize,\n peers,\n }\n}\n","import { type Interface, defaultAbiCoder } from '@ethersproject/abi'\n\nexport const parseError = (\n errorData: string,\n intf?: Interface\n): ReturnType<Interface['parseError']> | string | undefined => {\n const buildInError = parseBuildInError(errorData)\n if (buildInError !== undefined) {\n return buildInError\n }\n\n if (intf) {\n try {\n return intf.parseError(errorData)\n } catch (e) {\n console.error(e)\n }\n }\n}\n\nfunction parseBuildInError(errorData: string): string | undefined {\n if (errorData.startsWith('0x08c379a0')) {\n // decode Error(string)\n\n const content = `0x${errorData.substring(10)}`\n const reason = defaultAbiCoder.decode(['string'], content)\n\n return reason[0] // reason: string; for standard revert error string\n }\n\n if (errorData.startsWith('0x4e487b71')) {\n // decode Panic(uint)\n const content = `0x${errorData.substring(10)}`\n const code = defaultAbiCoder.decode(['uint'], content)\n\n return code[0]\n }\n\n if (errorData === '0x') {\n return ''\n }\n}\n","import { BigNumber } from '@ethersproject/bignumber'\nimport { arrayify, hexlify } from '@ethersproject/bytes'\nimport { pack as solidityPack } from '@ethersproject/solidity'\nimport invariant from 'tiny-invariant'\n\nimport { hexZeroPadTo32, trim0x } from '../utils'\n\n// gasLimit input type\nexport type GasLimit = string | number | bigint\n\n// native drop input type\nexport type NativeDrop = string | number | bigint\n\n/**\n * Enumerates the supported option types.\n */\nexport enum OptionType {\n /**\n * Allows the specification of the gas allowance for the remote executor transaction, measured in destination gas\n * units.\n *\n * Format:\n * bytes [2 32 ]\n * fields [type extraGas]\n */\n TYPE_1 = 1,\n\n /**\n * Combines the functionality of TYPE_1 along with destination gas drop to a remote address.\n *\n * Format:\n * bytes [2 32 32 bytes[] ]\n * fields [type extraGas dstNativeAmt dstNativeAddress]\n */\n TYPE_2 = 2,\n\n /**\n * EndpointV2 specific options.\n */\n TYPE_3 = 3,\n}\n\nconst MAX_UINT_128 = BigNumber.from('0xffffffffffffffffffffffffffffffff')\n\n/**\n * Builds OptionsType.TYPE_1.\n *\n * @param {GasLimit} _extraGas The gas allowance for the remote executor transaction, measured in destination gas units.\n */\nexport function optionsType1(_extraGas: GasLimit): string {\n const extraGas = BigNumber.from(_extraGas)\n invariant(extraGas.lte(MAX_UINT_128), 'extraGas should be less than MAX_UINT_128')\n return solidityPack(['uint16', 'uint256'], [OptionType.TYPE_1, extraGas])\n}\n\n/**\n * Builds OptionsType.TYPE_2.\n *\n * @param {GasLimit} _extraGas The gas allowance for the remote executor transaction, measured in destination gas units.\n * @param {NativeDrop} _dstNativeAmt The amount of native token to be sent to the destination chain.\n * @param {string} _dstNativeAddress The destination address of _dstNativeAmt.\n */\nexport function optionsType2(_extraGas: GasLimit, _dstNativeAmt: NativeDrop, _dstNativeAddress: string): string {\n const extraGas = BigNumber.from(_extraGas)\n invariant(extraGas.lte(MAX_UINT_128), 'extraGas should be less than MAX_UINT_128')\n const dstNativeAmt = BigNumber.from(_dstNativeAmt)\n invariant(dstNativeAmt.lte(MAX_UINT_128), 'dstNativeAmt should be less than MAX_UINT_128')\n return solidityPack(\n ['uint16', 'uint256', 'uint256', 'bytes'],\n [OptionType.TYPE_2, BigNumber.from(extraGas), BigNumber.from(dstNativeAmt), _dstNativeAddress]\n )\n}\n\n/**\n * Enumerates the supported worker IDs.\n */\nexport enum WorkerId {\n EXECUTOR = 1,\n VERIFIER = 2,\n TREASURY = 255,\n}\n\nexport type WorkerOptions = {\n workerId: number // uint8\n options: Option[] // toBytes: num(uint8),[type(uint8),size(uint16),data],[type(uint8),size(uint16),data],[type(uint8),size(uint16),data]...\n}\n\nexport type Option = {\n type: number // uint8\n params: string // bytes\n}\n\nexport type VerifierOption = Option & {\n index: number // uint8\n}\n\n/**\n * Enumerates the supported executor option types.\n */\nexport enum ExecutorOptionType {\n LZ_RECEIVE = 1,\n NATIVE_DROP = 2,\n COMPOSE = 3,\n ORDERED = 4,\n}\n\n/**\n * Enumerates the supported verifier option types.\n */\nexport enum VerifierOptionType {\n PRECRIME = 1,\n}\n\n/**\n * Options builder, available only for EndpointV2.\n */\nexport class Options {\n protected workerOptions: WorkerOptions[] = []\n\n // dissuade public instantiation\n protected constructor() {}\n\n /**\n * Create a new options instance.\n */\n public static newOptions(): Options {\n return new Options()\n }\n\n /**\n * Create an options instance from a hex string.\n * @param {string} optionsHex The hex string to decode.\n */\n public static fromOptions(optionsHex: string): Options {\n const options = new Options()\n const optionsBytes = arrayify(optionsHex)\n // 0-2 bytes is options type\n const optionsType = BigNumber.from(optionsBytes.slice(0, 2)).toNumber()\n if (optionsType === OptionType.TYPE_3) {\n let cursor = 2\n while (cursor < optionsBytes.byteLength) {\n const workerId = BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n\n const size = BigNumber.from(optionsBytes.slice(cursor, cursor + 2)).toNumber()\n cursor += 2\n\n if (workerId === WorkerId.EXECUTOR) {\n const optionType = BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n const params = optionsBytes.slice(cursor, cursor + size - 1)\n cursor += size - 1\n options.addOption(workerId, { type: optionType, params: hexlify(params) })\n } else if (workerId === WorkerId.VERIFIER) {\n const verifierIdx = BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n const optionType = BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n const params = optionsBytes.slice(cursor, cursor + size - 2)\n cursor += size - 2\n options.addOption(workerId, <VerifierOption>{\n type: optionType,\n index: verifierIdx,\n params: hexlify(params),\n })\n }\n // TODO - other workerId\n }\n } else if (optionsType === OptionType.TYPE_2) {\n const extraGas = BigNumber.from(optionsBytes.slice(2, 34)).toBigInt()\n const dstNativeAmt = BigNumber.from(optionsBytes.slice(34, 66)).toBigInt()\n const dstNativeAddress = hexlify(optionsBytes.slice(66, optionsBytes.byteLength))\n options.addExecutorLzReceiveOption(extraGas).addExecutorNativeDropOption(dstNativeAmt, dstNativeAddress)\n } else if (optionsType === OptionType.TYPE_1) {\n const extraGas = BigNumber.from(optionsBytes.slice(2, 34)).toBigInt()\n options.addExecutorLzReceiveOption(extraGas)\n }\n\n return options\n }\n\n /**\n * Add ExecutorOptionType.LZ_RECEIVE option.\n * @param {GasLimit} gasLimit\n * @param {NativeDrop} nativeDrop\n */\n public addExecutorLzReceiveOption(gasLimit: GasLimit, nativeDrop: NativeDrop = 0): Options {\n const gasLimitBN = BigNumber.from(gasLimit)\n invariant(gasLimitBN.lte(MAX_UINT_128), \"gasLimit shouldn't be greater than MAX_UINT_128\")\n const nativeDropBN = BigNumber.from(nativeDrop)\n invariant(nativeDropBN.lte(MAX_UINT_128), \"value shouldn't be greater than MAX_UINT_128\")\n this.addOption(WorkerId.EXECUTOR, {\n type: ExecutorOptionType.LZ_RECEIVE,\n params: nativeDropBN.eq(0)\n ? solidityPack(['uint128'], [gasLimitBN])\n : solidityPack(['uint128', 'uint128'], [gasLimitBN, nativeDropBN]),\n })\n return this\n }\n\n /**\n * Add ExecutorOptionType.NATIVE_DROP option.\n * @param {NativeDrop} nativeDrop\n * @param {string} receiver\n */\n public addExecutorNativeDropOption(nativeDrop: NativeDrop, receiver: string): Options {\n const amountBN = BigNumber.from(nativeDrop)\n invariant(amountBN.lte(MAX_UINT_128), \"nativeDrop shouldn't be greater than MAX_UINT_128\")\n this.addOption(WorkerId.EXECUTOR, {\n type: ExecutorOptionType.NATIVE_DROP,\n params: solidityPack(['uint128', 'bytes32'], [amountBN, hexZeroPadTo32(receiver)]),\n })\n return this\n }\n\n /**\n * Add ExecutorOptionType.COMPOSE option.\n * @param {number} index\n * @param {GasLimit} gasLimit\n * @param {NativeDrop} nativeDrop\n */\n public addExecutorComposeOption(index: number, gasLimit: GasLimit, nativeDrop: NativeDrop = 0): Options {\n const gasLimitBN = BigNumber.from(gasLimit)\n invariant(gasLimitBN.lte(MAX_UINT_128), \"gasLimit shouldn't be greater than MAX_UINT_128\")\n const nativeDropBN = BigNumber.from(nativeDrop)\n invariant(nativeDropBN.lte(MAX_UINT_128), \"nativeDrop shouldn't be greater than MAX_UINT_128\")\n const option = nativeDropBN.gt(0)\n ? {\n type: ExecutorOptionType.COMPOSE,\n params: solidityPack(['uint16', 'uint128', 'uint128'], [index, gasLimitBN, nativeDropBN]),\n }\n : {\n type: ExecutorOptionType.COMPOSE,\n params: solidityPack(['uint16', 'uint128'], [index, gasLimitBN]),\n }\n\n this.addOption(WorkerId.EXECUTOR, option)\n return this\n }\n\n /**\n * Add ExecutorOptionType.ORDERED option.\n */\n public addExecutorOrderedExecutionOption(): Options {\n this.addOption(WorkerId.EXECUTOR, {\n type: ExecutorOptionType.ORDERED,\n params: '0x',\n })\n return this\n }\n\n /**\n * Add VerifierOptionType.PRECRIME option.\n * @param {number} verifierIdx\n */\n public addVerifierPrecrimeOption(verifierIdx: number): Options {\n this.addOption(WorkerId.VERIFIER, <VerifierOption>{\n type: VerifierOptionType.PRECRIME,\n index: verifierIdx,\n params: '0x',\n })\n return this\n }\n\n /**\n * Serialize Options to hex string.\n */\n public toHex(): string {\n // output encoded hex, type(uint16)\n let hex = solidityPack(['uint16'], [OptionType.TYPE_3])\n this.workerOptions.forEach((w) => {\n for (const option of w.options) {\n if (w.workerId === WorkerId.EXECUTOR) {\n hex += trim0x(\n solidityPack(\n ['uint8', 'uint16', 'uint8', 'bytes'],\n [w.workerId, trim0x(option.params).length / 2 + 1, option.type, option.params]\n )\n )\n } else if (w.workerId === WorkerId.VERIFIER) {\n const verifierOption = option as VerifierOption\n hex += trim0x(\n solidityPack(\n ['uint8', 'uint16', 'uint8', 'uint8', 'bytes'],\n [\n w.workerId,\n trim0x(option.params).length / 2 + 2,\n verifierOption.index,\n verifierOption.type,\n verifierOption.params,\n ]\n )\n )\n }\n // TODO other workerId\n }\n })\n return hex\n }\n\n /**\n * Serialize Options to Uint8Array.\n */\n public toBytes(): Uint8Array {\n return arrayify(this.toHex())\n }\n\n private addOption(workerId: number, option: Option): void {\n const worker = this.workerOptions.find((w) => w.workerId === workerId)\n if (worker) {\n worker.options.push(option)\n } else {\n this.workerOptions.push({ workerId, options: [option] })\n }\n }\n\n /**\n * Decode ExecutorOptionType.LZ_RECEIVE option. Returns undefined if the option is not present.\n */\n public decodeExecutorLzReceiveOption(): { gas: bigint; value: bigint } | undefined {\n const options = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.LZ_RECEIVE) as Option[]\n if (!options || options.length === 0) {\n return\n }\n let totalGas = BigNumber.from(0).toBigInt()\n let totalValue = BigNumber.from(0).toBigInt()\n for (const option of options) {\n const buffer = Buffer.from(trim0x(option.params), 'hex')\n const gas = BigNumber.from(buffer.subarray(0, 16)).toBigInt()\n if (buffer.length === 16) {\n return { gas, value: BigNumber.from(0).toBigInt() }\n }\n const value = BigNumber.from(buffer.subarray(16, 32)).toBigInt()\n totalGas = totalGas + gas\n totalValue = totalValue + value\n }\n\n return { gas: totalGas, value: totalValue }\n }\n\n /**\n * Decode ExecutorOptionType.NATIVE_DROP options. Returns undefined if the options is not present.\n */\n public decodeExecutorNativeDropOption(): { amount: bigint; receiver: string }[] {\n const options = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.NATIVE_DROP) as Option[]\n if (!options || options.length === 0) {\n return []\n }\n\n const results = options.reduce((acc: { [key: string]: { amount: bigint; receiver: string } }, cur: Option) => {\n const buffer = Buffer.from(trim0x(cur.params), 'hex')\n const amount = BigNumber.from(buffer.subarray(0, 16)).toBigInt()\n const receiver = hexlify(buffer.subarray(16, 48))\n if (acc[receiver]) {\n acc[receiver]['amount'] = acc[receiver].amount + amount\n } else {\n acc[receiver] = { amount, receiver }\n }\n return acc\n }, {})\n return Object.values(results)\n }\n\n /**\n * Decode ExecutorOptionType.COMPOSE options. Returns undefined if the options is not present.\n */\n public decodeExecutorComposeOption(): { index: number; gas: bigint; value: bigint }[] {\n const options = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.COMPOSE) as Option[]\n if (!options || options.length === 0) {\n return []\n }\n const results = options.reduce(\n (acc: { [key: number]: { index: number; gas: bigint; value: bigint } }, cur: Option) => {\n const buffer = Buffer.from(trim0x(cur.params), 'hex')\n const index = BigNumber.from(buffer.subarray(0, 2)).toNumber()\n const gas = BigNumber.from(buffer.subarray(2, 18)).toBigInt()\n const value = (\n buffer.length === 34 ? BigNumber.from(buffer.subarray(18, 34)) : BigNumber.from(0)\n ).toBigInt()\n if (acc[index]) {\n acc[index]['gas'] = acc[index].gas + gas\n acc[index]['value'] = acc[index].value + value\n } else {\n acc[index] = { index, gas, value }\n }\n return acc\n },\n {}\n )\n return Object.values(results)\n }\n\n /**\n * Decode ExecutorOptionType.ORDERED options. Returns undefined if the options is not present.\n */\n public decodeExecutorOrderedExecutionOption(): boolean {\n const option = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.ORDERED) as Option\n return option !== undefined\n }\n\n private findOptions(workerId: number, optionType: number): Option[] | Option | undefined {\n const worker = this.workerOptions.find((w) => w.workerId === workerId)\n if (worker) {\n if (optionType === ExecutorOptionType.ORDERED) {\n return worker.options.find((o) => o.type === optionType)\n }\n return worker.options.filter((o) => o.type === optionType)\n }\n }\n\n /**\n * Find VerifierOption by verifierIdx and optionType. Returns undefined if the option is not present.\n * @param {number} verifierIdx\n * @param {number} optionType\n */\n public findVerifierOption(verifierIdx: number, optionType: number): VerifierOption | undefined {\n const worker = this.workerOptions.find((w) => w.workerId === WorkerId.VERIFIER)\n if (worker) {\n const opt = worker.options.find((o) => o.type === optionType && (o as VerifierOption).index === verifierIdx)\n if (opt) {\n return opt as VerifierOption\n }\n }\n }\n}\n","export type PacketPath = {\n srcEid: number\n sender: string\n dstEid: number\n receiver: string\n}\n\nexport type PacketHeader = {\n version: number\n nonce: string\n} & PacketPath\n\nexport type Packet = PacketHeader & {\n guid: string\n message: string\n // derived\n payload: string // payload = guid + message\n}\n\n// message origin\nexport type MessageOrigin = {\n srcEid: number\n sender: string\n nonce: string\n}\n\nexport function packetToMessageOrigin(packet: Packet): MessageOrigin {\n return {\n srcEid: packet.srcEid,\n sender: packet.sender,\n nonce: packet.nonce,\n }\n}\n","import { BigNumber } from '@ethersproject/bignumber'\nimport { keccak256 } from '@ethersproject/keccak256'\nimport { pack as solidityPack } from '@ethersproject/solidity'\n\nimport { Packet, PacketHeader } from '../model'\nimport { addressToBytes32, bytes32ToEthAddress, hexZeroPadTo32, trim0x } from '../utils'\n\n// header (version + path + guid)\n// version\nconst PACKET_VERSION_OFFSET = 0\n// nonce\nconst NONCE_OFFSET = 1\n// path\nconst SRC_CHAIN_OFFSET = 9\nconst SRC_ADDRESS_OFFSET = 13\nconst DST_CHAIN_OFFSET = 45\nconst DST_ADDRESS_OFFSET = 49\n// payload (guid + message)\nconst GUID_OFFSET = 81 // keccak256(nonce + path)\nconst MESSAGE_OFFSET = 113\n\nexport class PacketV1Codec {\n buffer: Buffer\n\n static from(payloadEncoded: string): PacketV1Codec {\n return new PacketV1Codec(payloadEncoded)\n }\n\n static fromBytes(payload: Uint8Array): PacketV1Codec {\n return new PacketV1Codec('0x' + Buffer.from(payload).toString('hex'))\n }\n\n protected constructor(payloadEncoded: string) {\n this.buffer = Buffer.from(trim0x(payloadEncoded), 'hex')\n }\n\n /**\n * encode packet to hex string\n */\n static encode(packet: Packet): string {\n const message = trim0x(packet.message)\n const buffer = Buffer.alloc(MESSAGE_OFFSET + message.length / 2)\n buffer.writeUInt8(packet.version, PACKET_VERSION_OFFSET)\n buffer.writeBigUInt64BE(BigInt(packet.nonce), NONCE_OFFSET)\n buffer.writeUInt32BE(packet.srcEid, SRC_CHAIN_OFFSET)\n buffer.write(trim0x(hexZeroPadTo32(packet.sender)), SRC_ADDRESS_OFFSET, 32, 'hex')\n buffer.writeUInt32BE(packet.dstEid, DST_CHAIN_OFFSET)\n buffer.write(trim0x(hexZeroPadTo32(packet.receiver)), DST_ADDRESS_OFFSET, 32, 'hex')\n buffer.write(trim0x(packet.guid), GUID_OFFSET, 32, 'hex')\n buffer.write(message, MESSAGE_OFFSET, message.length / 2, 'hex')\n return '0x' + buffer.toString('hex')\n }\n\n version(): number {\n return this.buffer.readUInt8(PACKET_VERSION_OFFSET)\n }\n\n nonce(): string {\n return this.buffer.readBigUint64BE(NONCE_OFFSET).toString()\n }\n\n srcEid(): number {\n return this.buffer.readUint32BE(SRC_CHAIN_OFFSET)\n }\n\n sender(): string {\n return '0x' + this.buffer.slice(SRC_ADDRESS_OFFSET, DST_CHAIN_OFFSET).toString('hex')\n }\n\n senderAddressB20(): string {\n return bytes32ToEthAddress(this.sender())\n }\n\n dstEid(): number {\n return this.buffer.readUint32BE(DST_CHAIN_OFFSET)\n }\n\n receiver(): string {\n return '0x' + this.buffer.slice(DST_ADDRESS_OFFSET, GUID_OFFSET).toString('hex')\n }\n\n receiverAddressB20(): string {\n return bytes32ToEthAddress(this.receiver())\n }\n\n guid(): string {\n return '0x' + this.buffer.slice(GUID_OFFSET, MESSAGE_OFFSET).toString('hex')\n }\n\n message(): string {\n return '0x' + this.buffer.slice(MESSAGE_OFFSET).toString('hex')\n }\n\n payloadHash(): string {\n return keccak256(this.payload())\n }\n\n payload(): string {\n return '0x' + this.buffer.slice(GUID_OFFSET).toString('hex')\n }\n\n header(): string {\n return '0x' + this.buffer.slice(0, GUID_OFFSET).toString('hex')\n }\n\n headerHash(): string {\n return keccak256(this.header())\n }\n\n /**\n * deserialize packet from hex string\n * @deprecated use toPacket instead\n */\n decode(): Packet {\n return this.toPacket()\n }\n\n toPacket(): Packet {\n return {\n version: this.version(),\n nonce: this.nonce(),\n srcEid: this.srcEid(),\n sender: this.sender(),\n dstEid: this.dstEid(),\n receiver: this.receiver(),\n guid: this.guid(),\n message: this.message(),\n // derived\n payload: this.payload(),\n }\n }\n}\n\nexport function calculateGuid(packetHead: PacketHeader): string {\n return keccak256(\n solidityPack(\n ['uint64', 'uint32', 'bytes32', 'uint32', 'bytes32'],\n [\n BigNumber.from(packetHead.nonce),\n packetHead.srcEid,\n addressToBytes32(packetHead.sender),\n packetHead.dstEid,\n addressToBytes32(packetHead.receiver),\n ]\n )\n )\n}\n\nexport { keccak256 } from '@ethersproject/keccak256'\n","import { Packet } from '../model'\n\nimport { PacketV1Codec } from './packet-v1-codec'\n\nexport class PacketSerializer {\n static serialize(packet: Packet): string {\n return PacketV1Codec.encode(packet)\n }\n\n static deserialize(bytesLike: Uint8Array | string): Packet {\n let codec: PacketV1Codec\n if (bytesLike instanceof Uint8Array) {\n codec = PacketV1Codec.fromBytes(bytesLike)\n } else {\n codec = PacketV1Codec.from(bytesLike)\n }\n return codec.toPacket()\n }\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Interface } from '@ethersproject/abi';
|
|
2
|
+
export { keccak256 } from '@ethersproject/keccak256';
|
|
2
3
|
|
|
3
4
|
declare function sleep(timeout: number): Promise<void>;
|
|
4
5
|
|
|
@@ -60,7 +61,7 @@ type PreCrimePeer = {
|
|
|
60
61
|
|
|
61
62
|
declare function parsePrecrimeConfig(precrimeConfig: string): PrecrimeConfig;
|
|
62
63
|
|
|
63
|
-
declare const parseError: (errorData: string, intf?:
|
|
64
|
+
declare const parseError: (errorData: string, intf?: Interface) => ReturnType<Interface['parseError']> | string | undefined;
|
|
64
65
|
|
|
65
66
|
type GasLimit = string | number | bigint;
|
|
66
67
|
type NativeDrop = string | number | bigint;
|
|
@@ -256,11 +257,10 @@ declare class PacketV1Codec {
|
|
|
256
257
|
toPacket(): Packet;
|
|
257
258
|
}
|
|
258
259
|
declare function calculateGuid(packetHead: PacketHeader): string;
|
|
259
|
-
declare function keccak256(message: string): string;
|
|
260
260
|
|
|
261
261
|
declare class PacketSerializer {
|
|
262
262
|
static serialize(packet: Packet): string;
|
|
263
263
|
static deserialize(bytesLike: Uint8Array | string): Packet;
|
|
264
264
|
}
|
|
265
265
|
|
|
266
|
-
export { ExecutorOptionType, type GasLimit, type MessageOrigin, type NativeDrop, type Option, OptionType, Options, type Packet, type PacketHeader, type PacketPath, PacketSerializer, PacketV1Codec, type PreCrimePeer, type PrecrimeConfig, type PrecrimeConfigV1, type PrecrimeConfigV2, type PrecrimePacket, type VerifierOption, VerifierOptionType, WorkerId, type WorkerOptions, addressToBytes32, bytes32ToEthAddress, calculateGuid, hexZeroPadTo32, isSolanaAddress,
|
|
266
|
+
export { ExecutorOptionType, type GasLimit, type MessageOrigin, type NativeDrop, type Option, OptionType, Options, type Packet, type PacketHeader, type PacketPath, PacketSerializer, PacketV1Codec, type PreCrimePeer, type PrecrimeConfig, type PrecrimeConfigV1, type PrecrimeConfigV2, type PrecrimePacket, type VerifierOption, VerifierOptionType, WorkerId, type WorkerOptions, addressToBytes32, bytes32ToEthAddress, calculateGuid, hexZeroPadTo32, isSolanaAddress, optionsType1, optionsType2, packetToMessageOrigin, parseError, parsePrecrimeConfig, sleep, trim0x };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Interface } from '@ethersproject/abi';
|
|
2
|
+
export { keccak256 } from '@ethersproject/keccak256';
|
|
2
3
|
|
|
3
4
|
declare function sleep(timeout: number): Promise<void>;
|
|
4
5
|
|
|
@@ -60,7 +61,7 @@ type PreCrimePeer = {
|
|
|
60
61
|
|
|
61
62
|
declare function parsePrecrimeConfig(precrimeConfig: string): PrecrimeConfig;
|
|
62
63
|
|
|
63
|
-
declare const parseError: (errorData: string, intf?:
|
|
64
|
+
declare const parseError: (errorData: string, intf?: Interface) => ReturnType<Interface['parseError']> | string | undefined;
|
|
64
65
|
|
|
65
66
|
type GasLimit = string | number | bigint;
|
|
66
67
|
type NativeDrop = string | number | bigint;
|
|
@@ -256,11 +257,10 @@ declare class PacketV1Codec {
|
|
|
256
257
|
toPacket(): Packet;
|
|
257
258
|
}
|
|
258
259
|
declare function calculateGuid(packetHead: PacketHeader): string;
|
|
259
|
-
declare function keccak256(message: string): string;
|
|
260
260
|
|
|
261
261
|
declare class PacketSerializer {
|
|
262
262
|
static serialize(packet: Packet): string;
|
|
263
263
|
static deserialize(bytesLike: Uint8Array | string): Packet;
|
|
264
264
|
}
|
|
265
265
|
|
|
266
|
-
export { ExecutorOptionType, type GasLimit, type MessageOrigin, type NativeDrop, type Option, OptionType, Options, type Packet, type PacketHeader, type PacketPath, PacketSerializer, PacketV1Codec, type PreCrimePeer, type PrecrimeConfig, type PrecrimeConfigV1, type PrecrimeConfigV2, type PrecrimePacket, type VerifierOption, VerifierOptionType, WorkerId, type WorkerOptions, addressToBytes32, bytes32ToEthAddress, calculateGuid, hexZeroPadTo32, isSolanaAddress,
|
|
266
|
+
export { ExecutorOptionType, type GasLimit, type MessageOrigin, type NativeDrop, type Option, OptionType, Options, type Packet, type PacketHeader, type PacketPath, PacketSerializer, PacketV1Codec, type PreCrimePeer, type PrecrimeConfig, type PrecrimeConfigV1, type PrecrimeConfigV2, type PrecrimePacket, type VerifierOption, VerifierOptionType, WorkerId, type WorkerOptions, addressToBytes32, bytes32ToEthAddress, calculateGuid, hexZeroPadTo32, isSolanaAddress, optionsType1, optionsType2, packetToMessageOrigin, parseError, parsePrecrimeConfig, sleep, trim0x };
|
package/dist/index.mjs
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
|
+
import { getAddress } from '@ethersproject/address';
|
|
2
|
+
import { hexZeroPad, hexlify, arrayify } from '@ethersproject/bytes';
|
|
1
3
|
import { PublicKey } from '@solana/web3.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
+
import { defaultAbiCoder } from '@ethersproject/abi';
|
|
5
|
+
import { BigNumber } from '@ethersproject/bignumber';
|
|
6
|
+
import { pack } from '@ethersproject/solidity';
|
|
4
7
|
import invariant from 'tiny-invariant';
|
|
8
|
+
import { keccak256 } from '@ethersproject/keccak256';
|
|
9
|
+
export { keccak256 } from '@ethersproject/keccak256';
|
|
5
10
|
|
|
6
11
|
// src/utils/utils.ts
|
|
7
12
|
async function sleep(timeout) {
|
|
8
13
|
await new Promise((resolve) => setTimeout(resolve, timeout));
|
|
9
14
|
}
|
|
10
15
|
function hexZeroPadTo32(addr) {
|
|
11
|
-
return
|
|
16
|
+
return hexZeroPad(addr, 32);
|
|
12
17
|
}
|
|
13
18
|
function bytes32ToEthAddress(bytes32) {
|
|
14
19
|
if (bytes32 instanceof Uint8Array) {
|
|
15
|
-
bytes32 =
|
|
20
|
+
bytes32 = hexlify(bytes32);
|
|
16
21
|
}
|
|
17
|
-
return
|
|
22
|
+
return getAddress(bytes32.slice(-40));
|
|
18
23
|
}
|
|
19
24
|
function trim0x(str) {
|
|
20
25
|
return str.replace(/^0x/, "");
|
|
@@ -110,12 +115,12 @@ var parseError = (errorData, intf) => {
|
|
|
110
115
|
function parseBuildInError(errorData) {
|
|
111
116
|
if (errorData.startsWith("0x08c379a0")) {
|
|
112
117
|
const content = `0x${errorData.substring(10)}`;
|
|
113
|
-
const reason =
|
|
118
|
+
const reason = defaultAbiCoder.decode(["string"], content);
|
|
114
119
|
return reason[0];
|
|
115
120
|
}
|
|
116
121
|
if (errorData.startsWith("0x4e487b71")) {
|
|
117
122
|
const content = `0x${errorData.substring(10)}`;
|
|
118
|
-
const code =
|
|
123
|
+
const code = defaultAbiCoder.decode(["uint"], content);
|
|
119
124
|
return code[0];
|
|
120
125
|
}
|
|
121
126
|
if (errorData === "0x") {
|
|
@@ -128,20 +133,20 @@ var OptionType = /* @__PURE__ */ ((OptionType2) => {
|
|
|
128
133
|
OptionType2[OptionType2["TYPE_3"] = 3] = "TYPE_3";
|
|
129
134
|
return OptionType2;
|
|
130
135
|
})(OptionType || {});
|
|
131
|
-
var MAX_UINT_128 =
|
|
136
|
+
var MAX_UINT_128 = BigNumber.from("0xffffffffffffffffffffffffffffffff");
|
|
132
137
|
function optionsType1(_extraGas) {
|
|
133
|
-
const extraGas =
|
|
138
|
+
const extraGas = BigNumber.from(_extraGas);
|
|
134
139
|
invariant(extraGas.lte(MAX_UINT_128), "extraGas should be less than MAX_UINT_128");
|
|
135
|
-
return
|
|
140
|
+
return pack(["uint16", "uint256"], [1 /* TYPE_1 */, extraGas]);
|
|
136
141
|
}
|
|
137
142
|
function optionsType2(_extraGas, _dstNativeAmt, _dstNativeAddress) {
|
|
138
|
-
const extraGas =
|
|
143
|
+
const extraGas = BigNumber.from(_extraGas);
|
|
139
144
|
invariant(extraGas.lte(MAX_UINT_128), "extraGas should be less than MAX_UINT_128");
|
|
140
|
-
const dstNativeAmt =
|
|
145
|
+
const dstNativeAmt = BigNumber.from(_dstNativeAmt);
|
|
141
146
|
invariant(dstNativeAmt.lte(MAX_UINT_128), "dstNativeAmt should be less than MAX_UINT_128");
|
|
142
|
-
return
|
|
147
|
+
return pack(
|
|
143
148
|
["uint16", "uint256", "uint256", "bytes"],
|
|
144
|
-
[2 /* TYPE_2 */,
|
|
149
|
+
[2 /* TYPE_2 */, BigNumber.from(extraGas), BigNumber.from(dstNativeAmt), _dstNativeAddress]
|
|
145
150
|
);
|
|
146
151
|
}
|
|
147
152
|
var WorkerId = /* @__PURE__ */ ((WorkerId2) => {
|
|
@@ -178,42 +183,42 @@ var Options = class _Options {
|
|
|
178
183
|
*/
|
|
179
184
|
static fromOptions(optionsHex) {
|
|
180
185
|
const options = new _Options();
|
|
181
|
-
const optionsBytes =
|
|
182
|
-
const optionsType =
|
|
186
|
+
const optionsBytes = arrayify(optionsHex);
|
|
187
|
+
const optionsType = BigNumber.from(optionsBytes.slice(0, 2)).toNumber();
|
|
183
188
|
if (optionsType === 3 /* TYPE_3 */) {
|
|
184
189
|
let cursor = 2;
|
|
185
190
|
while (cursor < optionsBytes.byteLength) {
|
|
186
|
-
const workerId =
|
|
191
|
+
const workerId = BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber();
|
|
187
192
|
cursor += 1;
|
|
188
|
-
const size =
|
|
193
|
+
const size = BigNumber.from(optionsBytes.slice(cursor, cursor + 2)).toNumber();
|
|
189
194
|
cursor += 2;
|
|
190
195
|
if (workerId === 1 /* EXECUTOR */) {
|
|
191
|
-
const optionType =
|
|
196
|
+
const optionType = BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber();
|
|
192
197
|
cursor += 1;
|
|
193
198
|
const params = optionsBytes.slice(cursor, cursor + size - 1);
|
|
194
199
|
cursor += size - 1;
|
|
195
|
-
options.addOption(workerId, { type: optionType, params:
|
|
200
|
+
options.addOption(workerId, { type: optionType, params: hexlify(params) });
|
|
196
201
|
} else if (workerId === 2 /* VERIFIER */) {
|
|
197
|
-
const verifierIdx =
|
|
202
|
+
const verifierIdx = BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber();
|
|
198
203
|
cursor += 1;
|
|
199
|
-
const optionType =
|
|
204
|
+
const optionType = BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber();
|
|
200
205
|
cursor += 1;
|
|
201
206
|
const params = optionsBytes.slice(cursor, cursor + size - 2);
|
|
202
207
|
cursor += size - 2;
|
|
203
208
|
options.addOption(workerId, {
|
|
204
209
|
type: optionType,
|
|
205
210
|
index: verifierIdx,
|
|
206
|
-
params:
|
|
211
|
+
params: hexlify(params)
|
|
207
212
|
});
|
|
208
213
|
}
|
|
209
214
|
}
|
|
210
215
|
} else if (optionsType === 2 /* TYPE_2 */) {
|
|
211
|
-
const extraGas =
|
|
212
|
-
const dstNativeAmt =
|
|
213
|
-
const dstNativeAddress =
|
|
216
|
+
const extraGas = BigNumber.from(optionsBytes.slice(2, 34)).toBigInt();
|
|
217
|
+
const dstNativeAmt = BigNumber.from(optionsBytes.slice(34, 66)).toBigInt();
|
|
218
|
+
const dstNativeAddress = hexlify(optionsBytes.slice(66, optionsBytes.byteLength));
|
|
214
219
|
options.addExecutorLzReceiveOption(extraGas).addExecutorNativeDropOption(dstNativeAmt, dstNativeAddress);
|
|
215
220
|
} else if (optionsType === 1 /* TYPE_1 */) {
|
|
216
|
-
const extraGas =
|
|
221
|
+
const extraGas = BigNumber.from(optionsBytes.slice(2, 34)).toBigInt();
|
|
217
222
|
options.addExecutorLzReceiveOption(extraGas);
|
|
218
223
|
}
|
|
219
224
|
return options;
|
|
@@ -224,13 +229,13 @@ var Options = class _Options {
|
|
|
224
229
|
* @param {NativeDrop} nativeDrop
|
|
225
230
|
*/
|
|
226
231
|
addExecutorLzReceiveOption(gasLimit, nativeDrop = 0) {
|
|
227
|
-
const gasLimitBN =
|
|
232
|
+
const gasLimitBN = BigNumber.from(gasLimit);
|
|
228
233
|
invariant(gasLimitBN.lte(MAX_UINT_128), "gasLimit shouldn't be greater than MAX_UINT_128");
|
|
229
|
-
const nativeDropBN =
|
|
234
|
+
const nativeDropBN = BigNumber.from(nativeDrop);
|
|
230
235
|
invariant(nativeDropBN.lte(MAX_UINT_128), "value shouldn't be greater than MAX_UINT_128");
|
|
231
236
|
this.addOption(1 /* EXECUTOR */, {
|
|
232
237
|
type: 1 /* LZ_RECEIVE */,
|
|
233
|
-
params: nativeDropBN.eq(0) ?
|
|
238
|
+
params: nativeDropBN.eq(0) ? pack(["uint128"], [gasLimitBN]) : pack(["uint128", "uint128"], [gasLimitBN, nativeDropBN])
|
|
234
239
|
});
|
|
235
240
|
return this;
|
|
236
241
|
}
|
|
@@ -240,11 +245,11 @@ var Options = class _Options {
|
|
|
240
245
|
* @param {string} receiver
|
|
241
246
|
*/
|
|
242
247
|
addExecutorNativeDropOption(nativeDrop, receiver) {
|
|
243
|
-
const amountBN =
|
|
248
|
+
const amountBN = BigNumber.from(nativeDrop);
|
|
244
249
|
invariant(amountBN.lte(MAX_UINT_128), "nativeDrop shouldn't be greater than MAX_UINT_128");
|
|
245
250
|
this.addOption(1 /* EXECUTOR */, {
|
|
246
251
|
type: 2 /* NATIVE_DROP */,
|
|
247
|
-
params:
|
|
252
|
+
params: pack(["uint128", "bytes32"], [amountBN, hexZeroPadTo32(receiver)])
|
|
248
253
|
});
|
|
249
254
|
return this;
|
|
250
255
|
}
|
|
@@ -255,19 +260,16 @@ var Options = class _Options {
|
|
|
255
260
|
* @param {NativeDrop} nativeDrop
|
|
256
261
|
*/
|
|
257
262
|
addExecutorComposeOption(index, gasLimit, nativeDrop = 0) {
|
|
258
|
-
const gasLimitBN =
|
|
263
|
+
const gasLimitBN = BigNumber.from(gasLimit);
|
|
259
264
|
invariant(gasLimitBN.lte(MAX_UINT_128), "gasLimit shouldn't be greater than MAX_UINT_128");
|
|
260
|
-
const nativeDropBN =
|
|
265
|
+
const nativeDropBN = BigNumber.from(nativeDrop);
|
|
261
266
|
invariant(nativeDropBN.lte(MAX_UINT_128), "nativeDrop shouldn't be greater than MAX_UINT_128");
|
|
262
267
|
const option = nativeDropBN.gt(0) ? {
|
|
263
268
|
type: 3 /* COMPOSE */,
|
|
264
|
-
params:
|
|
265
|
-
["uint16", "uint128", "uint128"],
|
|
266
|
-
[index, gasLimitBN, nativeDropBN]
|
|
267
|
-
)
|
|
269
|
+
params: pack(["uint16", "uint128", "uint128"], [index, gasLimitBN, nativeDropBN])
|
|
268
270
|
} : {
|
|
269
271
|
type: 3 /* COMPOSE */,
|
|
270
|
-
params:
|
|
272
|
+
params: pack(["uint16", "uint128"], [index, gasLimitBN])
|
|
271
273
|
};
|
|
272
274
|
this.addOption(1 /* EXECUTOR */, option);
|
|
273
275
|
return this;
|
|
@@ -298,12 +300,12 @@ var Options = class _Options {
|
|
|
298
300
|
* Serialize Options to hex string.
|
|
299
301
|
*/
|
|
300
302
|
toHex() {
|
|
301
|
-
let hex =
|
|
303
|
+
let hex = pack(["uint16"], [3 /* TYPE_3 */]);
|
|
302
304
|
this.workerOptions.forEach((w) => {
|
|
303
305
|
for (const option of w.options) {
|
|
304
306
|
if (w.workerId === 1 /* EXECUTOR */) {
|
|
305
307
|
hex += trim0x(
|
|
306
|
-
|
|
308
|
+
pack(
|
|
307
309
|
["uint8", "uint16", "uint8", "bytes"],
|
|
308
310
|
[w.workerId, trim0x(option.params).length / 2 + 1, option.type, option.params]
|
|
309
311
|
)
|
|
@@ -311,7 +313,7 @@ var Options = class _Options {
|
|
|
311
313
|
} else if (w.workerId === 2 /* VERIFIER */) {
|
|
312
314
|
const verifierOption = option;
|
|
313
315
|
hex += trim0x(
|
|
314
|
-
|
|
316
|
+
pack(
|
|
315
317
|
["uint8", "uint16", "uint8", "uint8", "bytes"],
|
|
316
318
|
[
|
|
317
319
|
w.workerId,
|
|
@@ -331,7 +333,7 @@ var Options = class _Options {
|
|
|
331
333
|
* Serialize Options to Uint8Array.
|
|
332
334
|
*/
|
|
333
335
|
toBytes() {
|
|
334
|
-
return
|
|
336
|
+
return arrayify(this.toHex());
|
|
335
337
|
}
|
|
336
338
|
addOption(workerId, option) {
|
|
337
339
|
const worker = this.workerOptions.find((w) => w.workerId === workerId);
|
|
@@ -349,15 +351,15 @@ var Options = class _Options {
|
|
|
349
351
|
if (!options || options.length === 0) {
|
|
350
352
|
return;
|
|
351
353
|
}
|
|
352
|
-
let totalGas =
|
|
353
|
-
let totalValue =
|
|
354
|
+
let totalGas = BigNumber.from(0).toBigInt();
|
|
355
|
+
let totalValue = BigNumber.from(0).toBigInt();
|
|
354
356
|
for (const option of options) {
|
|
355
357
|
const buffer = Buffer.from(trim0x(option.params), "hex");
|
|
356
|
-
const gas =
|
|
358
|
+
const gas = BigNumber.from(buffer.subarray(0, 16)).toBigInt();
|
|
357
359
|
if (buffer.length === 16) {
|
|
358
|
-
return { gas, value:
|
|
360
|
+
return { gas, value: BigNumber.from(0).toBigInt() };
|
|
359
361
|
}
|
|
360
|
-
const value =
|
|
362
|
+
const value = BigNumber.from(buffer.subarray(16, 32)).toBigInt();
|
|
361
363
|
totalGas = totalGas + gas;
|
|
362
364
|
totalValue = totalValue + value;
|
|
363
365
|
}
|
|
@@ -373,8 +375,8 @@ var Options = class _Options {
|
|
|
373
375
|
}
|
|
374
376
|
const results = options.reduce((acc, cur) => {
|
|
375
377
|
const buffer = Buffer.from(trim0x(cur.params), "hex");
|
|
376
|
-
const amount =
|
|
377
|
-
const receiver =
|
|
378
|
+
const amount = BigNumber.from(buffer.subarray(0, 16)).toBigInt();
|
|
379
|
+
const receiver = hexlify(buffer.subarray(16, 48));
|
|
378
380
|
if (acc[receiver]) {
|
|
379
381
|
acc[receiver]["amount"] = acc[receiver].amount + amount;
|
|
380
382
|
} else {
|
|
@@ -395,9 +397,9 @@ var Options = class _Options {
|
|
|
395
397
|
const results = options.reduce(
|
|
396
398
|
(acc, cur) => {
|
|
397
399
|
const buffer = Buffer.from(trim0x(cur.params), "hex");
|
|
398
|
-
const index =
|
|
399
|
-
const gas =
|
|
400
|
-
const value = (buffer.length === 34 ?
|
|
400
|
+
const index = BigNumber.from(buffer.subarray(0, 2)).toNumber();
|
|
401
|
+
const gas = BigNumber.from(buffer.subarray(2, 18)).toBigInt();
|
|
402
|
+
const value = (buffer.length === 34 ? BigNumber.from(buffer.subarray(18, 34)) : BigNumber.from(0)).toBigInt();
|
|
401
403
|
if (acc[index]) {
|
|
402
404
|
acc[index]["gas"] = acc[index].gas + gas;
|
|
403
405
|
acc[index]["value"] = acc[index].value + value;
|
|
@@ -551,10 +553,10 @@ var PacketV1Codec = class _PacketV1Codec {
|
|
|
551
553
|
};
|
|
552
554
|
function calculateGuid(packetHead) {
|
|
553
555
|
return keccak256(
|
|
554
|
-
|
|
556
|
+
pack(
|
|
555
557
|
["uint64", "uint32", "bytes32", "uint32", "bytes32"],
|
|
556
558
|
[
|
|
557
|
-
|
|
559
|
+
BigNumber.from(packetHead.nonce),
|
|
558
560
|
packetHead.srcEid,
|
|
559
561
|
addressToBytes32(packetHead.sender),
|
|
560
562
|
packetHead.dstEid,
|
|
@@ -563,9 +565,6 @@ function calculateGuid(packetHead) {
|
|
|
563
565
|
)
|
|
564
566
|
);
|
|
565
567
|
}
|
|
566
|
-
function keccak256(message) {
|
|
567
|
-
return ethers.utils.keccak256(message);
|
|
568
|
-
}
|
|
569
568
|
|
|
570
569
|
// src/codec/packet-serializer.ts
|
|
571
570
|
var PacketSerializer = class {
|
|
@@ -583,6 +582,6 @@ var PacketSerializer = class {
|
|
|
583
582
|
}
|
|
584
583
|
};
|
|
585
584
|
|
|
586
|
-
export { ExecutorOptionType, OptionType, Options, PacketSerializer, PacketV1Codec, VerifierOptionType, WorkerId, addressToBytes32, bytes32ToEthAddress, calculateGuid, hexZeroPadTo32, isSolanaAddress,
|
|
585
|
+
export { ExecutorOptionType, OptionType, Options, PacketSerializer, PacketV1Codec, VerifierOptionType, WorkerId, addressToBytes32, bytes32ToEthAddress, calculateGuid, hexZeroPadTo32, isSolanaAddress, optionsType1, optionsType2, packetToMessageOrigin, parseError, parsePrecrimeConfig, sleep, trim0x };
|
|
587
586
|
//# sourceMappingURL=out.js.map
|
|
588
587
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/utils.ts","../src/utils/hex.ts","../src/utils/precrime.ts","../src/utils/parse-error.ts","../src/options/options.ts","../src/model/packet.ts","../src/codec/packet-v1-codec.ts","../src/codec/packet-serializer.ts"],"names":["ethers","OptionType","WorkerId","ExecutorOptionType","VerifierOptionType"],"mappings":"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","sourcesContent":["export async function sleep(timeout: number) {\n await new Promise((resolve) => setTimeout(resolve, timeout))\n}\n","import { PublicKey } from '@solana/web3.js'\nimport { ethers } from 'ethers'\nimport { arrayify } from 'ethers/lib/utils'\n\nexport function hexZeroPadTo32(addr: string): string {\n return ethers.utils.hexZeroPad(addr, 32)\n}\n\nexport function bytes32ToEthAddress(bytes32: string | Uint8Array): string {\n if (bytes32 instanceof Uint8Array) {\n bytes32 = ethers.utils.hexlify(bytes32)\n }\n return ethers.utils.getAddress(bytes32.slice(-40))\n}\n\nexport function trim0x(str: string): string {\n return str.replace(/^0x/, '')\n}\n\n/**\n * Convert address to bytes32\n * @param address 0x prefixed address(20bytes or 32bytes) or solana address\n */\nexport function addressToBytes32(address: string): Uint8Array {\n if (isSolanaAddress(address)) {\n return new PublicKey(address).toBytes()\n } else if (address.startsWith('0x') && address.length <= 66) {\n return arrayify(hexZeroPadTo32(address))\n }\n throw new Error('Invalid address')\n}\n\nconst solanaAddressRegex = /^([1-9A-HJ-NP-Za-km-z]{32,44})$/\n\nexport function isSolanaAddress(address: string): boolean {\n return solanaAddressRegex.test(address)\n}\n","import { PreCrimePeer, PrecrimeConfig, PrecrimeConfigV1, PrecrimeConfigV2 } from '../model'\n\nimport { trim0x } from './hex'\n\nconst CONFIG_VERSION_OFFSET = 0\nconst MAX_BATCH_SIZE_OFFSET = 2\nconst NUMBER_OF_PEERS_OFFSET = 10\nconst PEERS_OFFSET = 12\n\nexport function parsePrecrimeConfig(precrimeConfig: string): PrecrimeConfig {\n const data = trim0x(precrimeConfig)\n const version = parseInt(data.slice(0, 4), 16)\n if (version === 1) {\n return parsePrecrimeConfigV1(precrimeConfig)\n } else if (version === 2) {\n return parsePrecrimeConfigV2(precrimeConfig)\n }\n throw new Error(`Unsupported precrime config version: ${version}`)\n}\n\nfunction parsePrecrimeConfigV1(precrimeConfig: string): PrecrimeConfigV1 {\n const data = trim0x(precrimeConfig)\n const version = parseInt(data.slice(0, 4), 16)\n const maxBatchSize = parseInt(data.slice(4, 20), 16)\n const remoteChainsLength = parseInt(data.slice(20, 84), 16)\n const remoteChainsBytes = data.slice(84, 84 + remoteChainsLength * 64)\n const remoteAddressesBytes = data.slice(\n 84 + remoteChainsLength * 64,\n 84 + remoteChainsLength * 64 + remoteChainsLength * 64\n )\n\n const remoteChainsBytesArray: number[] = []\n const remoteAddressesBytesArray: string[] = []\n let start = 0\n let end = 64\n for (let i = 0; i < remoteChainsLength; i++) {\n remoteChainsBytesArray.push(parseInt(remoteChainsBytes.slice(start, end), 16))\n remoteAddressesBytesArray.push(`0x${remoteAddressesBytes.slice(start, end)}`)\n start += 64\n end += 64\n }\n return { version, maxBatchSize, remoteEids: remoteChainsBytesArray, remoteAddresses: remoteAddressesBytesArray }\n}\n\nfunction parsePrecrimeConfigV2(precrimeConfig: string): PrecrimeConfigV2 {\n const buffer = Buffer.from(trim0x(precrimeConfig), 'hex')\n const version = buffer.readUInt16BE(CONFIG_VERSION_OFFSET)\n const maxBatchSize = buffer.readBigUint64BE(MAX_BATCH_SIZE_OFFSET)\n const peers = new Array<PreCrimePeer>()\n if (buffer.length > NUMBER_OF_PEERS_OFFSET) {\n const numOfPeers = buffer.readUInt16BE(NUMBER_OF_PEERS_OFFSET)\n for (let i = 0; i < numOfPeers; i++) {\n const offset = PEERS_OFFSET + i * (4 + 2 * 32)\n const eid = buffer.readUInt32BE(offset)\n const preCrimeAddress = '0x' + buffer.slice(offset + 4, offset + 4 + 32).toString('hex')\n const oappAddress = '0x' + buffer.slice(offset + 4 + 32, offset + 4 + 32 + 32).toString('hex')\n peers.push({\n eid,\n preCrimeAddress,\n oappAddress,\n })\n }\n }\n return {\n version,\n maxBatchSize,\n peers,\n }\n}\n","import { ethers } from 'ethers'\n\nexport const parseError = (\n errorData: string,\n intf?: ethers.utils.Interface\n): ReturnType<ethers.utils.Interface['parseError']> | string | undefined => {\n const buildInError = parseBuildInError(errorData)\n if (buildInError !== undefined) {\n return buildInError\n }\n\n if (intf) {\n try {\n return intf.parseError(errorData)\n } catch (e) {\n console.error(e)\n }\n }\n}\n\nfunction parseBuildInError(errorData: string): string | undefined {\n if (errorData.startsWith('0x08c379a0')) {\n // decode Error(string)\n\n const content = `0x${errorData.substring(10)}`\n const reason = ethers.utils.defaultAbiCoder.decode(['string'], content)\n\n return reason[0] // reason: string; for standard revert error string\n }\n\n if (errorData.startsWith('0x4e487b71')) {\n // decode Panic(uint)\n const content = `0x${errorData.substring(10)}`\n const code = ethers.utils.defaultAbiCoder.decode(['uint'], content)\n\n return code[0]\n }\n\n if (errorData === '0x') {\n return ''\n }\n}\n","import { ethers } from 'ethers'\nimport invariant from 'tiny-invariant'\n\nimport { hexZeroPadTo32, trim0x } from '../utils'\n\n// gasLimit input type\nexport type GasLimit = string | number | bigint\n\n// native drop input type\nexport type NativeDrop = string | number | bigint\n\n/**\n * Enumerates the supported option types.\n */\nexport enum OptionType {\n /**\n * Allows the specification of the gas allowance for the remote executor transaction, measured in destination gas\n * units.\n *\n * Format:\n * bytes [2 32 ]\n * fields [type extraGas]\n */\n TYPE_1 = 1,\n\n /**\n * Combines the functionality of TYPE_1 along with destination gas drop to a remote address.\n *\n * Format:\n * bytes [2 32 32 bytes[] ]\n * fields [type extraGas dstNativeAmt dstNativeAddress]\n */\n TYPE_2 = 2,\n\n /**\n * EndpointV2 specific options.\n */\n TYPE_3 = 3,\n}\n\nconst MAX_UINT_128 = ethers.BigNumber.from('0xffffffffffffffffffffffffffffffff')\n\n/**\n * Builds OptionsType.TYPE_1.\n *\n * @param {GasLimit} _extraGas The gas allowance for the remote executor transaction, measured in destination gas units.\n */\nexport function optionsType1(_extraGas: GasLimit): string {\n const extraGas = ethers.BigNumber.from(_extraGas)\n invariant(extraGas.lte(MAX_UINT_128), 'extraGas should be less than MAX_UINT_128')\n return ethers.utils.solidityPack(['uint16', 'uint256'], [OptionType.TYPE_1, extraGas])\n}\n\n/**\n * Builds OptionsType.TYPE_2.\n *\n * @param {GasLimit} _extraGas The gas allowance for the remote executor transaction, measured in destination gas units.\n * @param {NativeDrop} _dstNativeAmt The amount of native token to be sent to the destination chain.\n * @param {string} _dstNativeAddress The destination address of _dstNativeAmt.\n */\nexport function optionsType2(_extraGas: GasLimit, _dstNativeAmt: NativeDrop, _dstNativeAddress: string): string {\n const extraGas = ethers.BigNumber.from(_extraGas)\n invariant(extraGas.lte(MAX_UINT_128), 'extraGas should be less than MAX_UINT_128')\n const dstNativeAmt = ethers.BigNumber.from(_dstNativeAmt)\n invariant(dstNativeAmt.lte(MAX_UINT_128), 'dstNativeAmt should be less than MAX_UINT_128')\n return ethers.utils.solidityPack(\n ['uint16', 'uint256', 'uint256', 'bytes'],\n [OptionType.TYPE_2, ethers.BigNumber.from(extraGas), ethers.BigNumber.from(dstNativeAmt), _dstNativeAddress]\n )\n}\n\n/**\n * Enumerates the supported worker IDs.\n */\nexport enum WorkerId {\n EXECUTOR = 1,\n VERIFIER = 2,\n TREASURY = 255,\n}\n\nexport type WorkerOptions = {\n workerId: number // uint8\n options: Option[] // toBytes: num(uint8),[type(uint8),size(uint16),data],[type(uint8),size(uint16),data],[type(uint8),size(uint16),data]...\n}\n\nexport type Option = {\n type: number // uint8\n params: string // bytes\n}\n\nexport type VerifierOption = Option & {\n index: number // uint8\n}\n\n/**\n * Enumerates the supported executor option types.\n */\nexport enum ExecutorOptionType {\n LZ_RECEIVE = 1,\n NATIVE_DROP = 2,\n COMPOSE = 3,\n ORDERED = 4,\n}\n\n/**\n * Enumerates the supported verifier option types.\n */\nexport enum VerifierOptionType {\n PRECRIME = 1,\n}\n\n/**\n * Options builder, available only for EndpointV2.\n */\nexport class Options {\n protected workerOptions: WorkerOptions[] = []\n\n // dissuade public instantiation\n protected constructor() {}\n\n /**\n * Create a new options instance.\n */\n public static newOptions(): Options {\n return new Options()\n }\n\n /**\n * Create an options instance from a hex string.\n * @param {string} optionsHex The hex string to decode.\n */\n public static fromOptions(optionsHex: string): Options {\n const options = new Options()\n const optionsBytes = ethers.utils.arrayify(optionsHex)\n // 0-2 bytes is options type\n const optionsType = ethers.BigNumber.from(optionsBytes.slice(0, 2)).toNumber()\n if (optionsType === OptionType.TYPE_3) {\n let cursor = 2\n while (cursor < optionsBytes.byteLength) {\n const workerId = ethers.BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n\n const size = ethers.BigNumber.from(optionsBytes.slice(cursor, cursor + 2)).toNumber()\n cursor += 2\n\n if (workerId === WorkerId.EXECUTOR) {\n const optionType = ethers.BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n const params = optionsBytes.slice(cursor, cursor + size - 1)\n cursor += size - 1\n options.addOption(workerId, { type: optionType, params: ethers.utils.hexlify(params) })\n } else if (workerId === WorkerId.VERIFIER) {\n const verifierIdx = ethers.BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n const optionType = ethers.BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n const params = optionsBytes.slice(cursor, cursor + size - 2)\n cursor += size - 2\n options.addOption(workerId, <VerifierOption>{\n type: optionType,\n index: verifierIdx,\n params: ethers.utils.hexlify(params),\n })\n }\n // TODO - other workerId\n }\n } else if (optionsType === OptionType.TYPE_2) {\n const extraGas = ethers.BigNumber.from(optionsBytes.slice(2, 34)).toBigInt()\n const dstNativeAmt = ethers.BigNumber.from(optionsBytes.slice(34, 66)).toBigInt()\n const dstNativeAddress = ethers.utils.hexlify(optionsBytes.slice(66, optionsBytes.byteLength))\n options.addExecutorLzReceiveOption(extraGas).addExecutorNativeDropOption(dstNativeAmt, dstNativeAddress)\n } else if (optionsType === OptionType.TYPE_1) {\n const extraGas = ethers.BigNumber.from(optionsBytes.slice(2, 34)).toBigInt()\n options.addExecutorLzReceiveOption(extraGas)\n }\n\n return options\n }\n\n /**\n * Add ExecutorOptionType.LZ_RECEIVE option.\n * @param {GasLimit} gasLimit\n * @param {NativeDrop} nativeDrop\n */\n public addExecutorLzReceiveOption(gasLimit: GasLimit, nativeDrop: NativeDrop = 0): Options {\n const gasLimitBN = ethers.BigNumber.from(gasLimit)\n invariant(gasLimitBN.lte(MAX_UINT_128), \"gasLimit shouldn't be greater than MAX_UINT_128\")\n const nativeDropBN = ethers.BigNumber.from(nativeDrop)\n invariant(nativeDropBN.lte(MAX_UINT_128), \"value shouldn't be greater than MAX_UINT_128\")\n this.addOption(WorkerId.EXECUTOR, {\n type: ExecutorOptionType.LZ_RECEIVE,\n params: nativeDropBN.eq(0)\n ? ethers.utils.solidityPack(['uint128'], [gasLimitBN])\n : ethers.utils.solidityPack(['uint128', 'uint128'], [gasLimitBN, nativeDropBN]),\n })\n return this\n }\n\n /**\n * Add ExecutorOptionType.NATIVE_DROP option.\n * @param {NativeDrop} nativeDrop\n * @param {string} receiver\n */\n public addExecutorNativeDropOption(nativeDrop: NativeDrop, receiver: string): Options {\n const amountBN = ethers.BigNumber.from(nativeDrop)\n invariant(amountBN.lte(MAX_UINT_128), \"nativeDrop shouldn't be greater than MAX_UINT_128\")\n this.addOption(WorkerId.EXECUTOR, {\n type: ExecutorOptionType.NATIVE_DROP,\n params: ethers.utils.solidityPack(['uint128', 'bytes32'], [amountBN, hexZeroPadTo32(receiver)]),\n })\n return this\n }\n\n /**\n * Add ExecutorOptionType.COMPOSE option.\n * @param {number} index\n * @param {GasLimit} gasLimit\n * @param {NativeDrop} nativeDrop\n */\n public addExecutorComposeOption(index: number, gasLimit: GasLimit, nativeDrop: NativeDrop = 0): Options {\n const gasLimitBN = ethers.BigNumber.from(gasLimit)\n invariant(gasLimitBN.lte(MAX_UINT_128), \"gasLimit shouldn't be greater than MAX_UINT_128\")\n const nativeDropBN = ethers.BigNumber.from(nativeDrop)\n invariant(nativeDropBN.lte(MAX_UINT_128), \"nativeDrop shouldn't be greater than MAX_UINT_128\")\n const option = nativeDropBN.gt(0)\n ? {\n type: ExecutorOptionType.COMPOSE,\n params: ethers.utils.solidityPack(\n ['uint16', 'uint128', 'uint128'],\n [index, gasLimitBN, nativeDropBN]\n ),\n }\n : {\n type: ExecutorOptionType.COMPOSE,\n params: ethers.utils.solidityPack(['uint16', 'uint128'], [index, gasLimitBN]),\n }\n\n this.addOption(WorkerId.EXECUTOR, option)\n return this\n }\n\n /**\n * Add ExecutorOptionType.ORDERED option.\n */\n public addExecutorOrderedExecutionOption(): Options {\n this.addOption(WorkerId.EXECUTOR, {\n type: ExecutorOptionType.ORDERED,\n params: '0x',\n })\n return this\n }\n\n /**\n * Add VerifierOptionType.PRECRIME option.\n * @param {number} verifierIdx\n */\n public addVerifierPrecrimeOption(verifierIdx: number): Options {\n this.addOption(WorkerId.VERIFIER, <VerifierOption>{\n type: VerifierOptionType.PRECRIME,\n index: verifierIdx,\n params: '0x',\n })\n return this\n }\n\n /**\n * Serialize Options to hex string.\n */\n public toHex(): string {\n // output encoded hex, type(uint16)\n let hex = ethers.utils.solidityPack(['uint16'], [OptionType.TYPE_3])\n this.workerOptions.forEach((w) => {\n for (const option of w.options) {\n if (w.workerId === WorkerId.EXECUTOR) {\n hex += trim0x(\n ethers.utils.solidityPack(\n ['uint8', 'uint16', 'uint8', 'bytes'],\n [w.workerId, trim0x(option.params).length / 2 + 1, option.type, option.params]\n )\n )\n } else if (w.workerId === WorkerId.VERIFIER) {\n const verifierOption = option as VerifierOption\n hex += trim0x(\n ethers.utils.solidityPack(\n ['uint8', 'uint16', 'uint8', 'uint8', 'bytes'],\n [\n w.workerId,\n trim0x(option.params).length / 2 + 2,\n verifierOption.index,\n verifierOption.type,\n verifierOption.params,\n ]\n )\n )\n }\n // TODO other workerId\n }\n })\n return hex\n }\n\n /**\n * Serialize Options to Uint8Array.\n */\n public toBytes(): Uint8Array {\n return ethers.utils.arrayify(this.toHex())\n }\n\n private addOption(workerId: number, option: Option): void {\n const worker = this.workerOptions.find((w) => w.workerId === workerId)\n if (worker) {\n worker.options.push(option)\n } else {\n this.workerOptions.push({ workerId, options: [option] })\n }\n }\n\n /**\n * Decode ExecutorOptionType.LZ_RECEIVE option. Returns undefined if the option is not present.\n */\n public decodeExecutorLzReceiveOption(): { gas: bigint; value: bigint } | undefined {\n const options = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.LZ_RECEIVE) as Option[]\n if (!options || options.length === 0) {\n return\n }\n let totalGas = ethers.BigNumber.from(0).toBigInt()\n let totalValue = ethers.BigNumber.from(0).toBigInt()\n for (const option of options) {\n const buffer = Buffer.from(trim0x(option.params), 'hex')\n const gas = ethers.BigNumber.from(buffer.subarray(0, 16)).toBigInt()\n if (buffer.length === 16) {\n return { gas, value: ethers.BigNumber.from(0).toBigInt() }\n }\n const value = ethers.BigNumber.from(buffer.subarray(16, 32)).toBigInt()\n totalGas = totalGas + gas\n totalValue = totalValue + value\n }\n\n return { gas: totalGas, value: totalValue }\n }\n\n /**\n * Decode ExecutorOptionType.NATIVE_DROP options. Returns undefined if the options is not present.\n */\n public decodeExecutorNativeDropOption(): { amount: bigint; receiver: string }[] {\n const options = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.NATIVE_DROP) as Option[]\n if (!options || options.length === 0) {\n return []\n }\n\n const results = options.reduce((acc: { [key: string]: { amount: bigint; receiver: string } }, cur: Option) => {\n const buffer = Buffer.from(trim0x(cur.params), 'hex')\n const amount = ethers.BigNumber.from(buffer.subarray(0, 16)).toBigInt()\n const receiver = ethers.utils.hexlify(buffer.subarray(16, 48))\n if (acc[receiver]) {\n acc[receiver]['amount'] = acc[receiver].amount + amount\n } else {\n acc[receiver] = { amount, receiver }\n }\n return acc\n }, {})\n return Object.values(results)\n }\n\n /**\n * Decode ExecutorOptionType.COMPOSE options. Returns undefined if the options is not present.\n */\n public decodeExecutorComposeOption(): { index: number; gas: bigint; value: bigint }[] {\n const options = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.COMPOSE) as Option[]\n if (!options || options.length === 0) {\n return []\n }\n const results = options.reduce(\n (acc: { [key: number]: { index: number; gas: bigint; value: bigint } }, cur: Option) => {\n const buffer = Buffer.from(trim0x(cur.params), 'hex')\n const index = ethers.BigNumber.from(buffer.subarray(0, 2)).toNumber()\n const gas = ethers.BigNumber.from(buffer.subarray(2, 18)).toBigInt()\n const value = (\n buffer.length === 34 ? ethers.BigNumber.from(buffer.subarray(18, 34)) : ethers.BigNumber.from(0)\n ).toBigInt()\n if (acc[index]) {\n acc[index]['gas'] = acc[index].gas + gas\n acc[index]['value'] = acc[index].value + value\n } else {\n acc[index] = { index, gas, value }\n }\n return acc\n },\n {}\n )\n return Object.values(results)\n }\n\n /**\n * Decode ExecutorOptionType.ORDERED options. Returns undefined if the options is not present.\n */\n public decodeExecutorOrderedExecutionOption(): boolean {\n const option = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.ORDERED) as Option\n return option !== undefined\n }\n\n private findOptions(workerId: number, optionType: number): Option[] | Option | undefined {\n const worker = this.workerOptions.find((w) => w.workerId === workerId)\n if (worker) {\n if (optionType === ExecutorOptionType.ORDERED) {\n return worker.options.find((o) => o.type === optionType)\n }\n return worker.options.filter((o) => o.type === optionType)\n }\n }\n\n /**\n * Find VerifierOption by verifierIdx and optionType. Returns undefined if the option is not present.\n * @param {number} verifierIdx\n * @param {number} optionType\n */\n public findVerifierOption(verifierIdx: number, optionType: number): VerifierOption | undefined {\n const worker = this.workerOptions.find((w) => w.workerId === WorkerId.VERIFIER)\n if (worker) {\n const opt = worker.options.find((o) => o.type === optionType && (o as VerifierOption).index === verifierIdx)\n if (opt) {\n return opt as VerifierOption\n }\n }\n }\n}\n","export type PacketPath = {\n srcEid: number\n sender: string\n dstEid: number\n receiver: string\n}\n\nexport type PacketHeader = {\n version: number\n nonce: string\n} & PacketPath\n\nexport type Packet = PacketHeader & {\n guid: string\n message: string\n // derived\n payload: string // payload = guid + message\n}\n\n// message origin\nexport type MessageOrigin = {\n srcEid: number\n sender: string\n nonce: string\n}\n\nexport function packetToMessageOrigin(packet: Packet): MessageOrigin {\n return {\n srcEid: packet.srcEid,\n sender: packet.sender,\n nonce: packet.nonce,\n }\n}\n","import { ethers } from 'ethers'\n\nimport { Packet, PacketHeader } from '../model'\nimport { addressToBytes32, bytes32ToEthAddress, hexZeroPadTo32, trim0x } from '../utils'\n\n// header (version + path + guid)\n// version\nconst PACKET_VERSION_OFFSET = 0\n// nonce\nconst NONCE_OFFSET = 1\n// path\nconst SRC_CHAIN_OFFSET = 9\nconst SRC_ADDRESS_OFFSET = 13\nconst DST_CHAIN_OFFSET = 45\nconst DST_ADDRESS_OFFSET = 49\n// payload (guid + message)\nconst GUID_OFFSET = 81 // keccak256(nonce + path)\nconst MESSAGE_OFFSET = 113\n\nexport class PacketV1Codec {\n buffer: Buffer\n\n static from(payloadEncoded: string): PacketV1Codec {\n return new PacketV1Codec(payloadEncoded)\n }\n\n static fromBytes(payload: Uint8Array): PacketV1Codec {\n return new PacketV1Codec('0x' + Buffer.from(payload).toString('hex'))\n }\n\n protected constructor(payloadEncoded: string) {\n this.buffer = Buffer.from(trim0x(payloadEncoded), 'hex')\n }\n\n /**\n * encode packet to hex string\n */\n static encode(packet: Packet): string {\n const message = trim0x(packet.message)\n const buffer = Buffer.alloc(MESSAGE_OFFSET + message.length / 2)\n buffer.writeUInt8(packet.version, PACKET_VERSION_OFFSET)\n buffer.writeBigUInt64BE(BigInt(packet.nonce), NONCE_OFFSET)\n buffer.writeUInt32BE(packet.srcEid, SRC_CHAIN_OFFSET)\n buffer.write(trim0x(hexZeroPadTo32(packet.sender)), SRC_ADDRESS_OFFSET, 32, 'hex')\n buffer.writeUInt32BE(packet.dstEid, DST_CHAIN_OFFSET)\n buffer.write(trim0x(hexZeroPadTo32(packet.receiver)), DST_ADDRESS_OFFSET, 32, 'hex')\n buffer.write(trim0x(packet.guid), GUID_OFFSET, 32, 'hex')\n buffer.write(message, MESSAGE_OFFSET, message.length / 2, 'hex')\n return '0x' + buffer.toString('hex')\n }\n\n version(): number {\n return this.buffer.readUInt8(PACKET_VERSION_OFFSET)\n }\n\n nonce(): string {\n return this.buffer.readBigUint64BE(NONCE_OFFSET).toString()\n }\n\n srcEid(): number {\n return this.buffer.readUint32BE(SRC_CHAIN_OFFSET)\n }\n\n sender(): string {\n return '0x' + this.buffer.slice(SRC_ADDRESS_OFFSET, DST_CHAIN_OFFSET).toString('hex')\n }\n\n senderAddressB20(): string {\n return bytes32ToEthAddress(this.sender())\n }\n\n dstEid(): number {\n return this.buffer.readUint32BE(DST_CHAIN_OFFSET)\n }\n\n receiver(): string {\n return '0x' + this.buffer.slice(DST_ADDRESS_OFFSET, GUID_OFFSET).toString('hex')\n }\n\n receiverAddressB20(): string {\n return bytes32ToEthAddress(this.receiver())\n }\n\n guid(): string {\n return '0x' + this.buffer.slice(GUID_OFFSET, MESSAGE_OFFSET).toString('hex')\n }\n\n message(): string {\n return '0x' + this.buffer.slice(MESSAGE_OFFSET).toString('hex')\n }\n\n payloadHash(): string {\n return keccak256(this.payload())\n }\n\n payload(): string {\n return '0x' + this.buffer.slice(GUID_OFFSET).toString('hex')\n }\n\n header(): string {\n return '0x' + this.buffer.slice(0, GUID_OFFSET).toString('hex')\n }\n\n headerHash(): string {\n return keccak256(this.header())\n }\n\n /**\n * deserialize packet from hex string\n * @deprecated use toPacket instead\n */\n decode(): Packet {\n return this.toPacket()\n }\n\n toPacket(): Packet {\n return {\n version: this.version(),\n nonce: this.nonce(),\n srcEid: this.srcEid(),\n sender: this.sender(),\n dstEid: this.dstEid(),\n receiver: this.receiver(),\n guid: this.guid(),\n message: this.message(),\n // derived\n payload: this.payload(),\n }\n }\n}\n\nexport function calculateGuid(packetHead: PacketHeader): string {\n return keccak256(\n ethers.utils.solidityPack(\n ['uint64', 'uint32', 'bytes32', 'uint32', 'bytes32'],\n [\n ethers.BigNumber.from(packetHead.nonce),\n packetHead.srcEid,\n addressToBytes32(packetHead.sender),\n packetHead.dstEid,\n addressToBytes32(packetHead.receiver),\n ]\n )\n )\n}\n\nexport function keccak256(message: string): string {\n return ethers.utils.keccak256(message)\n}\n","import { Packet } from '../model'\n\nimport { PacketV1Codec } from './packet-v1-codec'\n\nexport class PacketSerializer {\n static serialize(packet: Packet): string {\n return PacketV1Codec.encode(packet)\n }\n\n static deserialize(bytesLike: Uint8Array | string): Packet {\n let codec: PacketV1Codec\n if (bytesLike instanceof Uint8Array) {\n codec = PacketV1Codec.fromBytes(bytesLike)\n } else {\n codec = PacketV1Codec.from(bytesLike)\n }\n return codec.toPacket()\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/utils.ts","../src/utils/hex.ts","../src/utils/precrime.ts","../src/utils/parse-error.ts","../src/options/options.ts","../src/model/packet.ts","../src/codec/packet-v1-codec.ts","../src/codec/packet-serializer.ts"],"names":["arrayify","hexlify","OptionType","WorkerId","ExecutorOptionType","VerifierOptionType","BigNumber","solidityPack","keccak256"],"mappings":"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","sourcesContent":["export async function sleep(timeout: number) {\n await new Promise((resolve) => setTimeout(resolve, timeout))\n}\n","import { getAddress } from '@ethersproject/address'\nimport { arrayify, hexZeroPad, hexlify } from '@ethersproject/bytes'\nimport { PublicKey } from '@solana/web3.js'\n\nexport function hexZeroPadTo32(addr: string): string {\n return hexZeroPad(addr, 32)\n}\n\nexport function bytes32ToEthAddress(bytes32: string | Uint8Array): string {\n if (bytes32 instanceof Uint8Array) {\n bytes32 = hexlify(bytes32)\n }\n return getAddress(bytes32.slice(-40))\n}\n\nexport function trim0x(str: string): string {\n return str.replace(/^0x/, '')\n}\n\n/**\n * Convert address to bytes32\n * @param address 0x prefixed address(20bytes or 32bytes) or solana address\n */\nexport function addressToBytes32(address: string): Uint8Array {\n if (isSolanaAddress(address)) {\n return new PublicKey(address).toBytes()\n } else if (address.startsWith('0x') && address.length <= 66) {\n return arrayify(hexZeroPadTo32(address))\n }\n throw new Error('Invalid address')\n}\n\nconst solanaAddressRegex = /^([1-9A-HJ-NP-Za-km-z]{32,44})$/\n\nexport function isSolanaAddress(address: string): boolean {\n return solanaAddressRegex.test(address)\n}\n","import { PreCrimePeer, PrecrimeConfig, PrecrimeConfigV1, PrecrimeConfigV2 } from '../model'\n\nimport { trim0x } from './hex'\n\nconst CONFIG_VERSION_OFFSET = 0\nconst MAX_BATCH_SIZE_OFFSET = 2\nconst NUMBER_OF_PEERS_OFFSET = 10\nconst PEERS_OFFSET = 12\n\nexport function parsePrecrimeConfig(precrimeConfig: string): PrecrimeConfig {\n const data = trim0x(precrimeConfig)\n const version = parseInt(data.slice(0, 4), 16)\n if (version === 1) {\n return parsePrecrimeConfigV1(precrimeConfig)\n } else if (version === 2) {\n return parsePrecrimeConfigV2(precrimeConfig)\n }\n throw new Error(`Unsupported precrime config version: ${version}`)\n}\n\nfunction parsePrecrimeConfigV1(precrimeConfig: string): PrecrimeConfigV1 {\n const data = trim0x(precrimeConfig)\n const version = parseInt(data.slice(0, 4), 16)\n const maxBatchSize = parseInt(data.slice(4, 20), 16)\n const remoteChainsLength = parseInt(data.slice(20, 84), 16)\n const remoteChainsBytes = data.slice(84, 84 + remoteChainsLength * 64)\n const remoteAddressesBytes = data.slice(\n 84 + remoteChainsLength * 64,\n 84 + remoteChainsLength * 64 + remoteChainsLength * 64\n )\n\n const remoteChainsBytesArray: number[] = []\n const remoteAddressesBytesArray: string[] = []\n let start = 0\n let end = 64\n for (let i = 0; i < remoteChainsLength; i++) {\n remoteChainsBytesArray.push(parseInt(remoteChainsBytes.slice(start, end), 16))\n remoteAddressesBytesArray.push(`0x${remoteAddressesBytes.slice(start, end)}`)\n start += 64\n end += 64\n }\n return { version, maxBatchSize, remoteEids: remoteChainsBytesArray, remoteAddresses: remoteAddressesBytesArray }\n}\n\nfunction parsePrecrimeConfigV2(precrimeConfig: string): PrecrimeConfigV2 {\n const buffer = Buffer.from(trim0x(precrimeConfig), 'hex')\n const version = buffer.readUInt16BE(CONFIG_VERSION_OFFSET)\n const maxBatchSize = buffer.readBigUint64BE(MAX_BATCH_SIZE_OFFSET)\n const peers = new Array<PreCrimePeer>()\n if (buffer.length > NUMBER_OF_PEERS_OFFSET) {\n const numOfPeers = buffer.readUInt16BE(NUMBER_OF_PEERS_OFFSET)\n for (let i = 0; i < numOfPeers; i++) {\n const offset = PEERS_OFFSET + i * (4 + 2 * 32)\n const eid = buffer.readUInt32BE(offset)\n const preCrimeAddress = '0x' + buffer.slice(offset + 4, offset + 4 + 32).toString('hex')\n const oappAddress = '0x' + buffer.slice(offset + 4 + 32, offset + 4 + 32 + 32).toString('hex')\n peers.push({\n eid,\n preCrimeAddress,\n oappAddress,\n })\n }\n }\n return {\n version,\n maxBatchSize,\n peers,\n }\n}\n","import { type Interface, defaultAbiCoder } from '@ethersproject/abi'\n\nexport const parseError = (\n errorData: string,\n intf?: Interface\n): ReturnType<Interface['parseError']> | string | undefined => {\n const buildInError = parseBuildInError(errorData)\n if (buildInError !== undefined) {\n return buildInError\n }\n\n if (intf) {\n try {\n return intf.parseError(errorData)\n } catch (e) {\n console.error(e)\n }\n }\n}\n\nfunction parseBuildInError(errorData: string): string | undefined {\n if (errorData.startsWith('0x08c379a0')) {\n // decode Error(string)\n\n const content = `0x${errorData.substring(10)}`\n const reason = defaultAbiCoder.decode(['string'], content)\n\n return reason[0] // reason: string; for standard revert error string\n }\n\n if (errorData.startsWith('0x4e487b71')) {\n // decode Panic(uint)\n const content = `0x${errorData.substring(10)}`\n const code = defaultAbiCoder.decode(['uint'], content)\n\n return code[0]\n }\n\n if (errorData === '0x') {\n return ''\n }\n}\n","import { BigNumber } from '@ethersproject/bignumber'\nimport { arrayify, hexlify } from '@ethersproject/bytes'\nimport { pack as solidityPack } from '@ethersproject/solidity'\nimport invariant from 'tiny-invariant'\n\nimport { hexZeroPadTo32, trim0x } from '../utils'\n\n// gasLimit input type\nexport type GasLimit = string | number | bigint\n\n// native drop input type\nexport type NativeDrop = string | number | bigint\n\n/**\n * Enumerates the supported option types.\n */\nexport enum OptionType {\n /**\n * Allows the specification of the gas allowance for the remote executor transaction, measured in destination gas\n * units.\n *\n * Format:\n * bytes [2 32 ]\n * fields [type extraGas]\n */\n TYPE_1 = 1,\n\n /**\n * Combines the functionality of TYPE_1 along with destination gas drop to a remote address.\n *\n * Format:\n * bytes [2 32 32 bytes[] ]\n * fields [type extraGas dstNativeAmt dstNativeAddress]\n */\n TYPE_2 = 2,\n\n /**\n * EndpointV2 specific options.\n */\n TYPE_3 = 3,\n}\n\nconst MAX_UINT_128 = BigNumber.from('0xffffffffffffffffffffffffffffffff')\n\n/**\n * Builds OptionsType.TYPE_1.\n *\n * @param {GasLimit} _extraGas The gas allowance for the remote executor transaction, measured in destination gas units.\n */\nexport function optionsType1(_extraGas: GasLimit): string {\n const extraGas = BigNumber.from(_extraGas)\n invariant(extraGas.lte(MAX_UINT_128), 'extraGas should be less than MAX_UINT_128')\n return solidityPack(['uint16', 'uint256'], [OptionType.TYPE_1, extraGas])\n}\n\n/**\n * Builds OptionsType.TYPE_2.\n *\n * @param {GasLimit} _extraGas The gas allowance for the remote executor transaction, measured in destination gas units.\n * @param {NativeDrop} _dstNativeAmt The amount of native token to be sent to the destination chain.\n * @param {string} _dstNativeAddress The destination address of _dstNativeAmt.\n */\nexport function optionsType2(_extraGas: GasLimit, _dstNativeAmt: NativeDrop, _dstNativeAddress: string): string {\n const extraGas = BigNumber.from(_extraGas)\n invariant(extraGas.lte(MAX_UINT_128), 'extraGas should be less than MAX_UINT_128')\n const dstNativeAmt = BigNumber.from(_dstNativeAmt)\n invariant(dstNativeAmt.lte(MAX_UINT_128), 'dstNativeAmt should be less than MAX_UINT_128')\n return solidityPack(\n ['uint16', 'uint256', 'uint256', 'bytes'],\n [OptionType.TYPE_2, BigNumber.from(extraGas), BigNumber.from(dstNativeAmt), _dstNativeAddress]\n )\n}\n\n/**\n * Enumerates the supported worker IDs.\n */\nexport enum WorkerId {\n EXECUTOR = 1,\n VERIFIER = 2,\n TREASURY = 255,\n}\n\nexport type WorkerOptions = {\n workerId: number // uint8\n options: Option[] // toBytes: num(uint8),[type(uint8),size(uint16),data],[type(uint8),size(uint16),data],[type(uint8),size(uint16),data]...\n}\n\nexport type Option = {\n type: number // uint8\n params: string // bytes\n}\n\nexport type VerifierOption = Option & {\n index: number // uint8\n}\n\n/**\n * Enumerates the supported executor option types.\n */\nexport enum ExecutorOptionType {\n LZ_RECEIVE = 1,\n NATIVE_DROP = 2,\n COMPOSE = 3,\n ORDERED = 4,\n}\n\n/**\n * Enumerates the supported verifier option types.\n */\nexport enum VerifierOptionType {\n PRECRIME = 1,\n}\n\n/**\n * Options builder, available only for EndpointV2.\n */\nexport class Options {\n protected workerOptions: WorkerOptions[] = []\n\n // dissuade public instantiation\n protected constructor() {}\n\n /**\n * Create a new options instance.\n */\n public static newOptions(): Options {\n return new Options()\n }\n\n /**\n * Create an options instance from a hex string.\n * @param {string} optionsHex The hex string to decode.\n */\n public static fromOptions(optionsHex: string): Options {\n const options = new Options()\n const optionsBytes = arrayify(optionsHex)\n // 0-2 bytes is options type\n const optionsType = BigNumber.from(optionsBytes.slice(0, 2)).toNumber()\n if (optionsType === OptionType.TYPE_3) {\n let cursor = 2\n while (cursor < optionsBytes.byteLength) {\n const workerId = BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n\n const size = BigNumber.from(optionsBytes.slice(cursor, cursor + 2)).toNumber()\n cursor += 2\n\n if (workerId === WorkerId.EXECUTOR) {\n const optionType = BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n const params = optionsBytes.slice(cursor, cursor + size - 1)\n cursor += size - 1\n options.addOption(workerId, { type: optionType, params: hexlify(params) })\n } else if (workerId === WorkerId.VERIFIER) {\n const verifierIdx = BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n const optionType = BigNumber.from(optionsBytes.slice(cursor, cursor + 1)).toNumber()\n cursor += 1\n const params = optionsBytes.slice(cursor, cursor + size - 2)\n cursor += size - 2\n options.addOption(workerId, <VerifierOption>{\n type: optionType,\n index: verifierIdx,\n params: hexlify(params),\n })\n }\n // TODO - other workerId\n }\n } else if (optionsType === OptionType.TYPE_2) {\n const extraGas = BigNumber.from(optionsBytes.slice(2, 34)).toBigInt()\n const dstNativeAmt = BigNumber.from(optionsBytes.slice(34, 66)).toBigInt()\n const dstNativeAddress = hexlify(optionsBytes.slice(66, optionsBytes.byteLength))\n options.addExecutorLzReceiveOption(extraGas).addExecutorNativeDropOption(dstNativeAmt, dstNativeAddress)\n } else if (optionsType === OptionType.TYPE_1) {\n const extraGas = BigNumber.from(optionsBytes.slice(2, 34)).toBigInt()\n options.addExecutorLzReceiveOption(extraGas)\n }\n\n return options\n }\n\n /**\n * Add ExecutorOptionType.LZ_RECEIVE option.\n * @param {GasLimit} gasLimit\n * @param {NativeDrop} nativeDrop\n */\n public addExecutorLzReceiveOption(gasLimit: GasLimit, nativeDrop: NativeDrop = 0): Options {\n const gasLimitBN = BigNumber.from(gasLimit)\n invariant(gasLimitBN.lte(MAX_UINT_128), \"gasLimit shouldn't be greater than MAX_UINT_128\")\n const nativeDropBN = BigNumber.from(nativeDrop)\n invariant(nativeDropBN.lte(MAX_UINT_128), \"value shouldn't be greater than MAX_UINT_128\")\n this.addOption(WorkerId.EXECUTOR, {\n type: ExecutorOptionType.LZ_RECEIVE,\n params: nativeDropBN.eq(0)\n ? solidityPack(['uint128'], [gasLimitBN])\n : solidityPack(['uint128', 'uint128'], [gasLimitBN, nativeDropBN]),\n })\n return this\n }\n\n /**\n * Add ExecutorOptionType.NATIVE_DROP option.\n * @param {NativeDrop} nativeDrop\n * @param {string} receiver\n */\n public addExecutorNativeDropOption(nativeDrop: NativeDrop, receiver: string): Options {\n const amountBN = BigNumber.from(nativeDrop)\n invariant(amountBN.lte(MAX_UINT_128), \"nativeDrop shouldn't be greater than MAX_UINT_128\")\n this.addOption(WorkerId.EXECUTOR, {\n type: ExecutorOptionType.NATIVE_DROP,\n params: solidityPack(['uint128', 'bytes32'], [amountBN, hexZeroPadTo32(receiver)]),\n })\n return this\n }\n\n /**\n * Add ExecutorOptionType.COMPOSE option.\n * @param {number} index\n * @param {GasLimit} gasLimit\n * @param {NativeDrop} nativeDrop\n */\n public addExecutorComposeOption(index: number, gasLimit: GasLimit, nativeDrop: NativeDrop = 0): Options {\n const gasLimitBN = BigNumber.from(gasLimit)\n invariant(gasLimitBN.lte(MAX_UINT_128), \"gasLimit shouldn't be greater than MAX_UINT_128\")\n const nativeDropBN = BigNumber.from(nativeDrop)\n invariant(nativeDropBN.lte(MAX_UINT_128), \"nativeDrop shouldn't be greater than MAX_UINT_128\")\n const option = nativeDropBN.gt(0)\n ? {\n type: ExecutorOptionType.COMPOSE,\n params: solidityPack(['uint16', 'uint128', 'uint128'], [index, gasLimitBN, nativeDropBN]),\n }\n : {\n type: ExecutorOptionType.COMPOSE,\n params: solidityPack(['uint16', 'uint128'], [index, gasLimitBN]),\n }\n\n this.addOption(WorkerId.EXECUTOR, option)\n return this\n }\n\n /**\n * Add ExecutorOptionType.ORDERED option.\n */\n public addExecutorOrderedExecutionOption(): Options {\n this.addOption(WorkerId.EXECUTOR, {\n type: ExecutorOptionType.ORDERED,\n params: '0x',\n })\n return this\n }\n\n /**\n * Add VerifierOptionType.PRECRIME option.\n * @param {number} verifierIdx\n */\n public addVerifierPrecrimeOption(verifierIdx: number): Options {\n this.addOption(WorkerId.VERIFIER, <VerifierOption>{\n type: VerifierOptionType.PRECRIME,\n index: verifierIdx,\n params: '0x',\n })\n return this\n }\n\n /**\n * Serialize Options to hex string.\n */\n public toHex(): string {\n // output encoded hex, type(uint16)\n let hex = solidityPack(['uint16'], [OptionType.TYPE_3])\n this.workerOptions.forEach((w) => {\n for (const option of w.options) {\n if (w.workerId === WorkerId.EXECUTOR) {\n hex += trim0x(\n solidityPack(\n ['uint8', 'uint16', 'uint8', 'bytes'],\n [w.workerId, trim0x(option.params).length / 2 + 1, option.type, option.params]\n )\n )\n } else if (w.workerId === WorkerId.VERIFIER) {\n const verifierOption = option as VerifierOption\n hex += trim0x(\n solidityPack(\n ['uint8', 'uint16', 'uint8', 'uint8', 'bytes'],\n [\n w.workerId,\n trim0x(option.params).length / 2 + 2,\n verifierOption.index,\n verifierOption.type,\n verifierOption.params,\n ]\n )\n )\n }\n // TODO other workerId\n }\n })\n return hex\n }\n\n /**\n * Serialize Options to Uint8Array.\n */\n public toBytes(): Uint8Array {\n return arrayify(this.toHex())\n }\n\n private addOption(workerId: number, option: Option): void {\n const worker = this.workerOptions.find((w) => w.workerId === workerId)\n if (worker) {\n worker.options.push(option)\n } else {\n this.workerOptions.push({ workerId, options: [option] })\n }\n }\n\n /**\n * Decode ExecutorOptionType.LZ_RECEIVE option. Returns undefined if the option is not present.\n */\n public decodeExecutorLzReceiveOption(): { gas: bigint; value: bigint } | undefined {\n const options = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.LZ_RECEIVE) as Option[]\n if (!options || options.length === 0) {\n return\n }\n let totalGas = BigNumber.from(0).toBigInt()\n let totalValue = BigNumber.from(0).toBigInt()\n for (const option of options) {\n const buffer = Buffer.from(trim0x(option.params), 'hex')\n const gas = BigNumber.from(buffer.subarray(0, 16)).toBigInt()\n if (buffer.length === 16) {\n return { gas, value: BigNumber.from(0).toBigInt() }\n }\n const value = BigNumber.from(buffer.subarray(16, 32)).toBigInt()\n totalGas = totalGas + gas\n totalValue = totalValue + value\n }\n\n return { gas: totalGas, value: totalValue }\n }\n\n /**\n * Decode ExecutorOptionType.NATIVE_DROP options. Returns undefined if the options is not present.\n */\n public decodeExecutorNativeDropOption(): { amount: bigint; receiver: string }[] {\n const options = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.NATIVE_DROP) as Option[]\n if (!options || options.length === 0) {\n return []\n }\n\n const results = options.reduce((acc: { [key: string]: { amount: bigint; receiver: string } }, cur: Option) => {\n const buffer = Buffer.from(trim0x(cur.params), 'hex')\n const amount = BigNumber.from(buffer.subarray(0, 16)).toBigInt()\n const receiver = hexlify(buffer.subarray(16, 48))\n if (acc[receiver]) {\n acc[receiver]['amount'] = acc[receiver].amount + amount\n } else {\n acc[receiver] = { amount, receiver }\n }\n return acc\n }, {})\n return Object.values(results)\n }\n\n /**\n * Decode ExecutorOptionType.COMPOSE options. Returns undefined if the options is not present.\n */\n public decodeExecutorComposeOption(): { index: number; gas: bigint; value: bigint }[] {\n const options = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.COMPOSE) as Option[]\n if (!options || options.length === 0) {\n return []\n }\n const results = options.reduce(\n (acc: { [key: number]: { index: number; gas: bigint; value: bigint } }, cur: Option) => {\n const buffer = Buffer.from(trim0x(cur.params), 'hex')\n const index = BigNumber.from(buffer.subarray(0, 2)).toNumber()\n const gas = BigNumber.from(buffer.subarray(2, 18)).toBigInt()\n const value = (\n buffer.length === 34 ? BigNumber.from(buffer.subarray(18, 34)) : BigNumber.from(0)\n ).toBigInt()\n if (acc[index]) {\n acc[index]['gas'] = acc[index].gas + gas\n acc[index]['value'] = acc[index].value + value\n } else {\n acc[index] = { index, gas, value }\n }\n return acc\n },\n {}\n )\n return Object.values(results)\n }\n\n /**\n * Decode ExecutorOptionType.ORDERED options. Returns undefined if the options is not present.\n */\n public decodeExecutorOrderedExecutionOption(): boolean {\n const option = this.findOptions(WorkerId.EXECUTOR, ExecutorOptionType.ORDERED) as Option\n return option !== undefined\n }\n\n private findOptions(workerId: number, optionType: number): Option[] | Option | undefined {\n const worker = this.workerOptions.find((w) => w.workerId === workerId)\n if (worker) {\n if (optionType === ExecutorOptionType.ORDERED) {\n return worker.options.find((o) => o.type === optionType)\n }\n return worker.options.filter((o) => o.type === optionType)\n }\n }\n\n /**\n * Find VerifierOption by verifierIdx and optionType. Returns undefined if the option is not present.\n * @param {number} verifierIdx\n * @param {number} optionType\n */\n public findVerifierOption(verifierIdx: number, optionType: number): VerifierOption | undefined {\n const worker = this.workerOptions.find((w) => w.workerId === WorkerId.VERIFIER)\n if (worker) {\n const opt = worker.options.find((o) => o.type === optionType && (o as VerifierOption).index === verifierIdx)\n if (opt) {\n return opt as VerifierOption\n }\n }\n }\n}\n","export type PacketPath = {\n srcEid: number\n sender: string\n dstEid: number\n receiver: string\n}\n\nexport type PacketHeader = {\n version: number\n nonce: string\n} & PacketPath\n\nexport type Packet = PacketHeader & {\n guid: string\n message: string\n // derived\n payload: string // payload = guid + message\n}\n\n// message origin\nexport type MessageOrigin = {\n srcEid: number\n sender: string\n nonce: string\n}\n\nexport function packetToMessageOrigin(packet: Packet): MessageOrigin {\n return {\n srcEid: packet.srcEid,\n sender: packet.sender,\n nonce: packet.nonce,\n }\n}\n","import { BigNumber } from '@ethersproject/bignumber'\nimport { keccak256 } from '@ethersproject/keccak256'\nimport { pack as solidityPack } from '@ethersproject/solidity'\n\nimport { Packet, PacketHeader } from '../model'\nimport { addressToBytes32, bytes32ToEthAddress, hexZeroPadTo32, trim0x } from '../utils'\n\n// header (version + path + guid)\n// version\nconst PACKET_VERSION_OFFSET = 0\n// nonce\nconst NONCE_OFFSET = 1\n// path\nconst SRC_CHAIN_OFFSET = 9\nconst SRC_ADDRESS_OFFSET = 13\nconst DST_CHAIN_OFFSET = 45\nconst DST_ADDRESS_OFFSET = 49\n// payload (guid + message)\nconst GUID_OFFSET = 81 // keccak256(nonce + path)\nconst MESSAGE_OFFSET = 113\n\nexport class PacketV1Codec {\n buffer: Buffer\n\n static from(payloadEncoded: string): PacketV1Codec {\n return new PacketV1Codec(payloadEncoded)\n }\n\n static fromBytes(payload: Uint8Array): PacketV1Codec {\n return new PacketV1Codec('0x' + Buffer.from(payload).toString('hex'))\n }\n\n protected constructor(payloadEncoded: string) {\n this.buffer = Buffer.from(trim0x(payloadEncoded), 'hex')\n }\n\n /**\n * encode packet to hex string\n */\n static encode(packet: Packet): string {\n const message = trim0x(packet.message)\n const buffer = Buffer.alloc(MESSAGE_OFFSET + message.length / 2)\n buffer.writeUInt8(packet.version, PACKET_VERSION_OFFSET)\n buffer.writeBigUInt64BE(BigInt(packet.nonce), NONCE_OFFSET)\n buffer.writeUInt32BE(packet.srcEid, SRC_CHAIN_OFFSET)\n buffer.write(trim0x(hexZeroPadTo32(packet.sender)), SRC_ADDRESS_OFFSET, 32, 'hex')\n buffer.writeUInt32BE(packet.dstEid, DST_CHAIN_OFFSET)\n buffer.write(trim0x(hexZeroPadTo32(packet.receiver)), DST_ADDRESS_OFFSET, 32, 'hex')\n buffer.write(trim0x(packet.guid), GUID_OFFSET, 32, 'hex')\n buffer.write(message, MESSAGE_OFFSET, message.length / 2, 'hex')\n return '0x' + buffer.toString('hex')\n }\n\n version(): number {\n return this.buffer.readUInt8(PACKET_VERSION_OFFSET)\n }\n\n nonce(): string {\n return this.buffer.readBigUint64BE(NONCE_OFFSET).toString()\n }\n\n srcEid(): number {\n return this.buffer.readUint32BE(SRC_CHAIN_OFFSET)\n }\n\n sender(): string {\n return '0x' + this.buffer.slice(SRC_ADDRESS_OFFSET, DST_CHAIN_OFFSET).toString('hex')\n }\n\n senderAddressB20(): string {\n return bytes32ToEthAddress(this.sender())\n }\n\n dstEid(): number {\n return this.buffer.readUint32BE(DST_CHAIN_OFFSET)\n }\n\n receiver(): string {\n return '0x' + this.buffer.slice(DST_ADDRESS_OFFSET, GUID_OFFSET).toString('hex')\n }\n\n receiverAddressB20(): string {\n return bytes32ToEthAddress(this.receiver())\n }\n\n guid(): string {\n return '0x' + this.buffer.slice(GUID_OFFSET, MESSAGE_OFFSET).toString('hex')\n }\n\n message(): string {\n return '0x' + this.buffer.slice(MESSAGE_OFFSET).toString('hex')\n }\n\n payloadHash(): string {\n return keccak256(this.payload())\n }\n\n payload(): string {\n return '0x' + this.buffer.slice(GUID_OFFSET).toString('hex')\n }\n\n header(): string {\n return '0x' + this.buffer.slice(0, GUID_OFFSET).toString('hex')\n }\n\n headerHash(): string {\n return keccak256(this.header())\n }\n\n /**\n * deserialize packet from hex string\n * @deprecated use toPacket instead\n */\n decode(): Packet {\n return this.toPacket()\n }\n\n toPacket(): Packet {\n return {\n version: this.version(),\n nonce: this.nonce(),\n srcEid: this.srcEid(),\n sender: this.sender(),\n dstEid: this.dstEid(),\n receiver: this.receiver(),\n guid: this.guid(),\n message: this.message(),\n // derived\n payload: this.payload(),\n }\n }\n}\n\nexport function calculateGuid(packetHead: PacketHeader): string {\n return keccak256(\n solidityPack(\n ['uint64', 'uint32', 'bytes32', 'uint32', 'bytes32'],\n [\n BigNumber.from(packetHead.nonce),\n packetHead.srcEid,\n addressToBytes32(packetHead.sender),\n packetHead.dstEid,\n addressToBytes32(packetHead.receiver),\n ]\n )\n )\n}\n\nexport { keccak256 } from '@ethersproject/keccak256'\n","import { Packet } from '../model'\n\nimport { PacketV1Codec } from './packet-v1-codec'\n\nexport class PacketSerializer {\n static serialize(packet: Packet): string {\n return PacketV1Codec.encode(packet)\n }\n\n static deserialize(bytesLike: Uint8Array | string): Packet {\n let codec: PacketV1Codec\n if (bytesLike instanceof Uint8Array) {\n codec = PacketV1Codec.fromBytes(bytesLike)\n } else {\n codec = PacketV1Codec.from(bytesLike)\n }\n return codec.toPacket()\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layerzerolabs/lz-v2-utilities",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.7",
|
|
4
4
|
"description": "LayerZero Utility V2",
|
|
5
5
|
"license": "BUSL-1.1",
|
|
6
6
|
"type": "module",
|
|
@@ -22,15 +22,20 @@
|
|
|
22
22
|
"test": "jest"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@
|
|
25
|
+
"@ethersproject/abi": "^5.7.0",
|
|
26
|
+
"@ethersproject/address": "^5.7.0",
|
|
27
|
+
"@ethersproject/bignumber": "^5.7.0",
|
|
28
|
+
"@ethersproject/bytes": "^5.7.0",
|
|
29
|
+
"@ethersproject/keccak256": "^5.7.0",
|
|
30
|
+
"@ethersproject/solidity": "^5.7.0",
|
|
31
|
+
"@layerzerolabs/lz-evm-sdk-v2": "^2.1.7",
|
|
26
32
|
"@solana/web3.js": "^1.87.6",
|
|
27
|
-
"ethers": "^5.7.2",
|
|
28
33
|
"tiny-invariant": "^1.3.1"
|
|
29
34
|
},
|
|
30
35
|
"devDependencies": {
|
|
31
36
|
"@jest/globals": "^29.7.0",
|
|
32
|
-
"@layerzerolabs/tsup-config-next": "^2.1.
|
|
33
|
-
"@layerzerolabs/typescript-config-next": "^2.1.
|
|
37
|
+
"@layerzerolabs/tsup-config-next": "^2.1.7",
|
|
38
|
+
"@layerzerolabs/typescript-config-next": "^2.1.7",
|
|
34
39
|
"@types/jest": "^29.5.10",
|
|
35
40
|
"jest": "^29.7.0",
|
|
36
41
|
"rimraf": "^5.0.5",
|