Skip to content

Commit 95517e9

Browse files
zemsehasparus
andauthored
Add support for solidity structs (#493)
* [typechain] feat: parse structs * [typechain] test: struct parsing * fix: generation tests * [ethers-v5] feat: export structs * [ethers-v5] chore: run ci * test: add complex struct and struct array * [ethers-v5] fix: input struct types * [ethers-v5] test: add test cases for struct types * [ethers-v5] refactor: use struct postfix from common * [typechain] refactor: insertStruct -> registerStruct * Add changeset * Bump target-ethers-v5 peerDependency on typechain to 5.2.0 Co-authored-by: hasparus <hasparus@gmail.com>
1 parent d7de252 commit 95517e9

File tree

26 files changed

+1035
-113
lines changed

26 files changed

+1035
-113
lines changed

.changeset/fluffy-rats-sniff.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
---
2+
'@typechain/ethers-v5': minor
3+
'typechain': minor
4+
---
5+
6+
Add support for Solidity structs
7+
8+
```ts
9+
// before
10+
function deposit(amount: { token: string; value: BigNumberish }): Promise<ContractTransaction>
11+
12+
// after
13+
export type AmountStruct = { token: string; value: BigNumberish }
14+
15+
function deposit(amount: AmountStruct): Promise<ContractTransaction>
16+
```

contracts/v0.6.4/DataTypesInput.sol

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,14 @@ contract DataTypesInput {
4848
function input_enum(Enum1 input1) public pure returns (Enum1) {
4949
return input1;
5050
}
51+
struct Struct2 {
52+
uint input1;
53+
Struct1 input2;
54+
}
55+
function input_struct2(Struct2 memory input1) public pure returns (Struct2 memory) {
56+
return input1;
57+
}
58+
function input_struct2_array(Struct2[] memory input1) public pure returns (Struct2[] memory) {
59+
return input1;
60+
}
5161
}

packages/target-ethers-v4-test/types/DataTypesInput.d.ts

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,24 @@ interface DataTypesInputInterface extends Interface {
5252
]): string;
5353
}>;
5454

