import { ContractTransaction } from 'ethers'; import { BigNumber, BigNumberish } from 'ethers/utils'; import { TransactionOverrides } from '../../../contracts/3'; import { IColony as IColonyV3 } from '../../../contracts/3/IColony'; import { IColony as IColonyV4 } from '../../../contracts/4/IColony'; import { IColony as IColonyV5 } from '../../../contracts/5/IColony'; import { IColony as IColonyV6 } from '../../../contracts/6/IColony'; import { ColonyRole } from '../../../constants'; import { ColonyNetworkClient } from '../../ColonyNetworkClient'; import { addExtensions as addCommonExtensions, ExtendedIColony, getPermissionProofs, } from './commonExtensions'; type ValidColony = IColonyV3 | IColonyV4 | IColonyV5 | IColonyV6; export interface ExtendedEstimateV3 { setArbitrationRoleWithProofs( _user: string, _domainId: BigNumberish, _setTo: boolean, ): Promise; } export type ColonyExtensionsV3 = { setArbitrationRoleWithProofs( _user: string, _domainId: BigNumberish, _setTo: boolean, overrides?: TransactionOverrides, ): Promise; estimate: T['estimate'] & ExtendedEstimateV3; }; async function setArbitrationRoleWithProofs( this: ExtendedIColony & ColonyExtensionsV3, _user: string, _domainId: BigNumberish, _setTo: boolean, overrides?: TransactionOverrides, ): Promise { let proofs: [BigNumberish, BigNumberish]; // This method has two potential permissions, so we try both of them try { proofs = await getPermissionProofs( this, _domainId, ColonyRole.ArchitectureSubdomain_DEPRECATED, ); } catch (err) { proofs = await getPermissionProofs(this, _domainId, ColonyRole.Root); } const [permissionDomainId, childSkillIndex] = proofs; return this.setArbitrationRole( permissionDomainId, childSkillIndex, _user, _domainId, _setTo, overrides, ); } async function estimateSetArbitrationRoleWithProofs( this: ExtendedIColony & ColonyExtensionsV3, _user: string, _domainId: BigNumberish, _setTo: boolean, ): Promise { const [permissionDomainId, childSkillIndex] = await getPermissionProofs( this, _domainId, ColonyRole.Architecture, ); return this.estimate.setArbitrationRole( permissionDomainId, childSkillIndex, _user, _domainId, _setTo, ); } export const addExtensions = ( instance: ExtendedIColony, networkClient: ColonyNetworkClient, ): ExtendedIColony & ColonyExtensionsV3 => { const extendedInstance = addCommonExtensions( instance, networkClient, ) as ExtendedIColony & ColonyExtensionsV3; /* eslint-disable no-param-reassign, max-len */ extendedInstance.setArbitrationRoleWithProofs = setArbitrationRoleWithProofs.bind( extendedInstance, ); extendedInstance.estimate.setArbitrationRoleWithProofs = estimateSetArbitrationRoleWithProofs.bind( extendedInstance, ); /* eslint-enable no-param-reassign, max-len */ return extendedInstance; };