ponder 0.8.23 → 0.8.25
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/bin/ponder.js +476 -229
- package/dist/bin/ponder.js.map +1 -1
- package/package.json +1 -1
- package/src/indexing/service.ts +4 -1
- package/src/sync/fragments.ts +347 -80
- package/src/sync/index.ts +12 -4
- package/src/sync/source.ts +20 -23
- package/src/sync-historical/index.ts +100 -62
- package/src/sync-store/index.ts +42 -27
- package/src/utils/interval.ts +13 -0
package/dist/bin/ponder.js
CHANGED
|
@@ -6102,6 +6102,8 @@ var processSetupEvents = async (indexingService, {
|
|
|
6102
6102
|
const source = sources.find(
|
|
6103
6103
|
(s) => s.type === "contract" && s.name === contractName && s.filter.chainId === network.chainId
|
|
6104
6104
|
);
|
|
6105
|
+
if (source === void 0)
|
|
6106
|
+
continue;
|
|
6105
6107
|
if (indexingService.isKilled)
|
|
6106
6108
|
return { status: "killed" };
|
|
6107
6109
|
indexingService.eventCount[eventName]++;
|
|
@@ -6376,74 +6378,93 @@ var methods = {
|
|
|
6376
6378
|
var createIndexingService = extend(create, methods);
|
|
6377
6379
|
|
|
6378
6380
|
// src/sync/fragments.ts
|
|
6379
|
-
var
|
|
6381
|
+
var getFragments = (filter) => {
|
|
6380
6382
|
switch (filter.type) {
|
|
6381
6383
|
case "block":
|
|
6382
|
-
return
|
|
6384
|
+
return getBlockFilterFragment(filter);
|
|
6383
6385
|
case "transaction":
|
|
6384
|
-
return
|
|
6386
|
+
return getTransactionFilterFragments(filter);
|
|
6385
6387
|
case "trace":
|
|
6386
|
-
return
|
|
6388
|
+
return getTraceFilterFragments(filter);
|
|
6387
6389
|
case "log":
|
|
6388
|
-
return
|
|
6390
|
+
return getLogFilterFragments(filter);
|
|
6389
6391
|
case "transfer":
|
|
6390
|
-
return
|
|
6392
|
+
return getTransferFilterFragments(filter);
|
|
6391
6393
|
}
|
|
6392
6394
|
};
|
|
6393
|
-
var
|
|
6395
|
+
var getAddressFragments = (address) => {
|
|
6394
6396
|
const fragments = [];
|
|
6395
6397
|
if (isAddressFactory(address)) {
|
|
6396
6398
|
for (const fragmentAddress of Array.isArray(address.address) ? address.address : [address.address]) {
|
|
6397
|
-
const
|
|
6398
|
-
|
|
6399
|
+
const fragment = {
|
|
6400
|
+
address: fragmentAddress,
|
|
6401
|
+
eventSelector: address.eventSelector,
|
|
6402
|
+
childAddressLocation: address.childAddressLocation
|
|
6403
|
+
};
|
|
6404
|
+
fragments.push({
|
|
6405
|
+
fragment,
|
|
6406
|
+
adjacentIds: [
|
|
6407
|
+
`${fragmentAddress}_${address.eventSelector}_${address.childAddressLocation}`
|
|
6408
|
+
]
|
|
6409
|
+
});
|
|
6399
6410
|
}
|
|
6400
6411
|
} else {
|
|
6401
6412
|
for (const fragmentAddress of Array.isArray(address) ? address : [address ?? null]) {
|
|
6402
6413
|
fragments.push({
|
|
6403
|
-
|
|
6404
|
-
|
|
6414
|
+
fragment: fragmentAddress,
|
|
6415
|
+
adjacentIds: fragmentAddress ? [fragmentAddress, null] : [fragmentAddress]
|
|
6405
6416
|
});
|
|
6406
6417
|
}
|
|
6407
6418
|
}
|
|
6408
6419
|
return fragments;
|
|
6409
6420
|
};
|
|
6410
|
-
var
|
|
6421
|
+
var getBlockFilterFragment = ({
|
|
6411
6422
|
chainId,
|
|
6412
6423
|
interval,
|
|
6413
6424
|
offset
|
|
6414
6425
|
}) => {
|
|
6415
6426
|
return [
|
|
6416
6427
|
{
|
|
6417
|
-
|
|
6418
|
-
|
|
6428
|
+
fragment: {
|
|
6429
|
+
type: "block",
|
|
6430
|
+
chainId,
|
|
6431
|
+
interval,
|
|
6432
|
+
offset
|
|
6433
|
+
},
|
|
6434
|
+
adjacentIds: [`block_${chainId}_${interval}_${offset}`]
|
|
6419
6435
|
}
|
|
6420
6436
|
];
|
|
6421
6437
|
};
|
|
6422
|
-
var
|
|
6438
|
+
var getTransactionFilterFragments = ({
|
|
6423
6439
|
chainId,
|
|
6424
6440
|
fromAddress,
|
|
6425
6441
|
toAddress
|
|
6426
6442
|
}) => {
|
|
6427
6443
|
const fragments = [];
|
|
6428
|
-
const
|
|
6429
|
-
const
|
|
6430
|
-
for (const
|
|
6431
|
-
for (const
|
|
6432
|
-
const
|
|
6433
|
-
|
|
6434
|
-
|
|
6435
|
-
|
|
6436
|
-
|
|
6437
|
-
|
|
6444
|
+
const fromAddressFragments = getAddressFragments(fromAddress);
|
|
6445
|
+
const toAddressFragments = getAddressFragments(toAddress);
|
|
6446
|
+
for (const fromAddressFragment of fromAddressFragments) {
|
|
6447
|
+
for (const toAddressFragment of toAddressFragments) {
|
|
6448
|
+
const fragment = {
|
|
6449
|
+
type: "transaction",
|
|
6450
|
+
chainId,
|
|
6451
|
+
fromAddress: fromAddressFragment.fragment,
|
|
6452
|
+
toAddress: toAddressFragment.fragment
|
|
6453
|
+
};
|
|
6454
|
+
const adjacentIds = [];
|
|
6455
|
+
for (const fromAddressAdjacentId of fromAddressFragment.adjacentIds) {
|
|
6456
|
+
for (const toAddressAdjacentId of toAddressFragment.adjacentIds) {
|
|
6457
|
+
adjacentIds.push(
|
|
6458
|
+
`transaction_${chainId}_${fromAddressAdjacentId}_${toAddressAdjacentId}`
|
|
6438
6459
|
);
|
|
6439
6460
|
}
|
|
6440
6461
|
}
|
|
6441
|
-
fragments.push({
|
|
6462
|
+
fragments.push({ fragment, adjacentIds });
|
|
6442
6463
|
}
|
|
6443
6464
|
}
|
|
6444
6465
|
return fragments;
|
|
6445
6466
|
};
|
|
6446
|
-
var
|
|
6467
|
+
var getTraceFilterFragments = ({
|
|
6447
6468
|
chainId,
|
|
6448
6469
|
fromAddress,
|
|
6449
6470
|
toAddress,
|
|
@@ -6452,32 +6473,39 @@ var getTraceFilterFragmentIds = ({
|
|
|
6452
6473
|
...filter
|
|
6453
6474
|
}) => {
|
|
6454
6475
|
const fragments = [];
|
|
6455
|
-
const
|
|
6456
|
-
const
|
|
6476
|
+
const fromAddressFragments = getAddressFragments(fromAddress);
|
|
6477
|
+
const toAddressFragments = getAddressFragments(toAddress);
|
|
6457
6478
|
const includeTransactionReceipts = shouldGetTransactionReceipt(filter);
|
|
6458
|
-
for (const
|
|
6459
|
-
for (const
|
|
6479
|
+
for (const fromAddressFragment of fromAddressFragments) {
|
|
6480
|
+
for (const toAddressFragment of toAddressFragments) {
|
|
6460
6481
|
for (const fragmentFunctionSelector of Array.isArray(functionSelector) ? functionSelector : [functionSelector]) {
|
|
6461
|
-
const
|
|
6462
|
-
|
|
6463
|
-
|
|
6464
|
-
|
|
6482
|
+
const fragment = {
|
|
6483
|
+
type: "trace",
|
|
6484
|
+
chainId,
|
|
6485
|
+
fromAddress: fromAddressFragment.fragment,
|
|
6486
|
+
toAddress: toAddressFragment.fragment,
|
|
6487
|
+
functionSelector: fragmentFunctionSelector ?? null,
|
|
6488
|
+
includeTransactionReceipts
|
|
6489
|
+
};
|
|
6490
|
+
const adjacentIds = [];
|
|
6491
|
+
for (const fromAddressAdjacentId of fromAddressFragment.adjacentIds) {
|
|
6492
|
+
for (const toAddressAdjacentId of toAddressFragment.adjacentIds) {
|
|
6465
6493
|
for (const adjacentFunctionSelector of fragmentFunctionSelector ? [fragmentFunctionSelector, null] : [null]) {
|
|
6466
6494
|
for (const adjacentTxr of includeTransactionReceipts ? [1] : [0, 1]) {
|
|
6467
|
-
|
|
6468
|
-
`trace_${chainId}_${
|
|
6495
|
+
adjacentIds.push(
|
|
6496
|
+
`trace_${chainId}_${fromAddressAdjacentId}_${toAddressAdjacentId}_${adjacentFunctionSelector}_${adjacentTxr}`
|
|
6469
6497
|
);
|
|
6470
6498
|
}
|
|
6471
6499
|
}
|
|
6472
6500
|
}
|
|
6473
6501
|
}
|
|
6474
|
-
fragments.push({
|
|
6502
|
+
fragments.push({ fragment, adjacentIds });
|
|
6475
6503
|
}
|
|
6476
6504
|
}
|
|
6477
6505
|
}
|
|
6478
6506
|
return fragments;
|
|
6479
6507
|
};
|
|
6480
|
-
var
|
|
6508
|
+
var getLogFilterFragments = ({
|
|
6481
6509
|
chainId,
|
|
6482
6510
|
address,
|
|
6483
6511
|
topic0,
|
|
@@ -6487,23 +6515,32 @@ var getLogFilterFragmentIds = ({
|
|
|
6487
6515
|
...filter
|
|
6488
6516
|
}) => {
|
|
6489
6517
|
const fragments = [];
|
|
6490
|
-
const
|
|
6518
|
+
const addressFragments = getAddressFragments(address);
|
|
6491
6519
|
const includeTransactionReceipts = shouldGetTransactionReceipt(filter);
|
|
6492
|
-
for (const
|
|
6520
|
+
for (const addressFragment of addressFragments) {
|
|
6493
6521
|
for (const fragmentTopic0 of Array.isArray(topic0) ? topic0 : [topic0]) {
|
|
6494
6522
|
for (const fragmentTopic1 of Array.isArray(topic1) ? topic1 : [topic1]) {
|
|
6495
6523
|
for (const fragmentTopic2 of Array.isArray(topic2) ? topic2 : [topic2]) {
|
|
6496
6524
|
for (const fragmentTopic3 of Array.isArray(topic3) ? topic3 : [topic3]) {
|
|
6497
|
-
const
|
|
6498
|
-
|
|
6499
|
-
|
|
6525
|
+
const fragment = {
|
|
6526
|
+
type: "log",
|
|
6527
|
+
chainId,
|
|
6528
|
+
address: addressFragment.fragment,
|
|
6529
|
+
topic0: fragmentTopic0 ?? null,
|
|
6530
|
+
topic1: fragmentTopic1 ?? null,
|
|
6531
|
+
topic2: fragmentTopic2 ?? null,
|
|
6532
|
+
topic3: fragmentTopic3 ?? null,
|
|
6533
|
+
includeTransactionReceipts
|
|
6534
|
+
};
|
|
6535
|
+
const adjacentIds = [];
|
|
6536
|
+
for (const addressAdjacentId of addressFragment.adjacentIds) {
|
|
6500
6537
|
for (const adjacentTopic0 of fragmentTopic0 ? [fragmentTopic0, null] : [null]) {
|
|
6501
6538
|
for (const adjacentTopic1 of fragmentTopic1 ? [fragmentTopic1, null] : [null]) {
|
|
6502
6539
|
for (const adjacentTopic2 of fragmentTopic2 ? [fragmentTopic2, null] : [null]) {
|
|
6503
6540
|
for (const adjacentTopic3 of fragmentTopic3 ? [fragmentTopic3, null] : [null]) {
|
|
6504
6541
|
for (const adjacentTxr of includeTransactionReceipts ? [1] : [0, 1]) {
|
|
6505
|
-
|
|
6506
|
-
`log_${chainId}_${
|
|
6542
|
+
adjacentIds.push(
|
|
6543
|
+
`log_${chainId}_${addressAdjacentId}_${adjacentTopic0}_${adjacentTopic1}_${adjacentTopic2}_${adjacentTopic3}_${adjacentTxr}`
|
|
6507
6544
|
);
|
|
6508
6545
|
}
|
|
6509
6546
|
}
|
|
@@ -6511,7 +6548,7 @@ var getLogFilterFragmentIds = ({
|
|
|
6511
6548
|
}
|
|
6512
6549
|
}
|
|
6513
6550
|
}
|
|
6514
|
-
fragments.push({
|
|
6551
|
+
fragments.push({ fragment, adjacentIds });
|
|
6515
6552
|
}
|
|
6516
6553
|
}
|
|
6517
6554
|
}
|
|
@@ -6519,149 +6556,197 @@ var getLogFilterFragmentIds = ({
|
|
|
6519
6556
|
}
|
|
6520
6557
|
return fragments;
|
|
6521
6558
|
};
|
|
6522
|
-
var
|
|
6559
|
+
var getTransferFilterFragments = ({
|
|
6523
6560
|
chainId,
|
|
6524
6561
|
fromAddress,
|
|
6525
6562
|
toAddress,
|
|
6526
6563
|
...filter
|
|
6527
6564
|
}) => {
|
|
6528
6565
|
const fragments = [];
|
|
6529
|
-
const
|
|
6530
|
-
const
|
|
6566
|
+
const fromAddressFragments = getAddressFragments(fromAddress);
|
|
6567
|
+
const toAddressFragments = getAddressFragments(toAddress);
|
|
6531
6568
|
const includeTransactionReceipts = shouldGetTransactionReceipt(filter);
|
|
6532
|
-
for (const
|
|
6533
|
-
for (const
|
|
6534
|
-
const
|
|
6535
|
-
|
|
6536
|
-
|
|
6537
|
-
|
|
6569
|
+
for (const fromAddressFragment of fromAddressFragments) {
|
|
6570
|
+
for (const toAddressFragment of toAddressFragments) {
|
|
6571
|
+
const fragment = {
|
|
6572
|
+
type: "transfer",
|
|
6573
|
+
chainId,
|
|
6574
|
+
fromAddress: fromAddressFragment.fragment,
|
|
6575
|
+
toAddress: toAddressFragment.fragment,
|
|
6576
|
+
includeTransactionReceipts
|
|
6577
|
+
};
|
|
6578
|
+
const adjacentIds = [];
|
|
6579
|
+
for (const fromAddressAdjacentId of fromAddressFragment.adjacentIds) {
|
|
6580
|
+
for (const toAddressAdjacentId of toAddressFragment.adjacentIds) {
|
|
6538
6581
|
for (const adjacentTxr of includeTransactionReceipts ? [1] : [0, 1]) {
|
|
6539
|
-
|
|
6540
|
-
`transfer_${chainId}_${
|
|
6582
|
+
adjacentIds.push(
|
|
6583
|
+
`transfer_${chainId}_${fromAddressAdjacentId}_${toAddressAdjacentId}_${adjacentTxr}`
|
|
6541
6584
|
);
|
|
6542
6585
|
}
|
|
6543
6586
|
}
|
|
6544
6587
|
}
|
|
6545
|
-
fragments.push({
|
|
6588
|
+
fragments.push({ fragment, adjacentIds });
|
|
6546
6589
|
}
|
|
6547
6590
|
}
|
|
6548
6591
|
return fragments;
|
|
6549
6592
|
};
|
|
6550
|
-
|
|
6551
|
-
|
|
6552
|
-
|
|
6553
|
-
|
|
6554
|
-
|
|
6555
|
-
|
|
6556
|
-
|
|
6557
|
-
|
|
6558
|
-
|
|
6593
|
+
var fragmentAddressToId = (fragmentAddress) => {
|
|
6594
|
+
if (fragmentAddress === null)
|
|
6595
|
+
return null;
|
|
6596
|
+
if (typeof fragmentAddress === "string")
|
|
6597
|
+
return fragmentAddress;
|
|
6598
|
+
return `${fragmentAddress.address}_${fragmentAddress.eventSelector}_${fragmentAddress.childAddressLocation}`;
|
|
6599
|
+
};
|
|
6600
|
+
var fragmentToId = (fragment) => {
|
|
6601
|
+
switch (fragment.type) {
|
|
6602
|
+
case "block":
|
|
6603
|
+
return `block_${fragment.chainId}_${fragment.interval}_${fragment.offset}`;
|
|
6604
|
+
case "transaction":
|
|
6605
|
+
return `transaction_${fragment.chainId}_${fragmentAddressToId(fragment.fromAddress)}_${fragmentAddressToId(fragment.toAddress)}`;
|
|
6606
|
+
case "trace":
|
|
6607
|
+
return `trace_${fragment.chainId}_${fragmentAddressToId(fragment.fromAddress)}_${fragmentAddressToId(fragment.toAddress)}_${fragment.functionSelector}_${fragment.includeTransactionReceipts ? 1 : 0}`;
|
|
6608
|
+
case "log":
|
|
6609
|
+
return `log_${fragment.chainId}_${fragmentAddressToId(fragment.address)}_${fragment.topic0}_${fragment.topic1}_${fragment.topic2}_${fragment.topic3}_${fragment.includeTransactionReceipts ? 1 : 0}`;
|
|
6610
|
+
case "transfer":
|
|
6611
|
+
return `transfer_${fragment.chainId}_${fragmentAddressToId(fragment.fromAddress)}_${fragmentAddressToId(fragment.toAddress)}_${fragment.includeTransactionReceipts ? 1 : 0}`;
|
|
6559
6612
|
}
|
|
6560
|
-
|
|
6561
|
-
|
|
6562
|
-
|
|
6563
|
-
|
|
6564
|
-
|
|
6565
|
-
|
|
6566
|
-
|
|
6567
|
-
|
|
6568
|
-
|
|
6569
|
-
|
|
6570
|
-
|
|
6571
|
-
|
|
6572
|
-
|
|
6573
|
-
|
|
6574
|
-
|
|
6575
|
-
|
|
6613
|
+
};
|
|
6614
|
+
var recoverAddress = (baseAddress, fragmentAddresses) => {
|
|
6615
|
+
if (baseAddress === void 0)
|
|
6616
|
+
return void 0;
|
|
6617
|
+
if (typeof baseAddress === "string")
|
|
6618
|
+
return baseAddress;
|
|
6619
|
+
if (Array.isArray(baseAddress))
|
|
6620
|
+
return dedupe(fragmentAddresses);
|
|
6621
|
+
if (typeof baseAddress.address === "string")
|
|
6622
|
+
return baseAddress;
|
|
6623
|
+
const address = {
|
|
6624
|
+
type: "log",
|
|
6625
|
+
chainId: baseAddress.chainId,
|
|
6626
|
+
address: [],
|
|
6627
|
+
eventSelector: baseAddress.eventSelector,
|
|
6628
|
+
childAddressLocation: baseAddress.childAddressLocation
|
|
6629
|
+
};
|
|
6630
|
+
address.address = dedupe(
|
|
6631
|
+
fragmentAddresses.map(
|
|
6632
|
+
({ address: address2 }) => address2
|
|
6633
|
+
)
|
|
6634
|
+
);
|
|
6635
|
+
return address;
|
|
6636
|
+
};
|
|
6637
|
+
var recoverSelector = (base, fragments) => {
|
|
6638
|
+
if (base === void 0)
|
|
6639
|
+
return void 0;
|
|
6640
|
+
if (typeof base === "string")
|
|
6641
|
+
return base;
|
|
6642
|
+
return dedupe(fragments);
|
|
6643
|
+
};
|
|
6644
|
+
var recoverTopic = (base, fragments) => {
|
|
6645
|
+
if (base === null)
|
|
6646
|
+
return null;
|
|
6647
|
+
if (typeof base === "string")
|
|
6648
|
+
return base;
|
|
6649
|
+
return dedupe(fragments);
|
|
6650
|
+
};
|
|
6651
|
+
var recoverFilter = (baseFilter, fragments) => {
|
|
6652
|
+
switch (baseFilter.type) {
|
|
6653
|
+
case "block": {
|
|
6654
|
+
return baseFilter;
|
|
6576
6655
|
}
|
|
6577
|
-
|
|
6578
|
-
|
|
6579
|
-
|
|
6580
|
-
|
|
6581
|
-
|
|
6582
|
-
|
|
6583
|
-
|
|
6584
|
-
|
|
6585
|
-
|
|
6586
|
-
|
|
6587
|
-
|
|
6588
|
-
|
|
6589
|
-
|
|
6590
|
-
|
|
6591
|
-
|
|
6656
|
+
case "transaction": {
|
|
6657
|
+
return {
|
|
6658
|
+
...baseFilter,
|
|
6659
|
+
fromAddress: recoverAddress(
|
|
6660
|
+
baseFilter.fromAddress,
|
|
6661
|
+
fragments.map(
|
|
6662
|
+
(fragment) => fragment.fromAddress
|
|
6663
|
+
)
|
|
6664
|
+
),
|
|
6665
|
+
toAddress: recoverAddress(
|
|
6666
|
+
baseFilter.toAddress,
|
|
6667
|
+
fragments.map(
|
|
6668
|
+
(fragment) => fragment.toAddress
|
|
6669
|
+
)
|
|
6670
|
+
)
|
|
6671
|
+
};
|
|
6592
6672
|
}
|
|
6593
|
-
|
|
6594
|
-
|
|
6595
|
-
|
|
6596
|
-
|
|
6673
|
+
case "trace": {
|
|
6674
|
+
return {
|
|
6675
|
+
...baseFilter,
|
|
6676
|
+
fromAddress: recoverAddress(
|
|
6677
|
+
baseFilter.fromAddress,
|
|
6678
|
+
fragments.map(
|
|
6679
|
+
(fragment) => fragment.fromAddress
|
|
6680
|
+
)
|
|
6681
|
+
),
|
|
6682
|
+
toAddress: recoverAddress(
|
|
6683
|
+
baseFilter.toAddress,
|
|
6684
|
+
fragments.map(
|
|
6685
|
+
(fragment) => fragment.toAddress
|
|
6686
|
+
)
|
|
6687
|
+
),
|
|
6688
|
+
functionSelector: recoverSelector(
|
|
6689
|
+
baseFilter.functionSelector,
|
|
6690
|
+
fragments.map(
|
|
6691
|
+
(fragment) => fragment.functionSelector
|
|
6692
|
+
)
|
|
6693
|
+
)
|
|
6694
|
+
};
|
|
6597
6695
|
}
|
|
6598
|
-
|
|
6599
|
-
|
|
6600
|
-
|
|
6601
|
-
|
|
6602
|
-
|
|
6603
|
-
|
|
6604
|
-
|
|
6605
|
-
|
|
6606
|
-
|
|
6607
|
-
|
|
6608
|
-
|
|
6609
|
-
|
|
6610
|
-
|
|
6611
|
-
|
|
6612
|
-
|
|
6613
|
-
|
|
6614
|
-
|
|
6615
|
-
|
|
6616
|
-
|
|
6617
|
-
|
|
6618
|
-
|
|
6619
|
-
|
|
6620
|
-
|
|
6621
|
-
|
|
6622
|
-
|
|
6623
|
-
|
|
6624
|
-
|
|
6625
|
-
|
|
6626
|
-
|
|
6627
|
-
|
|
6628
|
-
|
|
6629
|
-
|
|
6630
|
-
|
|
6631
|
-
|
|
6632
|
-
|
|
6633
|
-
|
|
6634
|
-
|
|
6635
|
-
|
|
6696
|
+
case "log": {
|
|
6697
|
+
return {
|
|
6698
|
+
...baseFilter,
|
|
6699
|
+
address: recoverAddress(
|
|
6700
|
+
baseFilter.address,
|
|
6701
|
+
fragments.map(
|
|
6702
|
+
(fragment) => fragment.address
|
|
6703
|
+
)
|
|
6704
|
+
),
|
|
6705
|
+
topic0: recoverTopic(
|
|
6706
|
+
baseFilter.topic0,
|
|
6707
|
+
fragments.map(
|
|
6708
|
+
(fragment) => fragment.topic0
|
|
6709
|
+
)
|
|
6710
|
+
),
|
|
6711
|
+
topic1: recoverTopic(
|
|
6712
|
+
baseFilter.topic1,
|
|
6713
|
+
fragments.map(
|
|
6714
|
+
(fragment) => fragment.topic1
|
|
6715
|
+
)
|
|
6716
|
+
),
|
|
6717
|
+
topic2: recoverTopic(
|
|
6718
|
+
baseFilter.topic2,
|
|
6719
|
+
fragments.map(
|
|
6720
|
+
(fragment) => fragment.topic2
|
|
6721
|
+
)
|
|
6722
|
+
),
|
|
6723
|
+
topic3: recoverTopic(
|
|
6724
|
+
baseFilter.topic3,
|
|
6725
|
+
fragments.map(
|
|
6726
|
+
(fragment) => fragment.topic3
|
|
6727
|
+
)
|
|
6728
|
+
)
|
|
6729
|
+
};
|
|
6730
|
+
}
|
|
6731
|
+
case "transfer": {
|
|
6732
|
+
return {
|
|
6733
|
+
...baseFilter,
|
|
6734
|
+
fromAddress: recoverAddress(
|
|
6735
|
+
baseFilter.fromAddress,
|
|
6736
|
+
fragments.map(
|
|
6737
|
+
(fragment) => fragment.fromAddress
|
|
6738
|
+
)
|
|
6739
|
+
),
|
|
6740
|
+
toAddress: recoverAddress(
|
|
6741
|
+
baseFilter.toAddress,
|
|
6742
|
+
fragments.map(
|
|
6743
|
+
(fragment) => fragment.toAddress
|
|
6744
|
+
)
|
|
6745
|
+
)
|
|
6746
|
+
};
|
|
6636
6747
|
}
|
|
6637
6748
|
}
|
|
6638
|
-
|
|
6639
|
-
result.push(initial_[i]);
|
|
6640
|
-
i++;
|
|
6641
|
-
}
|
|
6642
|
-
return result;
|
|
6643
|
-
}
|
|
6644
|
-
function sortIntervals(intervals) {
|
|
6645
|
-
return intervals.sort((a, b) => a[0] < b[0] ? -1 : 1);
|
|
6646
|
-
}
|
|
6647
|
-
function getChunks({
|
|
6648
|
-
interval,
|
|
6649
|
-
maxChunkSize
|
|
6650
|
-
}) {
|
|
6651
|
-
const _chunks = [];
|
|
6652
|
-
const [startBlock, endBlock] = interval;
|
|
6653
|
-
let fromBlock = startBlock;
|
|
6654
|
-
let toBlock = Math.min(fromBlock + maxChunkSize - 1, endBlock);
|
|
6655
|
-
while (fromBlock <= endBlock) {
|
|
6656
|
-
_chunks.push([fromBlock, toBlock]);
|
|
6657
|
-
fromBlock = toBlock + 1;
|
|
6658
|
-
toBlock = Math.min(fromBlock + maxChunkSize - 1, endBlock);
|
|
6659
|
-
}
|
|
6660
|
-
return _chunks;
|
|
6661
|
-
}
|
|
6662
|
-
function intervalRange(interval) {
|
|
6663
|
-
return range(interval[0], interval[1] + 1);
|
|
6664
|
-
}
|
|
6749
|
+
};
|
|
6665
6750
|
|
|
6666
6751
|
// src/sync-store/index.ts
|
|
6667
6752
|
import { sql as ksql } from "kysely";
|
|
@@ -6864,11 +6949,12 @@ var createSyncStore = ({
|
|
|
6864
6949
|
const perFragmentIntervals = /* @__PURE__ */ new Map();
|
|
6865
6950
|
const values = [];
|
|
6866
6951
|
for (const { filter, interval } of intervals) {
|
|
6867
|
-
for (const fragment of
|
|
6868
|
-
|
|
6869
|
-
|
|
6952
|
+
for (const fragment of getFragments(filter)) {
|
|
6953
|
+
const fragmentId = fragmentToId(fragment.fragment);
|
|
6954
|
+
if (perFragmentIntervals.has(fragmentId) === false) {
|
|
6955
|
+
perFragmentIntervals.set(fragmentId, []);
|
|
6870
6956
|
}
|
|
6871
|
-
perFragmentIntervals.get(
|
|
6957
|
+
perFragmentIntervals.get(fragmentId).push(interval);
|
|
6872
6958
|
}
|
|
6873
6959
|
}
|
|
6874
6960
|
for (const [fragmentId, intervals2] of perFragmentIntervals) {
|
|
@@ -6894,13 +6980,15 @@ var createSyncStore = ({
|
|
|
6894
6980
|
let query2;
|
|
6895
6981
|
for (let i = 0; i < filters.length; i++) {
|
|
6896
6982
|
const filter = filters[i];
|
|
6897
|
-
const fragments =
|
|
6898
|
-
for (
|
|
6983
|
+
const fragments = getFragments(filter);
|
|
6984
|
+
for (let j = 0; j < fragments.length; j++) {
|
|
6985
|
+
const fragment = fragments[j];
|
|
6899
6986
|
const _query = db.selectFrom(
|
|
6900
|
-
db.selectFrom("intervals").select(ksql`unnest(blocks)`.as("blocks")).where("fragment_id", "in", fragment.
|
|
6987
|
+
db.selectFrom("intervals").select(ksql`unnest(blocks)`.as("blocks")).where("fragment_id", "in", fragment.adjacentIds).as("unnested")
|
|
6901
6988
|
).select([
|
|
6902
6989
|
ksql`range_agg(unnested.blocks)`.as("merged_blocks"),
|
|
6903
|
-
ksql.raw(`'${i}'`).as("filter")
|
|
6990
|
+
ksql.raw(`'${i}'`).as("filter"),
|
|
6991
|
+
ksql.raw(`'${j}'`).as("fragment")
|
|
6904
6992
|
]);
|
|
6905
6993
|
query2 = query2 === void 0 ? _query : query2.unionAll(_query);
|
|
6906
6994
|
}
|
|
@@ -6909,12 +6997,17 @@ var createSyncStore = ({
|
|
|
6909
6997
|
const result = /* @__PURE__ */ new Map();
|
|
6910
6998
|
for (let i = 0; i < filters.length; i++) {
|
|
6911
6999
|
const filter = filters[i];
|
|
6912
|
-
const
|
|
6913
|
-
|
|
6914
|
-
|
|
6915
|
-
|
|
6916
|
-
|
|
6917
|
-
|
|
7000
|
+
const fragments = getFragments(filter);
|
|
7001
|
+
result.set(filter, []);
|
|
7002
|
+
for (let j = 0; j < fragments.length; j++) {
|
|
7003
|
+
const fragment = fragments[j];
|
|
7004
|
+
const intervals = rows.filter((row) => row.filter === `${i}`).filter((row) => row.fragment === `${j}`).map(
|
|
7005
|
+
(row) => (row.merged_blocks ? JSON.parse(
|
|
7006
|
+
`[${row.merged_blocks.slice(1, -1)}]`
|
|
7007
|
+
) : []).map((interval) => [interval[0], interval[1] - 1])
|
|
7008
|
+
)[0];
|
|
7009
|
+
result.get(filter).push({ fragment: fragment.fragment, intervals });
|
|
7010
|
+
}
|
|
6918
7011
|
}
|
|
6919
7012
|
return result;
|
|
6920
7013
|
}),
|
|
@@ -8236,6 +8329,126 @@ var convertTrace = (trace) => ({
|
|
|
8236
8329
|
subcalls: trace.trace.subcalls
|
|
8237
8330
|
});
|
|
8238
8331
|
|
|
8332
|
+
// src/utils/range.ts
|
|
8333
|
+
var range = (start2, stop) => Array.from({ length: stop - start2 }, (_, i) => start2 + i);
|
|
8334
|
+
|
|
8335
|
+
// src/utils/interval.ts
|
|
8336
|
+
function intervalSum(intervals) {
|
|
8337
|
+
let totalSum = 0;
|
|
8338
|
+
for (const [start2, end] of intervals) {
|
|
8339
|
+
totalSum += end - start2 + 1;
|
|
8340
|
+
}
|
|
8341
|
+
return totalSum;
|
|
8342
|
+
}
|
|
8343
|
+
function intervalUnion(intervals_) {
|
|
8344
|
+
if (intervals_.length === 0)
|
|
8345
|
+
return [];
|
|
8346
|
+
const intervals = intervals_.map((interval) => [...interval]);
|
|
8347
|
+
intervals.sort((a, b) => a[0] - b[0]);
|
|
8348
|
+
const result = [];
|
|
8349
|
+
let currentInterval = intervals[0];
|
|
8350
|
+
for (let i = 1; i < intervals.length; i++) {
|
|
8351
|
+
const nextInterval = intervals[i];
|
|
8352
|
+
if (currentInterval[1] >= nextInterval[0] - 1) {
|
|
8353
|
+
currentInterval[1] = Math.max(currentInterval[1], nextInterval[1]);
|
|
8354
|
+
} else {
|
|
8355
|
+
result.push(currentInterval);
|
|
8356
|
+
currentInterval = nextInterval;
|
|
8357
|
+
}
|
|
8358
|
+
}
|
|
8359
|
+
result.push(currentInterval);
|
|
8360
|
+
return result;
|
|
8361
|
+
}
|
|
8362
|
+
function intervalIntersection(list1, list2) {
|
|
8363
|
+
const result = [];
|
|
8364
|
+
let i = 0;
|
|
8365
|
+
let j = 0;
|
|
8366
|
+
while (i < list1.length && j < list2.length) {
|
|
8367
|
+
const [start1, end1] = list1[i];
|
|
8368
|
+
const [start2, end2] = list2[j];
|
|
8369
|
+
const intersectionStart = Math.max(start1, start2);
|
|
8370
|
+
const intersectionEnd = Math.min(end1, end2);
|
|
8371
|
+
if (intersectionStart <= intersectionEnd) {
|
|
8372
|
+
result.push([intersectionStart, intersectionEnd]);
|
|
8373
|
+
}
|
|
8374
|
+
if (end1 < end2) {
|
|
8375
|
+
i++;
|
|
8376
|
+
} else {
|
|
8377
|
+
j++;
|
|
8378
|
+
}
|
|
8379
|
+
}
|
|
8380
|
+
return intervalUnion(result);
|
|
8381
|
+
}
|
|
8382
|
+
function intervalIntersectionMany(lists) {
|
|
8383
|
+
if (lists.length === 0)
|
|
8384
|
+
return [];
|
|
8385
|
+
if (lists.length === 1)
|
|
8386
|
+
return lists[0];
|
|
8387
|
+
let result = lists[0];
|
|
8388
|
+
for (let i = 1; i < lists.length; i++) {
|
|
8389
|
+
result = intervalIntersection(result, lists[i]);
|
|
8390
|
+
}
|
|
8391
|
+
return intervalUnion(result);
|
|
8392
|
+
}
|
|
8393
|
+
function intervalDifference(initial, remove) {
|
|
8394
|
+
const initial_ = initial.map((interval) => [...interval]);
|
|
8395
|
+
const remove_ = remove.map((interval) => [...interval]);
|
|
8396
|
+
const result = [];
|
|
8397
|
+
let i = 0;
|
|
8398
|
+
let j = 0;
|
|
8399
|
+
while (i < initial.length && j < remove.length) {
|
|
8400
|
+
const interval1 = initial_[i];
|
|
8401
|
+
const interval2 = remove_[j];
|
|
8402
|
+
if (interval1[1] < interval2[0]) {
|
|
8403
|
+
result.push(interval1);
|
|
8404
|
+
i++;
|
|
8405
|
+
} else if (interval2[1] < interval1[0]) {
|
|
8406
|
+
j++;
|
|
8407
|
+
} else {
|
|
8408
|
+
if (interval1[0] < interval2[0]) {
|
|
8409
|
+
result.push([interval1[0], interval2[0] - 1]);
|
|
8410
|
+
}
|
|
8411
|
+
if (interval1[1] > interval2[1]) {
|
|
8412
|
+
interval1[0] = interval2[1] + 1;
|
|
8413
|
+
j++;
|
|
8414
|
+
} else {
|
|
8415
|
+
i++;
|
|
8416
|
+
}
|
|
8417
|
+
}
|
|
8418
|
+
}
|
|
8419
|
+
while (i < initial_.length) {
|
|
8420
|
+
result.push(initial_[i]);
|
|
8421
|
+
i++;
|
|
8422
|
+
}
|
|
8423
|
+
return result;
|
|
8424
|
+
}
|
|
8425
|
+
function intervalBounds(intervals) {
|
|
8426
|
+
const start2 = Math.min(...intervals.map((interval) => interval[0]));
|
|
8427
|
+
const end = Math.max(...intervals.map((interval) => interval[1]));
|
|
8428
|
+
return [start2, end];
|
|
8429
|
+
}
|
|
8430
|
+
function sortIntervals(intervals) {
|
|
8431
|
+
return intervals.sort((a, b) => a[0] < b[0] ? -1 : 1);
|
|
8432
|
+
}
|
|
8433
|
+
function getChunks({
|
|
8434
|
+
interval,
|
|
8435
|
+
maxChunkSize
|
|
8436
|
+
}) {
|
|
8437
|
+
const _chunks = [];
|
|
8438
|
+
const [startBlock, endBlock] = interval;
|
|
8439
|
+
let fromBlock = startBlock;
|
|
8440
|
+
let toBlock = Math.min(fromBlock + maxChunkSize - 1, endBlock);
|
|
8441
|
+
while (fromBlock <= endBlock) {
|
|
8442
|
+
_chunks.push([fromBlock, toBlock]);
|
|
8443
|
+
fromBlock = toBlock + 1;
|
|
8444
|
+
toBlock = Math.min(fromBlock + maxChunkSize - 1, endBlock);
|
|
8445
|
+
}
|
|
8446
|
+
return _chunks;
|
|
8447
|
+
}
|
|
8448
|
+
function intervalRange(interval) {
|
|
8449
|
+
return range(interval[0], interval[1] + 1);
|
|
8450
|
+
}
|
|
8451
|
+
|
|
8239
8452
|
// src/utils/rpc.ts
|
|
8240
8453
|
import {
|
|
8241
8454
|
BlockNotFoundError,
|
|
@@ -8823,51 +9036,75 @@ var createHistoricalSync = async (args) => {
|
|
|
8823
9036
|
return {
|
|
8824
9037
|
intervalsCache,
|
|
8825
9038
|
async sync(_interval) {
|
|
8826
|
-
const
|
|
8827
|
-
|
|
8828
|
-
|
|
8829
|
-
|
|
8830
|
-
|
|
8831
|
-
|
|
8832
|
-
|
|
8833
|
-
|
|
8834
|
-
|
|
8835
|
-
|
|
8836
|
-
|
|
8837
|
-
|
|
8838
|
-
|
|
9039
|
+
const intervalsToSync = [];
|
|
9040
|
+
for (const { filter } of args.sources) {
|
|
9041
|
+
if (filter.fromBlock !== void 0 && filter.fromBlock > _interval[1] || filter.toBlock !== void 0 && filter.toBlock < _interval[0]) {
|
|
9042
|
+
continue;
|
|
9043
|
+
}
|
|
9044
|
+
const interval = [
|
|
9045
|
+
Math.max(filter.fromBlock ?? 0, _interval[0]),
|
|
9046
|
+
Math.min(filter.toBlock ?? Number.POSITIVE_INFINITY, _interval[1])
|
|
9047
|
+
];
|
|
9048
|
+
const completedIntervals = intervalsCache.get(filter);
|
|
9049
|
+
const requiredIntervals = [];
|
|
9050
|
+
for (const {
|
|
9051
|
+
fragment,
|
|
9052
|
+
intervals: fragmentIntervals
|
|
9053
|
+
} of completedIntervals) {
|
|
9054
|
+
const requiredFragmentIntervals = intervalDifference(
|
|
8839
9055
|
[interval],
|
|
8840
|
-
|
|
9056
|
+
fragmentIntervals
|
|
8841
9057
|
);
|
|
8842
|
-
if (
|
|
8843
|
-
|
|
9058
|
+
if (requiredFragmentIntervals.length > 0) {
|
|
9059
|
+
requiredIntervals.push({
|
|
9060
|
+
fragment,
|
|
9061
|
+
intervals: requiredFragmentIntervals
|
|
9062
|
+
});
|
|
9063
|
+
}
|
|
9064
|
+
}
|
|
9065
|
+
if (requiredIntervals.length > 0) {
|
|
9066
|
+
const requiredInterval = intervalBounds(
|
|
9067
|
+
requiredIntervals.flatMap(({ intervals }) => intervals)
|
|
9068
|
+
);
|
|
9069
|
+
const requiredFilter = recoverFilter(
|
|
9070
|
+
filter,
|
|
9071
|
+
requiredIntervals.map(({ fragment }) => fragment)
|
|
9072
|
+
);
|
|
9073
|
+
intervalsToSync.push({
|
|
9074
|
+
filter: requiredFilter,
|
|
9075
|
+
interval: requiredInterval
|
|
9076
|
+
});
|
|
9077
|
+
}
|
|
9078
|
+
}
|
|
9079
|
+
await Promise.all(
|
|
9080
|
+
intervalsToSync.map(async ({ filter, interval }) => {
|
|
8844
9081
|
const blockPromise = syncBlock(interval[1]);
|
|
8845
9082
|
try {
|
|
8846
|
-
|
|
8847
|
-
|
|
8848
|
-
|
|
8849
|
-
|
|
8850
|
-
|
|
8851
|
-
|
|
8852
|
-
|
|
8853
|
-
|
|
8854
|
-
|
|
8855
|
-
|
|
8856
|
-
|
|
8857
|
-
|
|
8858
|
-
|
|
8859
|
-
|
|
8860
|
-
|
|
8861
|
-
|
|
8862
|
-
|
|
8863
|
-
|
|
8864
|
-
|
|
8865
|
-
|
|
8866
|
-
|
|
8867
|
-
|
|
8868
|
-
|
|
8869
|
-
}
|
|
8870
|
-
|
|
9083
|
+
switch (filter.type) {
|
|
9084
|
+
case "log": {
|
|
9085
|
+
await syncLogFilter(filter, interval);
|
|
9086
|
+
break;
|
|
9087
|
+
}
|
|
9088
|
+
case "block": {
|
|
9089
|
+
await syncBlockFilter(filter, interval);
|
|
9090
|
+
break;
|
|
9091
|
+
}
|
|
9092
|
+
case "transaction": {
|
|
9093
|
+
await syncTransactionFilter(
|
|
9094
|
+
filter,
|
|
9095
|
+
interval
|
|
9096
|
+
);
|
|
9097
|
+
break;
|
|
9098
|
+
}
|
|
9099
|
+
case "trace":
|
|
9100
|
+
case "transfer": {
|
|
9101
|
+
await syncTraceOrTransferFilter(
|
|
9102
|
+
filter,
|
|
9103
|
+
interval
|
|
9104
|
+
);
|
|
9105
|
+
break;
|
|
9106
|
+
}
|
|
9107
|
+
}
|
|
8871
9108
|
} catch (_error) {
|
|
8872
9109
|
const error = _error;
|
|
8873
9110
|
args.common.logger.error({
|
|
@@ -8881,9 +9118,10 @@ var createHistoricalSync = async (args) => {
|
|
|
8881
9118
|
if (isKilled)
|
|
8882
9119
|
return;
|
|
8883
9120
|
await blockPromise;
|
|
8884
|
-
syncedIntervals.push({ filter, interval });
|
|
8885
9121
|
})
|
|
8886
9122
|
);
|
|
9123
|
+
if (isKilled)
|
|
9124
|
+
return;
|
|
8887
9125
|
const blocks = await Promise.all(blockCache.values());
|
|
8888
9126
|
await Promise.all([
|
|
8889
9127
|
args.syncStore.insertBlocks({ blocks, chainId: args.network.chainId }),
|
|
@@ -8897,9 +9135,11 @@ var createHistoricalSync = async (args) => {
|
|
|
8897
9135
|
chainId: args.network.chainId
|
|
8898
9136
|
})
|
|
8899
9137
|
]);
|
|
9138
|
+
if (isKilled)
|
|
9139
|
+
return;
|
|
8900
9140
|
if (args.network.disableCache === false) {
|
|
8901
9141
|
await args.syncStore.insertIntervals({
|
|
8902
|
-
intervals:
|
|
9142
|
+
intervals: intervalsToSync,
|
|
8903
9143
|
chainId: args.network.chainId
|
|
8904
9144
|
});
|
|
8905
9145
|
}
|
|
@@ -10606,9 +10846,14 @@ var getCachedBlock = ({
|
|
|
10606
10846
|
filter.fromBlock ?? 0,
|
|
10607
10847
|
filter.toBlock ?? Number.POSITIVE_INFINITY
|
|
10608
10848
|
];
|
|
10609
|
-
const
|
|
10849
|
+
const fragmentIntervals = historicalSync.intervalsCache.get(filter);
|
|
10610
10850
|
const completedIntervals = sortIntervals(
|
|
10611
|
-
intervalIntersection(
|
|
10851
|
+
intervalIntersection(
|
|
10852
|
+
[requiredInterval],
|
|
10853
|
+
intervalIntersectionMany(
|
|
10854
|
+
fragmentIntervals.map(({ intervals }) => intervals)
|
|
10855
|
+
)
|
|
10856
|
+
)
|
|
10612
10857
|
);
|
|
10613
10858
|
if (completedIntervals.length === 0)
|
|
10614
10859
|
return void 0;
|
|
@@ -10664,7 +10909,7 @@ async function* localHistoricalSyncGenerator({
|
|
|
10664
10909
|
const requiredIntervals = Array.from(
|
|
10665
10910
|
historicalSync.intervalsCache.entries()
|
|
10666
10911
|
).flatMap(
|
|
10667
|
-
([filter,
|
|
10912
|
+
([filter, fragmentIntervals]) => intervalDifference(
|
|
10668
10913
|
[
|
|
10669
10914
|
[
|
|
10670
10915
|
filter.fromBlock ?? 0,
|
|
@@ -10674,7 +10919,9 @@ async function* localHistoricalSyncGenerator({
|
|
|
10674
10919
|
)
|
|
10675
10920
|
]
|
|
10676
10921
|
],
|
|
10677
|
-
|
|
10922
|
+
intervalIntersectionMany(
|
|
10923
|
+
fragmentIntervals.map(({ intervals }) => intervals)
|
|
10924
|
+
)
|
|
10678
10925
|
)
|
|
10679
10926
|
);
|
|
10680
10927
|
const required = intervalSum(intervalUnion(requiredIntervals));
|