text: /* @flow */
  
  import ContractClient from '@colony/colony-js-contract-client';
  
  import type ColonyClient from '../index';
  
  type InputValues = {
    contractName: string,
  };
  
  // When adding an extension contract to a colony, a new extension contract will
  // be deployed that is unique to the colony. In order for the colony to use the
  // extension contract, the extension contract will need to be assigned a colony
  // role (which role depends on the extension contract and contract methods). In
  // order to assign the extension contract a colony role, the extension contract
  // address will need to be accessible.
  
  export default class GetExtensionAddress extends ContractClient.Caller<
    InputValues,
    *,
    ColonyClient,
    *,
  > {
    async call(args: *) {
      const factoryContract = await this.client.adapter.getContract({
        contractName: `${args.contractName}Factory`,
      });
      const address = await factoryContract.callConstant('deployedExtensions', [
        this.client.contract.address,
      ]);
      return { address };
    }
  }
  