dethcrypto / dethcrypto/TypeChain

Give names for intermediate structs

Open
#715 4 comments 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
2.8k
Forks
376
PR merge metrics
No merged PRs in 30d

Description

Consider following contract

```solidity
contract TypechainTest {
struct Input {
uint256 a;
int128 b;
bool c;
}

struct Output {
uint256 d;
int128 e;
}

function test(Input calldata input) public pure returns (Output memory result) {
result.d = input.a;
result.e = input.b;
}
}
```

it leads to following generation:

```ts
...
test(
input: { a: BigNumberish; b: BigNumberish; c: boolean },
overrides?: CallOverrides
): Promise<[BigNumber, BigNumber] & { d: BigNumber; e: BigNumber }>;

callStatic: {
test(
input: { a: BigNumberish; b: BigNumberish; c: boolean },
overrides?: CallOverrides
): Promise<[BigNumber, BigNumber] & { d: BigNumber; e: BigNumber }>;
};
...
```

Which isn't ideal for several reasons. One of the biggest problems that it's not possible to write function like:

```ts
let x = prepareArg();
contract.test(x);
```

Because `prepareArg` should contain `struct Input` as part of signature but it's not generated.

I propose generation changed to:

```ts
export type Input = { a: BigNumberish; b: BigNumberish; c: boolean };
export type Output = { d: BigNumber; e: BigNumber };

...
test(
input: Input,
overrides?: CallOverrides
): Promise<[BigNumber, BigNumber] & Output>;

callStatic: {
test(
input: Input,
overrides?: CallOverrides
): Promise<[BigNumber, BigNumber] & Output>;
};
...
```

I can try implementing it if you're agreed this is the way to go.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.