All files / src/clarity/types principalCV.ts

86.48% Statements 32/37
55.55% Branches 5/9
100% Functions 8/8
86.48% Lines 32/37

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108            21x 21x 21x                               6x 3x 3x 3x 3x             3x 1x 1x   2x         38x 38x       26x       10x 10x 10x                 10x       10x   10x             13x     13x             1x 1x                     21x 21x 21x 21x 21x 21x 21x    
import {
  Address,
  LengthPrefixedString,
  createAddress,
  addressToString,
  createLPString,
} from '../common/utils';
import { ClarityType } from '../common/constants';
import { utf8ToBytes } from 'micro-stacks/common';
 
type PrincipalCV = StandardPrincipalCV | ContractPrincipalCV;
 
interface StandardPrincipalCV {
  readonly type: ClarityType.PrincipalStandard;
  readonly address: Address;
}
 
interface ContractPrincipalCV {
  readonly type: ClarityType.PrincipalContract;
  readonly address: Address;
  readonly contractName: LengthPrefixedString;
}
 
function principalToString(principal: PrincipalCV): string {
  if (principal.type === ClarityType.PrincipalStandard) {
    return addressToString(principal.address);
  } else if (principal.type === ClarityType.PrincipalContract) {
    const address = addressToString(principal.address);
    return `${address}.${principal.contractName.content}`;
  } else E{
    throw new Error(`Unexpected principal data: ${JSON.stringify(principal)}`);
  }
}
 
function principalCV(principal: string): PrincipalCV {
  if (principal.includes('.')) {
    const [address, contractName] = principal.split('.');
    return contractPrincipalCV(address, contractName);
  } else {
    return standardPrincipalCV(principal);
  }
}
 
function standardPrincipalCV(addressString: string): StandardPrincipalCV {
  const addr = createAddress(addressString);
  return { type: ClarityType.PrincipalStandard, address: addr };
}
 
function standardPrincipalCVFromAddress(address: Address): StandardPrincipalCV {
  return { type: ClarityType.PrincipalStandard, address };
}
 
function _contractPrincipalCV(contractAddress: string, contractName: string): ContractPrincipalCV {
  const addr = createAddress(contractAddress);
  const lengthPrefixedContractName = createLPString(contractName);
  return contractPrincipalCVFromAddress(addr, lengthPrefixedContractName);
}
 
function contractPrincipalCV(
  /** pass either the contract_id or contract address */
  addressOrContractId: string,
  /** pass the contract name if the previous argument is only the address */
  contractName?: string
): ContractPrincipalCV {
  Iif (addressOrContractId.includes('.')) {
    const [address, name] = addressOrContractId.split('.');
    return _contractPrincipalCV(address, name);
  }
  Iif (!contractName)
    throw TypeError(`[micro-stacks] contractPrincipalCV requires contractName value`);
  return _contractPrincipalCV(addressOrContractId, contractName);
}
 
function contractPrincipalCVFromAddress(
  address: Address,
  contractName: LengthPrefixedString
): ContractPrincipalCV {
  Iif (utf8ToBytes(contractName.content).byteLength >= 128) {
    throw new Error('Contract name must be less than 128 bytes');
  }
  return { type: ClarityType.PrincipalContract, address, contractName };
}
 
function contractPrincipalCVFromStandard(
  sp: StandardPrincipalCV,
  contractName: string
): ContractPrincipalCV {
  const lengthPrefixedContractName = createLPString(contractName);
  return {
    type: ClarityType.PrincipalContract,
    address: sp.address,
    contractName: lengthPrefixedContractName,
  };
}
 
export {
  PrincipalCV,
  StandardPrincipalCV,
  ContractPrincipalCV,
  principalCV,
  principalToString,
  standardPrincipalCV,
  standardPrincipalCVFromAddress,
  contractPrincipalCV,
  contractPrincipalCVFromAddress,
  contractPrincipalCVFromStandard,
};