Skip to content

[Bug] Static call and function calls doesn't match whats in the function property #590

@ShravanSunder

Description

@ShravanSunder

Issue with type generation

Using ethersv5 and typechain and hardhat

Below of is a snippet of a simple test contract:

contract YourContract {
  event SetPurpose(address sender, string purpose);
  string _purpose = 'Building Unstoppable Apps';

  constructor() {
    // what should we do on deploy?
  }

  function purpose() public view returns (string memory) {
    return _purpose;
  }

  function setPurpose(string memory newPurpose) public payable {

    _purpose = newPurpose;
    console.log(msg.sender, 'set purpose to', _purpose);
    emit SetPurpose(msg.sender, _purpose);
  }
}

Typechain generates a purpose function that has multiple return types. string and [string] as shown below.

This is what typechain generates

...
  functions: {
    purpose(overrides?: CallOverrides): Promise<[string]>;

    setPurpose(
      newPurpose: string,
      overrides?: PayableOverrides & { from?: string | Promise<string> }
    ): Promise<ContractTransaction>;
  };

  purpose(overrides?: CallOverrides): Promise<string>;

  setPurpose(
    newPurpose: string,
    overrides?: PayableOverrides & { from?: string | Promise<string> }
  ): Promise<ContractTransaction>;

  callStatic: {
    purpose(overrides?: CallOverrides): Promise<string>;

    setPurpose(newPurpose: string, overrides?: CallOverrides): Promise<void>;
  };
...

The return type of

functions: {
    purpose(overrides?: CallOverrides): Promise<[string]>;
}

does not match the static call and function call return type

  purpose(overrides?: CallOverrides): Promise<string>;

  callStatic: {
    purpose(overrides?: CallOverrides): Promise<string>;

    setPurpose(newPurpose: string, overrides?: CallOverrides): Promise<void>;
  };

Possible Cause

It seems to have to do with something with the target-ethers-v5 implementation of generateOutputTypes

https://github.com/ShravanSunder/TypeChain/blob/c0e175b3b6e8176d66bbbcc7f44e00987dd0e615/packages/target-ethers-v5/src/codegen/types.ts#L22-L28

export function generateOutputTypes(options: GenerateTypeOptions, outputs: Array<AbiOutputParameter>): string {
  if (!options.returnResultObject && outputs.length === 1) {
    return generateOutputType(options, outputs[0].type)
  } else {
    return generateOutputComplexType(outputs, options)
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions