ponder 0.11.36 → 0.11.37
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/CHANGELOG.md +6 -0
- package/dist/esm/build/factory.js +34 -18
- package/dist/esm/build/factory.js.map +1 -1
- package/dist/esm/config/address.js.map +1 -1
- package/dist/esm/utils/offset.js +28 -0
- package/dist/esm/utils/offset.js.map +1 -1
- package/dist/types/build/factory.d.ts.map +1 -1
- package/dist/types/config/address.d.ts +8 -2
- package/dist/types/config/address.d.ts.map +1 -1
- package/dist/types/utils/offset.d.ts +5 -0
- package/dist/types/utils/offset.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/build/factory.ts +51 -18
- package/src/config/address.ts +13 -2
- package/src/utils/offset.ts +45 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# ponder
|
|
2
2
|
|
|
3
|
+
## 0.11.37
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#1895](https://github.com/ponder-sh/ponder/pull/1895) [`7b58d8c`](https://github.com/ponder-sh/ponder/commit/7b58d8c68429858619919c3ee6792d99a76da212) Thanks [@khaidarkairbek](https://github.com/khaidarkairbek)! - Introduced a feature of specifying struct fields as a factory parameter.
|
|
8
|
+
|
|
3
9
|
## 0.11.36
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { dedupe } from '../utils/dedupe.js';
|
|
2
2
|
import { toLowerCase } from '../utils/lowercase.js';
|
|
3
|
-
import { getBytesConsumedByParam } from '../utils/offset.js';
|
|
3
|
+
import { getBytesConsumedByParam, getNestedParamOffset, } from '../utils/offset.js';
|
|
4
4
|
import { toEventSelector } from "viem";
|
|
5
5
|
export function buildLogFactory({ address: _address, event, parameter, chainId, fromBlock, toBlock, }) {
|
|
6
6
|
const address = Array.isArray(_address)
|
|
@@ -9,34 +9,50 @@ export function buildLogFactory({ address: _address, event, parameter, chainId,
|
|
|
9
9
|
.sort((a, b) => (a < b ? -1 : 1))
|
|
10
10
|
: toLowerCase(_address);
|
|
11
11
|
const eventSelector = toEventSelector(event);
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
12
|
+
const params = parameter.split(".");
|
|
13
|
+
if (params.length === 1) {
|
|
14
|
+
// Check if the provided parameter is present in the list of indexed inputs.
|
|
15
|
+
const indexedInputPosition = event.inputs
|
|
16
|
+
.filter((x) => "indexed" in x && x.indexed)
|
|
17
|
+
.findIndex((input) => {
|
|
18
|
+
return input.name === params[0];
|
|
19
|
+
});
|
|
20
|
+
if (indexedInputPosition > -1) {
|
|
21
|
+
return {
|
|
22
|
+
id: `log_${Array.isArray(address) ? address.join("_") : address}_${chainId}_topic${(indexedInputPosition + 1)}_${eventSelector}_${fromBlock ?? "undefined"}_${toBlock ?? "undefined"}`,
|
|
23
|
+
type: "log",
|
|
24
|
+
chainId,
|
|
25
|
+
address,
|
|
26
|
+
eventSelector,
|
|
27
|
+
// Add 1 because inputs will not contain an element for topic0 (the signature).
|
|
28
|
+
childAddressLocation: `topic${(indexedInputPosition + 1)}`,
|
|
29
|
+
fromBlock,
|
|
30
|
+
toBlock,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
28
33
|
}
|
|
29
34
|
const nonIndexedInputs = event.inputs.filter((x) => !("indexed" in x && x.indexed));
|
|
30
|
-
const nonIndexedInputPosition = nonIndexedInputs.findIndex((input) => input.name ===
|
|
35
|
+
const nonIndexedInputPosition = nonIndexedInputs.findIndex((input) => input.name === params[0]);
|
|
31
36
|
if (nonIndexedInputPosition === -1) {
|
|
32
37
|
throw new Error(`Factory event parameter not found in factory event signature. Got '${parameter}', expected one of [${event.inputs
|
|
33
38
|
.map((i) => `'${i.name}'`)
|
|
34
39
|
.join(", ")}].`);
|
|
35
40
|
}
|
|
41
|
+
const nonIndexedParameter = nonIndexedInputs[nonIndexedInputPosition];
|
|
42
|
+
if (nonIndexedParameter.type !== "address" && params.length === 1) {
|
|
43
|
+
throw new Error(`Factory event parameter type is not valid. Got '${nonIndexedParameter.type}', expected 'address'.`);
|
|
44
|
+
}
|
|
45
|
+
if (params.length > 1 && nonIndexedParameter.type !== "tuple") {
|
|
46
|
+
throw new Error(`Factory event parameter type is not valid. Got '${nonIndexedParameter.type}', expected 'tuple'.`);
|
|
47
|
+
}
|
|
36
48
|
let offset = 0;
|
|
37
49
|
for (let i = 0; i < nonIndexedInputPosition; i++) {
|
|
38
50
|
offset += getBytesConsumedByParam(nonIndexedInputs[i]);
|
|
39
51
|
}
|
|
52
|
+
if (params.length > 1) {
|
|
53
|
+
const nestedOffset = getNestedParamOffset(nonIndexedInputs[nonIndexedInputPosition], params.slice(1));
|
|
54
|
+
offset += nestedOffset;
|
|
55
|
+
}
|
|
40
56
|
return {
|
|
41
57
|
id: `log_${Array.isArray(address) ? address.join("_") : address}_${chainId}_offset${offset}_${eventSelector}_${fromBlock ?? "undefined"}_${toBlock ?? "undefined"}`,
|
|
42
58
|
type: "log",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/build/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/build/factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"address.js","sourceRoot":"","sources":["../../../src/config/address.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"address.js","sourceRoot":"","sources":["../../../src/config/address.ts"],"names":[],"mappings":"AAyBA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAyB,OAAuB,EAAE,EAAE,CACzE,OAAO,CAAC"}
|
package/dist/esm/utils/offset.js
CHANGED
|
@@ -47,6 +47,34 @@ export function getBytesConsumedByParam(param) {
|
|
|
47
47
|
docsPath: "/docs/contract/decodeAbiParameters",
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
|
+
export function getNestedParamOffset(param, names) {
|
|
51
|
+
let consumed = 0;
|
|
52
|
+
let isFound = false;
|
|
53
|
+
for (const component of param.components) {
|
|
54
|
+
if (component.name === names[0]) {
|
|
55
|
+
// the end of the branch
|
|
56
|
+
if (names.length === 1) {
|
|
57
|
+
isFound = true;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
// additional nesting
|
|
61
|
+
if (component.type === "tuple") {
|
|
62
|
+
const nestedConsumed = getNestedParamOffset(component, names.slice(1));
|
|
63
|
+
return consumed + nestedConsumed;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
throw new Error(`Factory event parameter '${param.name}.${names.join(".")}' is not valid for ${param.name} struct signature.`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
consumed += getBytesConsumedByParam(component);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (!isFound) {
|
|
74
|
+
throw new Error(`Factory event parameter '${param.name}.${names.join(".")}' not found in ${param.name} struct signature.`);
|
|
75
|
+
}
|
|
76
|
+
return consumed;
|
|
77
|
+
}
|
|
50
78
|
function hasDynamicChild(param) {
|
|
51
79
|
const { type } = param;
|
|
52
80
|
if (type === "string")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offset.js","sourceRoot":"","sources":["../../../src/utils/offset.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,MAAM,CAAC;AAEnD,qBAAqB;AACrB,kHAAkH;AAElH,MAAM,UAAU,uBAAuB,CAAC,KAAmB;IACzD,MAAM,eAAe,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,eAAe,EAAE;QACnB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,eAAe,CAAC;QAE5C,+DAA+D;QAC/D,4CAA4C;QAC5C,IAAI,CAAC,MAAM,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE;YACrC,OAAO,EAAE,CAAC;SACX;QAED,kDAAkD;QAClD,wDAAwD;QACxD,0DAA0D;QAC1D,MAAM,wBAAwB,GAAG,uBAAuB,CAAC;YACvD,GAAG,KAAK;YACR,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QACH,OAAO,MAAM,GAAG,wBAAwB,CAAC;KAC1C;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;QAC1B,kEAAkE;QAClE,2BAA2B;QAC3B,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE;YAC1B,OAAO,EAAE,CAAC;SACX;QAED,iEAAiE;QACjE,8BAA8B;QAC9B,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,SAAS,IAAK,KAAa,CAAC,UAAU,IAAI,EAAE,EAAE;YACvD,QAAQ,IAAI,uBAAuB,CAAC,SAAS,CAAC,CAAC;SAChD;QACD,OAAO,QAAQ,CAAC;KACjB;IAED,wDAAwD;IACxD,mDAAmD;IACnD,IACE,KAAK,CAAC,IAAI,KAAK,QAAQ;QACvB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAC5B,KAAK,CAAC,IAAI,KAAK,SAAS;QACxB,KAAK,CAAC,IAAI,KAAK,MAAM,EACrB;QACA,OAAO,EAAE,CAAC;KACX;IAED,MAAM,IAAI,2BAA2B,CAAC,KAAK,CAAC,IAAI,EAAE;QAChD,QAAQ,EAAE,oCAAoC;KAC/C,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,KAAmB;IAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAQ,KAAa,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAE9E,MAAM,eAAe,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvD,IACE,eAAe;QACf,eAAe,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,EAAkB,CAAC;QAEvE,OAAO,IAAI,CAAC;IAEd,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CACzB,IAAY;IAEZ,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC/C,OAAO,OAAO;QACZ,CAAC,CAAC,yCAAyC;YACzC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAE,CAAC;QACvD,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"offset.js","sourceRoot":"","sources":["../../../src/utils/offset.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/build/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/build/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAQtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,KAAK,OAAO,EAAmB,MAAM,MAAM,CAAC;AAErD,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EAAE,QAAQ,EACjB,KAAK,EACL,SAAS,EACT,OAAO,EACP,SAAS,EACT,OAAO,GACR,EAAE;IACD,OAAO,EAAE,OAAO,GAAG,SAAS,OAAO,EAAE,CAAC;IACtC,KAAK,EAAE,QAAQ,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,GAAG,UAAU,CAsFb"}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import type { AbiEvent } from "viem";
|
|
1
|
+
import type { AbiEvent, AbiParameter } from "viem";
|
|
2
|
+
type ParameterNames<T extends AbiParameter> = T extends {
|
|
3
|
+
components: readonly AbiParameter[];
|
|
4
|
+
} ? T["components"][number] extends {
|
|
5
|
+
components: readonly AbiParameter[];
|
|
6
|
+
} ? never : `${T["name"]}.${T["components"][number]["name"]}` : T["name"];
|
|
2
7
|
export type Factory<event extends AbiEvent = AbiEvent> = {
|
|
3
8
|
/** Address of the factory contract that creates this contract. */
|
|
4
9
|
address: `0x${string}` | readonly `0x${string}`[];
|
|
5
10
|
/** ABI event that announces the creation of a new instance of this contract. */
|
|
6
11
|
event: event;
|
|
7
12
|
/** Name of the factory event parameter that contains the new child contract address. */
|
|
8
|
-
parameter: Exclude<event["inputs"][number]
|
|
13
|
+
parameter: Exclude<ParameterNames<event["inputs"][number]>, undefined>;
|
|
9
14
|
/** From block */
|
|
10
15
|
startBlock?: number | "latest";
|
|
11
16
|
endBlock?: number | "latest";
|
|
@@ -14,4 +19,5 @@ export declare const factory: <event extends AbiEvent>(factory: Factory<event>)
|
|
|
14
19
|
export type AddressConfig = {
|
|
15
20
|
address?: `0x${string}` | readonly `0x${string}`[] | Factory;
|
|
16
21
|
};
|
|
22
|
+
export {};
|
|
17
23
|
//# sourceMappingURL=address.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../../src/config/address.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../../src/config/address.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAGnD,KAAK,cAAc,CAAC,CAAC,SAAS,YAAY,IAAI,CAAC,SAAS;IACtD,UAAU,EAAE,SAAS,YAAY,EAAE,CAAC;CACrC,GACG,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,SAAS;IAC9B,UAAU,EAAE,SAAS,YAAY,EAAE,CAAC;CACrC,GACC,KAAK,GACL,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,GACnD,CAAC,CAAC,MAAM,CAAC,CAAC;AAEd,MAAM,MAAM,OAAO,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ,IAAI;IACvD,kEAAkE;IAClE,OAAO,EAAE,KAAK,MAAM,EAAE,GAAG,SAAS,KAAK,MAAM,EAAE,EAAE,CAAC;IAClD,gFAAgF;IAChF,KAAK,EAAE,KAAK,CAAC;IACb,wFAAwF;IACxF,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACvE,iBAAiB;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,OAAO,qEACX,CAAC;AAEV,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,KAAK,MAAM,EAAE,GAAG,SAAS,KAAK,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC;CAC9D,CAAC"}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import type { AbiParameter } from "abitype";
|
|
2
2
|
export declare function getBytesConsumedByParam(param: AbiParameter): number;
|
|
3
|
+
export type TupleAbiParameter = AbiParameter & {
|
|
4
|
+
type: "tuple";
|
|
5
|
+
components: readonly AbiParameter[];
|
|
6
|
+
};
|
|
7
|
+
export declare function getNestedParamOffset(param: TupleAbiParameter, names: string[]): number;
|
|
3
8
|
//# sourceMappingURL=offset.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offset.d.ts","sourceRoot":"","sources":["../../../src/utils/offset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAM5C,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAqDnE"}
|
|
1
|
+
{"version":3,"file":"offset.d.ts","sourceRoot":"","sources":["../../../src/utils/offset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAM5C,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAqDnE;AAED,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG;IAC7C,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,SAAS,YAAY,EAAE,CAAC;CACrC,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,MAAM,EAAE,GACd,MAAM,CAmCR"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ponder",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.37",
|
|
4
4
|
"description": "An open-source framework for crypto application backends",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
"rimraf": "^5.0.5",
|
|
96
96
|
"tsx": "^4.19.2",
|
|
97
97
|
"vitest": "^1.0.2",
|
|
98
|
-
"@ponder/client": "0.11.
|
|
98
|
+
"@ponder/client": "0.11.37"
|
|
99
99
|
},
|
|
100
100
|
"engines": {
|
|
101
101
|
"node": ">=18.14"
|
package/src/build/factory.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { LogFactory } from "@/internal/types.js";
|
|
2
2
|
import { dedupe } from "@/utils/dedupe.js";
|
|
3
3
|
import { toLowerCase } from "@/utils/lowercase.js";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
type TupleAbiParameter,
|
|
6
|
+
getBytesConsumedByParam,
|
|
7
|
+
getNestedParamOffset,
|
|
8
|
+
} from "@/utils/offset.js";
|
|
5
9
|
import type { AbiEvent } from "abitype";
|
|
6
10
|
import { type Address, toEventSelector } from "viem";
|
|
7
11
|
|
|
@@ -27,30 +31,36 @@ export function buildLogFactory({
|
|
|
27
31
|
: toLowerCase(_address);
|
|
28
32
|
const eventSelector = toEventSelector(event);
|
|
29
33
|
|
|
30
|
-
|
|
31
|
-
const indexedInputPosition = event.inputs
|
|
32
|
-
.filter((x) => "indexed" in x && x.indexed)
|
|
33
|
-
.findIndex((input) => input.name === parameter);
|
|
34
|
+
const params = parameter.split(".");
|
|
34
35
|
|
|
35
|
-
if (
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
36
|
+
if (params.length === 1) {
|
|
37
|
+
// Check if the provided parameter is present in the list of indexed inputs.
|
|
38
|
+
const indexedInputPosition = event.inputs
|
|
39
|
+
.filter((x) => "indexed" in x && x.indexed)
|
|
40
|
+
.findIndex((input) => {
|
|
41
|
+
return input.name === params[0];
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
if (indexedInputPosition > -1) {
|
|
45
|
+
return {
|
|
46
|
+
id: `log_${Array.isArray(address) ? address.join("_") : address}_${chainId}_topic${(indexedInputPosition + 1) as 1 | 2 | 3}_${eventSelector}_${fromBlock ?? "undefined"}_${toBlock ?? "undefined"}`,
|
|
47
|
+
type: "log",
|
|
48
|
+
chainId,
|
|
49
|
+
address,
|
|
50
|
+
eventSelector,
|
|
51
|
+
// Add 1 because inputs will not contain an element for topic0 (the signature).
|
|
52
|
+
childAddressLocation: `topic${(indexedInputPosition + 1) as 1 | 2 | 3}`,
|
|
53
|
+
fromBlock,
|
|
54
|
+
toBlock,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
47
57
|
}
|
|
48
58
|
|
|
49
59
|
const nonIndexedInputs = event.inputs.filter(
|
|
50
60
|
(x) => !("indexed" in x && x.indexed),
|
|
51
61
|
);
|
|
52
62
|
const nonIndexedInputPosition = nonIndexedInputs.findIndex(
|
|
53
|
-
(input) => input.name ===
|
|
63
|
+
(input) => input.name === params[0],
|
|
54
64
|
);
|
|
55
65
|
|
|
56
66
|
if (nonIndexedInputPosition === -1) {
|
|
@@ -61,11 +71,34 @@ export function buildLogFactory({
|
|
|
61
71
|
);
|
|
62
72
|
}
|
|
63
73
|
|
|
74
|
+
const nonIndexedParameter = nonIndexedInputs[nonIndexedInputPosition]!;
|
|
75
|
+
|
|
76
|
+
if (nonIndexedParameter.type !== "address" && params.length === 1) {
|
|
77
|
+
throw new Error(
|
|
78
|
+
`Factory event parameter type is not valid. Got '${nonIndexedParameter.type}', expected 'address'.`,
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (params.length > 1 && nonIndexedParameter.type !== "tuple") {
|
|
83
|
+
throw new Error(
|
|
84
|
+
`Factory event parameter type is not valid. Got '${nonIndexedParameter.type}', expected 'tuple'.`,
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
64
88
|
let offset = 0;
|
|
65
89
|
for (let i = 0; i < nonIndexedInputPosition; i++) {
|
|
66
90
|
offset += getBytesConsumedByParam(nonIndexedInputs[i]!);
|
|
67
91
|
}
|
|
68
92
|
|
|
93
|
+
if (params.length > 1) {
|
|
94
|
+
const nestedOffset = getNestedParamOffset(
|
|
95
|
+
nonIndexedInputs[nonIndexedInputPosition]! as TupleAbiParameter,
|
|
96
|
+
params.slice(1),
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
offset += nestedOffset;
|
|
100
|
+
}
|
|
101
|
+
|
|
69
102
|
return {
|
|
70
103
|
id: `log_${Array.isArray(address) ? address.join("_") : address}_${chainId}_offset${offset}_${eventSelector}_${fromBlock ?? "undefined"}_${toBlock ?? "undefined"}`,
|
|
71
104
|
type: "log",
|
package/src/config/address.ts
CHANGED
|
@@ -1,4 +1,15 @@
|
|
|
1
|
-
import type { AbiEvent } from "viem";
|
|
1
|
+
import type { AbiEvent, AbiParameter } from "viem";
|
|
2
|
+
|
|
3
|
+
// Note: Currently limit the depth to 1 level.
|
|
4
|
+
type ParameterNames<T extends AbiParameter> = T extends {
|
|
5
|
+
components: readonly AbiParameter[];
|
|
6
|
+
}
|
|
7
|
+
? T["components"][number] extends {
|
|
8
|
+
components: readonly AbiParameter[];
|
|
9
|
+
}
|
|
10
|
+
? never
|
|
11
|
+
: `${T["name"]}.${T["components"][number]["name"]}`
|
|
12
|
+
: T["name"];
|
|
2
13
|
|
|
3
14
|
export type Factory<event extends AbiEvent = AbiEvent> = {
|
|
4
15
|
/** Address of the factory contract that creates this contract. */
|
|
@@ -6,7 +17,7 @@ export type Factory<event extends AbiEvent = AbiEvent> = {
|
|
|
6
17
|
/** ABI event that announces the creation of a new instance of this contract. */
|
|
7
18
|
event: event;
|
|
8
19
|
/** Name of the factory event parameter that contains the new child contract address. */
|
|
9
|
-
parameter: Exclude<event["inputs"][number]
|
|
20
|
+
parameter: Exclude<ParameterNames<event["inputs"][number]>, undefined>;
|
|
10
21
|
/** From block */
|
|
11
22
|
startBlock?: number | "latest";
|
|
12
23
|
endBlock?: number | "latest";
|
package/src/utils/offset.ts
CHANGED
|
@@ -59,6 +59,51 @@ export function getBytesConsumedByParam(param: AbiParameter): number {
|
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
export type TupleAbiParameter = AbiParameter & {
|
|
63
|
+
type: "tuple";
|
|
64
|
+
components: readonly AbiParameter[];
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export function getNestedParamOffset(
|
|
68
|
+
param: TupleAbiParameter,
|
|
69
|
+
names: string[],
|
|
70
|
+
): number {
|
|
71
|
+
let consumed = 0;
|
|
72
|
+
let isFound = false;
|
|
73
|
+
for (const component of param.components) {
|
|
74
|
+
if (component.name === names[0]) {
|
|
75
|
+
// the end of the branch
|
|
76
|
+
if (names.length === 1) {
|
|
77
|
+
isFound = true;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// additional nesting
|
|
82
|
+
if (component.type === "tuple") {
|
|
83
|
+
const nestedConsumed = getNestedParamOffset(
|
|
84
|
+
component as TupleAbiParameter,
|
|
85
|
+
names.slice(1),
|
|
86
|
+
);
|
|
87
|
+
return consumed + nestedConsumed;
|
|
88
|
+
} else {
|
|
89
|
+
throw new Error(
|
|
90
|
+
`Factory event parameter '${param.name}.${names.join(".")}' is not valid for ${param.name} struct signature.`,
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
} else {
|
|
94
|
+
consumed += getBytesConsumedByParam(component);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (!isFound) {
|
|
99
|
+
throw new Error(
|
|
100
|
+
`Factory event parameter '${param.name}.${names.join(".")}' not found in ${param.name} struct signature.`,
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return consumed;
|
|
105
|
+
}
|
|
106
|
+
|
|
62
107
|
function hasDynamicChild(param: AbiParameter) {
|
|
63
108
|
const { type } = param;
|
|
64
109
|
if (type === "string") return true;
|