import { ContractRunner, ethers } from 'ethers' import { propertyAbi } from './abi' import { createAuthorCaller } from './../../ethereum/property/author' import { createChangeNameCaller } from './../../ethereum/property/changeName' import { createChangeSymbolCaller } from './../../ethereum/property/changeSymbol' import { createGetBalancesCaller, PropertyBalance } from './getBalances' import { createTransferCaller } from './../../common/erc20/transfer' import { createNameCaller } from './../../common/erc20/name' import { createSymbolCaller } from './../../common/erc20/symbol' import { createTotalSupplyCaller } from './../../common/erc20/totalSupply' import { createDecimalsCaller } from './../../common/erc20/decimals' import { createTransferFromCaller } from './../../common/erc20/transferFrom' import { createBalanceOfCaller } from './../../common/erc20/balanceOf' import { createApproveCaller } from './../../common/erc20/approve' import { createAllowanceCaller } from './../../common/erc20/allowance' import { FallbackableOverrides } from '../../common/utils/execute' import type { TransactionResponse } from 'ethers' export type PropertyContract = { readonly totalSupply: () => Promise readonly balanceOf: (address: string) => Promise readonly transfer: ( to: string, value: string, overrides?: FallbackableOverrides, ) => Promise readonly allowance: (from: string, to: string) => Promise readonly approve: ( to: string, value: string, overrides?: FallbackableOverrides, ) => Promise readonly transferFrom: ( from: string, to: string, value: string, overrides?: FallbackableOverrides, ) => Promise readonly name: () => Promise readonly symbol: () => Promise readonly decimals: () => Promise readonly author: () => Promise readonly changeName: ( nextName: string, overrides?: FallbackableOverrides, ) => Promise readonly changeSymbol: ( nextSymbol: string, overrides?: FallbackableOverrides, ) => Promise readonly getBalances: () => Promise readonly contract: () => ethers.Contract } export type CreatePropertyContract = ( provider: ContractRunner, ) => (address: string) => PropertyContract export const createPropertyContract: CreatePropertyContract = (provider: ContractRunner) => (address: string): PropertyContract => { const contract = new ethers.Contract(address, [...propertyAbi], provider) return { totalSupply: createTotalSupplyCaller(contract), balanceOf: createBalanceOfCaller(contract), transfer: createTransferCaller(contract), allowance: createAllowanceCaller(contract), approve: createApproveCaller(contract), transferFrom: createTransferFromCaller(contract), name: createNameCaller(contract), symbol: createSymbolCaller(contract), decimals: createDecimalsCaller(contract), author: createAuthorCaller(contract), changeName: createChangeNameCaller(contract), changeSymbol: createChangeSymbolCaller(contract), getBalances: createGetBalancesCaller(contract), contract: () => contract, } }