dethcrypto / eth-sdk

Type-safe, lightweight SDKs for Ethereum smart contracts
MIT License
432 stars 40 forks source link

Reexport generated struct types #96

Open Pzixel opened 2 years ago

Pzixel commented 2 years ago

Consider following config:

export default defineConfig({
  contracts: {
    mainnet: {
      bancorCollection: '0xEC9596e0eB67228d61a12CfdB4b3608281F261b3',
    },
  },
})

Now If we call it it all compiles:

img

However, if we try to specify struct name it won't work:

img

The problem is type is not reexported so it cannot be accessed outside. It may be useful in cases when I want to write a function like

function processPoolData(data: PoolStructOutput) { ... }

P.S. for some reason generation doesn't work for all types. For example following config:

export default defineConfig({
  contracts: {
    mainnet: {
      uniswapV3: '0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8'
    },
  },
})

Leads to

slot0(overrides?: CallOverrides): Promise<[
    BigNumber,
    number,
    number,
    number,
    number,
    number,
    boolean
] & {
    sqrtPriceX96: BigNumber;
    tick: number;
    observationIndex: number;
    observationCardinality: number;
    observationCardinalityNext: number;
    feeProtocol: number;
    unlocked: boolean;
}>;
snapshotCumulativesInside(tickLower: BigNumberish, tickUpper: BigNumberish, overrides?: CallOverrides): Promise<[
    BigNumber,
    BigNumber,
    number
] & {
    tickCumulativeInside: BigNumber;
    secondsPerLiquidityInsideX128: BigNumber;
    secondsInside: number;
}>;

Note that it didn't generate proper named struct for ABI.

Pzixel commented 2 years ago

Ping? I can try adding this myself if you're agreed that it's useful to reexport generated types

krzkaczor commented 2 years ago

Hey @Pzixel!

Yes, this looks definitely like an important feature but I am not sure what exactly causes the problem. Structs should be exported in a code that TypeChain generates. You might just need a different import path to get them. Have you tried that?

Pzixel commented 2 years ago

Hi!

Sorry, I'm not following which path you mean. I don't see any typechain artifacts in my eth-sdk-enabled project.

Pzixel commented 2 years ago

Hi. Ping? I think this is quite crucial. I think I just might fix this, but I'm confused by you saying it already should work.

Could you please take a look on example I provide? Where can we find these types? If we look at eth-sdk-client we'll see

import { providers, Signer } from 'ethers';
import * as types from './types';
export declare function getContract(address: string, abi: object, defaultSignerOrProvider: Signer | providers.Provider): any;
export declare type MainnetSdk = ReturnType<typeof getMainnetSdk>;

So we dive into types that gives

import type * as mainnet from "./mainnet";
export type { mainnet };
export * as factories from "./factories";
export type { UniswapV3 } from "./mainnet/UniswapV3";
export { UniswapV3__factory } from "./factories/mainnet/UniswapV3__factory";

And this is it. As you can see only UniswapV3 type gets exported, inner structs remain private since they aren't reexported.

Pzixel commented 2 years ago

I've just took a look and it looks like typechain isn't giving any names to such types. So I might start from there and then return here. You see even if typechain was properly generating intermediate structs they wouldn't be accessible since they aren't reexported