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 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
- // Check if the provided parameter is present in the list of indexed inputs.
13
- const indexedInputPosition = event.inputs
14
- .filter((x) => "indexed" in x && x.indexed)
15
- .findIndex((input) => input.name === parameter);
16
- if (indexedInputPosition > -1) {
17
- return {
18
- id: `log_${Array.isArray(address) ? address.join("_") : address}_${chainId}_topic${(indexedInputPosition + 1)}_${eventSelector}_${fromBlock ?? "undefined"}_${toBlock ?? "undefined"}`,
19
- type: "log",
20
- chainId,
21
- address,
22
- eventSelector,
23
- // Add 1 because inputs will not contain an element for topic0 (the signature).
24
- childAddressLocation: `topic${(indexedInputPosition + 1)}`,
25
- fromBlock,
26
- toBlock,
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 === parameter);
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":"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"}
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":"AAcA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAyB,OAAuB,EAAE,EAAE,CACzE,OAAO,CAAC"}
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"}
@@ -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":"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;AAOD,MAAM,UAAU,oBAAoB,CAClC,KAAwB,EACxB,KAAe;IAEf,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE;QACxC,IAAI,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE;YAC/B,wBAAwB;YACxB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;gBACtB,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM;aACP;YAED,qBAAqB;YACrB,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE;gBAC9B,MAAM,cAAc,GAAG,oBAAoB,CACzC,SAA8B,EAC9B,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CACf,CAAC;gBACF,OAAO,QAAQ,GAAG,cAAc,CAAC;aAClC;iBAAM;gBACL,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,IAAI,oBAAoB,CAC9G,CAAC;aACH;SACF;aAAM;YACL,QAAQ,IAAI,uBAAuB,CAAC,SAAS,CAAC,CAAC;SAChD;KACF;IAED,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,IAAI,oBAAoB,CAC1G,CAAC;KACH;IAED,OAAO,QAAQ,CAAC;AAClB,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 +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;AAItD,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,CAyDb"}
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]["name"], undefined>;
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;AAErC,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,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;IAC/D,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
+ {"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.36",
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.36"
98
+ "@ponder/client": "0.11.37"
99
99
  },
100
100
  "engines": {
101
101
  "node": ">=18.14"
@@ -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 { getBytesConsumedByParam } from "@/utils/offset.js";
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
- // Check if the provided parameter is present in the list of indexed inputs.
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 (indexedInputPosition > -1) {
36
- return {
37
- id: `log_${Array.isArray(address) ? address.join("_") : address}_${chainId}_topic${(indexedInputPosition + 1) as 1 | 2 | 3}_${eventSelector}_${fromBlock ?? "undefined"}_${toBlock ?? "undefined"}`,
38
- type: "log",
39
- chainId,
40
- address,
41
- eventSelector,
42
- // Add 1 because inputs will not contain an element for topic0 (the signature).
43
- childAddressLocation: `topic${(indexedInputPosition + 1) as 1 | 2 | 3}`,
44
- fromBlock,
45
- toBlock,
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 === parameter,
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",
@@ -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]["name"], undefined>;
20
+ parameter: Exclude<ParameterNames<event["inputs"][number]>, undefined>;
10
21
  /** From block */
11
22
  startBlock?: number | "latest";
12
23
  endBlock?: number | "latest";
@@ -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;