Skip to content

Commit 33ee803

Browse files
authored
[typechain] fix tuple array signature (#525)
1 parent 95517e9 commit 33ee803

File tree

5 files changed

+58
-7
lines changed

5 files changed

+58
-7
lines changed

.changeset/hot-camels-listen.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'typechain': major
3+
---
4+
5+
Fix tuple array signature

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ export class DataTypesInput extends Contract {
264264
})[]
265265
>;
266266

267-
"input_struct2_array(tuple[])"(
267+
"input_struct2_array((uint256,(uint256,uint256))[])"(
268268
input1: {
269269
input1: BigNumberish;
270270
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
@@ -477,7 +477,7 @@ export class DataTypesInput extends Contract {
477477
})[]
478478
>;
479479

480-
"input_struct2_array(tuple[])"(
480+
"input_struct2_array((uint256,(uint256,uint256))[])"(
481481
input1: {
482482
input1: BigNumberish;
483483
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };
@@ -655,7 +655,7 @@ export class DataTypesInput extends Contract {
655655
overrides?: UnsignedTransaction
656656
): Promise<BigNumber>;
657657

658-
"input_struct2_array(tuple[])"(
658+
"input_struct2_array((uint256,(uint256,uint256))[])"(
659659
input1: {
660660
input1: BigNumberish;
661661
input2: { uint256_0: BigNumberish; uint256_1: BigNumberish };

packages/target-ethers-v5-test/types/DataTypesInput.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export interface DataTypesInputInterface extends ethers.utils.Interface {
5353
"input_string(string)": FunctionFragment;
5454
"input_struct((uint256,uint256))": FunctionFragment;
5555
"input_struct2((uint256,(uint256,uint256)))": FunctionFragment;
56-
"input_struct2_array(tuple[])": FunctionFragment;
56+
"input_struct2_array((uint256,(uint256,uint256))[])": FunctionFragment;
5757
"input_tuple(uint256,uint256)": FunctionFragment;
5858
"input_uint256(uint256)": FunctionFragment;
5959
"input_uint8(uint8)": FunctionFragment;

packages/typechain/src/utils/signatures.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { AbiParameter, EventDeclaration, FunctionDeclaration } from '../parser/abiParser'
2-
import { TupleType } from '../parser/parseEvmType'
2+
import { ArrayType, TupleType } from '../parser/parseEvmType'
33

44
export function getFullSignatureAsSymbolForEvent(event: EventDeclaration): string {
55
return `${event.name}_${event.inputs.map((e) => e.type.originalType).join('_')}`
@@ -15,8 +15,13 @@ export function getIndexedSignatureForEvent(event: EventDeclaration): string {
1515
}
1616

1717
export function getArgumentForSignature(argument: AbiParameter): string {
18-
if (argument.type.originalType !== 'tuple') return argument.type.originalType
19-
return `(${(argument.type as TupleType).components.map((i) => getArgumentForSignature(i)).join(',')})`
18+
if (argument.type.originalType === 'tuple') {
19+
return `(${(argument.type as TupleType).components.map((i) => getArgumentForSignature(i)).join(',')})`
20+
} else if (argument.type.originalType === 'tuple[]') {
21+
return getArgumentForSignature({ name: '', type: (argument.type as ArrayType).itemType }) + '[]'
22+
} else {
23+
return argument.type.originalType
24+
}
2025
}
2126

2227
export function getSignatureForFn(fn: FunctionDeclaration): string {

packages/typechain/test/utils/signatures.test.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,45 @@ describe('utils > signatures > getSignatureForFn', () => {
9292
const signature = getSignatureForFn(fn)
9393
expect(signature).toEqual('add((uint256,(boolean,address[])))')
9494
})
95+
96+
it('tuple[]', () => {
97+
const struct: EvmSymbol[] = [
98+
{ name: 'number', type: { type: 'uinteger', originalType: 'uint256', bits: 256 } },
99+
{
100+
name: 'inner',
101+
type: {
102+
type: 'tuple',
103+
originalType: 'tuple',
104+
components: [
105+
{ name: 'bool', type: { type: 'boolean', originalType: 'boolean' } },
106+
{
107+
name: 'addresses',
108+
type: {
109+
type: 'array',
110+
originalType: 'address[]',
111+
itemType: { type: 'address', originalType: 'address' },
112+
},
113+
},
114+
],
115+
},
116+
},
117+
]
118+
const fn: FunctionDeclaration = {
119+
name: 'add',
120+
inputs: [
121+
{
122+
name: 'arg1',
123+
type: {
124+
type: 'array',
125+
originalType: 'tuple[]',
126+
itemType: { type: 'tuple', components: struct, originalType: 'tuple' },
127+
},
128+
},
129+
],
130+
outputs: [],
131+
stateMutability: 'pure',
132+
}
133+
const signature = getSignatureForFn(fn)
134+
expect(signature).toEqual('add((uint256,(boolean,address[]))[])')
135+
})
95136
})

0 commit comments

Comments
 (0)