import { ContractRunner, ethers } from 'ethers' import { addressConfigAbi } from './abi' import { createTokenCaller } from './token' import { createAllocatorCaller } from './allocator' import { createAllocatorStorageCaller } from './allocatorStorage' import { createLockupCaller } from './lockup' import { createLockupStorageCaller } from './lockupStorage' import { createMarketFactoryCaller } from './marketFactory' import { createMarketGroupCaller } from './marketGroup' import { createMetricsFactoryCaller } from './metricsFactory' import { createMetricsGroupCaller } from './metricsGroup' import { createPolicyCaller } from './policy' import { createPropertyFactoryCaller } from './propertyFactory' import { createPropertyGroupCaller } from './propertyGroup' import { createWithdrawCaller } from './withdraw' import { createWithdrawStorageCaller } from './withdrawStorage' import { createPolicyFactoryCaller } from './policyFactory' import { createPolicySetCaller } from './policySet' import { createPolicyGroupCaller } from './policyGroup' export type RegistryContract = { readonly allocator: () => Promise readonly allocatorStorage: () => Promise readonly lockup: () => Promise readonly lockupStorage: () => Promise readonly marketFactory: () => Promise readonly marketGroup: () => Promise readonly metricsFactory: () => Promise readonly metricsGroup: () => Promise readonly policy: () => Promise readonly policyFactory: () => Promise readonly policySet: () => Promise readonly policyGroup: () => Promise readonly propertyFactory: () => Promise readonly propertyGroup: () => Promise readonly token: () => Promise readonly withdraw: () => Promise readonly withdrawStorage: () => Promise readonly contract: () => ethers.Contract } export type CreateRegistryContract = ( provider: ContractRunner, ) => (address: string) => RegistryContract export const createRegistryContract: CreateRegistryContract = (provider: ContractRunner) => (address: string): RegistryContract => { const contract = new ethers.Contract( address, [...addressConfigAbi], provider, ) return { allocator: createAllocatorCaller(contract), allocatorStorage: createAllocatorStorageCaller(contract), lockup: createLockupCaller(contract), lockupStorage: createLockupStorageCaller(contract), marketFactory: createMarketFactoryCaller(contract), marketGroup: createMarketGroupCaller(contract), metricsFactory: createMetricsFactoryCaller(contract), metricsGroup: createMetricsGroupCaller(contract), policy: createPolicyCaller(contract), policySet: createPolicySetCaller(contract), policyGroup: createPolicyGroupCaller(contract), policyFactory: createPolicyFactoryCaller(contract), propertyFactory: createPropertyFactoryCaller(contract), propertyGroup: createPropertyGroupCaller(contract), token: createTokenCaller(contract), withdraw: createWithdrawCaller(contract), withdrawStorage: createWithdrawStorageCaller(contract), contract: () => contract, } }