github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/js/src/solts/api.ts (about)

     1  import ts, { factory } from 'typescript';
     2  import { ABI } from '../contracts/abi';
     3  import { callerTypes, createCallerFunction } from './lib/caller';
     4  import { declareContractType, generateContractObject } from './lib/contract';
     5  import { generateDecodeObject } from './lib/decoder';
     6  import {
     7    bytecodeName,
     8    deployedBytecodeName,
     9    generateDeployContractFunction,
    10    generateDeployFunction,
    11  } from './lib/deployer';
    12  import { generateEncodeObject } from './lib/encoder';
    13  import { declareEvents, eventTypes } from './lib/events';
    14  import { Provider } from './lib/provider';
    15  import { getContractMethods } from './lib/solidity';
    16  import { declareConstant, ExportToken, importBurrow, importReadable } from './lib/syntax';
    17  import Func = ABI.Func;
    18  
    19  export {
    20    decodeOutput,
    21    encodeInput,
    22    importLocalResolver,
    23    inputDescriptionFromFiles,
    24    tokenizeLinks,
    25  } from '../contracts/compile';
    26  
    27  export type Compiled = {
    28    name: string;
    29    abi: ABI.FunctionOrEvent[];
    30    bytecode: string;
    31    deployedBytecode: string;
    32    links: Array<string>;
    33  };
    34  
    35  const contractNameName = factory.createIdentifier('contractName');
    36  const abiName = factory.createIdentifier('abi');
    37  
    38  // Note: this is a very useful tool for discovering the correct Typescript factory API calls to produce a particular
    39  //piece of syntax: https://ts-ast-viewer.com
    40  export function newFile(contracts: Compiled[], burrowImportPath: string): ts.Node[] {
    41    const provider = new Provider();
    42  
    43    return [
    44      ts.addSyntheticLeadingComment(
    45        importReadable(),
    46        ts.SyntaxKind.SingleLineCommentTrivia,
    47        'Code generated by solts. DO NOT EDIT.',
    48      ),
    49      importBurrow(burrowImportPath),
    50      provider.createInterface(),
    51      ...callerTypes,
    52      createCallerFunction(provider),
    53      ...contracts.map((contract) => {
    54        const methods = getContractMethods(contract.abi);
    55  
    56        const deploy = contract.abi.find((abi): abi is Func => abi.type === 'constructor');
    57  
    58        // No deploy function for interfaces
    59        const deployMembers = contract.bytecode
    60          ? [
    61              declareConstant(bytecodeName, factory.createStringLiteral(contract.bytecode, true), true),
    62              declareConstant(deployedBytecodeName, factory.createStringLiteral(contract.deployedBytecode, true), true),
    63              generateDeployFunction(
    64                deploy,
    65                contract.links,
    66                provider,
    67                abiName,
    68                // Exclude names of interface contracts since they have no deployed code
    69                contracts.filter((c) => c.bytecode).map((c) => factory.createIdentifier(c.name)),
    70              ),
    71              generateDeployContractFunction(deploy, contract.links, provider),
    72            ]
    73          : [];
    74  
    75        const events = methods.filter((a) => a.type === 'event');
    76  
    77        const eventMembers = events.length ? [...eventTypes(), declareEvents(events)] : [];
    78  
    79        const statements = [
    80          declareConstant(contractNameName, factory.createStringLiteral(contract.name), true),
    81          declareConstant(abiName, factory.createStringLiteral(JSON.stringify(contract.abi), true), true),
    82          ...deployMembers,
    83          ...eventMembers,
    84          declareContractType(),
    85          generateContractObject(contract.name, methods, provider),
    86          generateEncodeObject(methods, provider, abiName),
    87          generateDecodeObject(methods, provider, abiName),
    88        ];
    89        return factory.createModuleDeclaration(
    90          undefined,
    91          [ExportToken],
    92          factory.createIdentifier(contract.name),
    93          factory.createModuleBlock(statements),
    94        );
    95      }),
    96    ];
    97  }
    98  
    99  export function printNodes(...nodes: ts.Node[]): string {
   100    const target = ts.createSourceFile('', '', ts.ScriptTarget.Latest, false, ts.ScriptKind.TS);
   101    const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
   102    return nodes.map((node) => printer.printNode(ts.EmitHint.Unspecified, node, target)).join('\n');
   103  }