import { ContractRunner, ethers } from 'ethers' import { policyAbi } from './abi' import { createHoldersShareCaller } from './holdersShare' import { createRewardsCaller } from './rewards' import { createAuthenticationFeeCaller } from './authenticationFee' import { createMarketVotingBlocksCaller } from './marketVotingBlocks' import { createPolicyVotingBlocksCaller } from './policyVotingBlocks' import { createShareOfTreasuryCaller } from './shareOfTreasury' import { createTreasuryCaller } from './treasury' import { createCapSetterCaller } from './capSetter' export type PolicyContract = { readonly holdersShare: (amount: string, lockups: string) => Promise readonly rewards: (lockups: string, assets: string) => Promise readonly authenticationFee: ( assets: string, propertyAssets: string, ) => Promise readonly marketVotingBlocks: () => Promise readonly policyVotingBlocks: () => Promise readonly shareOfTreasury: (supply: string) => Promise readonly treasury: () => Promise readonly capSetter: () => Promise readonly contract: () => ethers.Contract } export const createPolicyContract = (provider: ContractRunner) => (address: string): PolicyContract => { const contract = new ethers.Contract(address, [...policyAbi], provider) return { holdersShare: createHoldersShareCaller(contract), rewards: createRewardsCaller(contract), authenticationFee: createAuthenticationFeeCaller(contract), marketVotingBlocks: createMarketVotingBlocksCaller(contract), policyVotingBlocks: createPolicyVotingBlocksCaller(contract), shareOfTreasury: createShareOfTreasuryCaller(contract), treasury: createTreasuryCaller(contract), capSetter: createCapSetterCaller(contract), contract: () => contract, } }