55+
input_struct2: TypedFunctionDescription<{
56+
encode([input1]: [
57+
{
58+
input1: BigNumberish;
59+
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
60+
}
61+
]): string;
62+
}>;
63+
64+
input_struct2_array: TypedFunctionDescription<{
65+
encode([input1]: [
66+
{
67+
input1: BigNumberish;
68+
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
69+
}[]
70+
]): string;
71+
}>;
72+
5573
input_tuple: TypedFunctionDescription<{
5674
encode([input1, input2]: [BigNumberish, BigNumberish]): string;
5775
}>;
@@ -189,6 +207,82 @@ export class DataTypesInput extends Contract {
189207
[BigNumber, BigNumber] & { uint256_0: BigNumber; uint256_1: BigNumber }
190208
>;
191209

210+
input_struct2(
211+
input1: {
212+
input1: BigNumberish;
213+
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
214+
},
215+
overrides?: UnsignedTransaction
216+
): Promise<
217+
[
218+
BigNumber,
219+
[BigNumber, BigNumber] & { uint256_0: BigNumber; uint256_1: BigNumber }
220+
] & {
221+
input1: BigNumber;
222+
input2: [BigNumber, BigNumber] & {
223+
uint256_0: BigNumber;
224+
uint256_1: BigNumber;
225+
};
226+
}
227+
>;
228+
229+
"input_struct2((uint256,(uint256,uint256)))"(
230+
input1: {
231+
input1: BigNumberish;
232+
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
233+
},
234+
overrides?: UnsignedTransaction
235+
): Promise<
236+
[
237+
BigNumber,
238+
[BigNumber, BigNumber] & { uint256_0: BigNumber; uint256_1: BigNumber }
239+
] & {
240+
input1: BigNumber;
241+
input2: [BigNumber, BigNumber] & {
242+
uint256_0: BigNumber;
243+
uint256_1: BigNumber;
244+
};
245+
}
246+
>;
247+
248+
input_struct2_array(
249+
input1: {
250+
input1: BigNumberish;
251+
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
252+
}[],
253+
overrides?: UnsignedTransaction
254+
): Promise<
255+
([
256+
BigNumber,
257+
[BigNumber, BigNumber] & { uint256_0: BigNumber; uint256_1: BigNumber }
258+
] & {
259+
input1: BigNumber;
260+
input2: [BigNumber, BigNumber] & {
261+
uint256_0: BigNumber;
262+
uint256_1: BigNumber;
263+
};
264+
})[]
265+
>;
266+
267+
"input_struct2_array(tuple[])"(
268+
input1: {
269+
input1: BigNumberish;
270+
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
271+
}[],
272+
overrides?: UnsignedTransaction
273+
): Promise<
274+
([
275+
BigNumber,
276+
[BigNumber, BigNumber] & { uint256_0: BigNumber; uint256_1: BigNumber }
277+
] & {
278+
input1: BigNumber;
279+
input2: [BigNumber, BigNumber] & {
280+
uint256_0: BigNumber;
281+
uint256_1: BigNumber;
282+
};
283+
})[]
284+
>;
285+
192286
input_tuple(
193287
input1: BigNumberish,
194288
input2: BigNumberish,
@@ -326,6 +420,82 @@ export class DataTypesInput extends Contract {
326420
[BigNumber, BigNumber] & { uint256_0: BigNumber; uint256_1: BigNumber }
327421
>;
328422

423+
input_struct2(
424+
input1: {
425+
input1: BigNumberish;
426+
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
427+
},
428+
overrides?: UnsignedTransaction
429+
): Promise<
430+
[
431+
BigNumber,
432+
[BigNumber, BigNumber] & { uint256_0: BigNumber; uint256_1: BigNumber }
433+
] & {
434+
input1: BigNumber;
435+
input2: [BigNumber, BigNumber] & {
436+
uint256_0: BigNumber;
437+
uint256_1: BigNumber;
438+
};
439+
}
440+
>;
441+
442+
"input_struct2((uint256,(uint256,uint256)))"(
443+
input1: {
444+
input1: BigNumberish;
445+
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
446+
},
447+
overrides?: UnsignedTransaction
448+
): Promise<
449+
[
450+
BigNumber,
451+
[BigNumber, BigNumber] & { uint256_0: BigNumber; uint256_1: BigNumber }
452+
] & {
453+
input1: BigNumber;
454+
input2: [BigNumber, BigNumber] & {
455+
uint256_0: BigNumber;
456+
uint256_1: BigNumber;
457+
};
458+
}
459+
>;
460+
461+
input_struct2_array(
462+
input1: {
463+
input1: BigNumberish;
464+
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
465+
}[],
466+
overrides?: UnsignedTransaction
467+
): Promise<
468+
([
469+
BigNumber,
470+
[BigNumber, BigNumber] & { uint256_0: BigNumber; uint256_1: BigNumber }
471+
] & {
472+
input1: BigNumber;
473+
input2: [BigNumber, BigNumber] & {
474+
uint256_0: BigNumber;
475+
uint256_1: BigNumber;
476+
};
477+
})[]
478+
>;
479+
480+
"input_struct2_array(tuple[])"(
481+
input1: {
482+
input1: BigNumberish;
483+
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
484+
}[],
485+
overrides?: UnsignedTransaction
486+
): Promise<
487+
([
488+
BigNumber,
489+
[BigNumber, BigNumber] & { uint256_0: BigNumber; uint256_1: BigNumber }
490+
] & {
491+
input1: BigNumber;
492+
input2: [BigNumber, BigNumber] & {
493+
uint256_0: BigNumber;
494+
uint256_1: BigNumber;
495+
};
496+
})[]
497+
>;
498+
329499
input_tuple(
330500
input1: BigNumberish,
331501
input2: BigNumberish,
@@ -461,6 +631,38 @@ export class DataTypesInput extends Contract {
461631
overrides?: UnsignedTransaction
462632
): Promise<BigNumber>;
463633

634+
input_struct2(
635+
input1: {
636+
input1: BigNumberish;
637+
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
638+
},
639+
overrides?: UnsignedTransaction
640+
): Promise<BigNumber>;
641+
642+
"input_struct2((uint256,(uint256,uint256)))"(
643+
input1: {
644+
input1: BigNumberish;
645+
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
646+
},
647+
overrides?: UnsignedTransaction
648+
): Promise<BigNumber>;
649+
650+
input_struct2_array(
651+
input1: {
652+
input1: BigNumberish;
653+
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
654+
}[],
655+
overrides?: UnsignedTransaction
656+
): Promise<BigNumber>;
657+
658+
"input_struct2_array(tuple[])"(
659+
input1: {
660+
input1: BigNumberish;
661+
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
662+
}[],
663+
overrides?: UnsignedTransaction
664+
): Promise<BigNumber>;
665+
464666
input_tuple(
465667
input1: BigNumberish,
466668
input2: BigNumberish,

0 commit comments

Comments
 (0)