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 }