github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/js/src/solts/lib/encoder.ts (about) 1 import ts, { factory, VariableStatement } from 'typescript'; 2 import { callEncodeFunctionData, Provider } from './provider'; 3 import { ContractMethodsList, getRealType, Method, Signature } from './solidity'; 4 import { asConst, createParameter, declareConstant } from './syntax'; 5 6 export const encodeName = factory.createIdentifier('encode'); 7 const client = factory.createIdentifier('client'); 8 9 export function generateEncodeObject( 10 methods: ContractMethodsList, 11 provider: Provider, 12 abiName: ts.Identifier, 13 ): VariableStatement { 14 return generateEncoderObject(encodeName, methods, provider, abiName, (method) => { 15 const encodeFunction = (signature: Signature) => 16 factory.createArrowFunction( 17 undefined, 18 undefined, 19 signature.inputs.map((i) => createParameter(i.name, getRealType(i.type))), 20 undefined, 21 undefined, 22 factory.createBlock([ 23 factory.createReturnStatement( 24 callEncodeFunctionData( 25 signature.hash, 26 signature.inputs.map((arg) => factory.createIdentifier(arg.name)), 27 ), 28 ), 29 ]), 30 ); 31 if (method.signatures.length === 1) { 32 return encodeFunction(method.signatures[0]); 33 } 34 return asConst(factory.createArrayLiteralExpression(method.signatures.map(encodeFunction))); 35 }); 36 } 37 38 function generateEncoderObject( 39 name: ts.Identifier, 40 methods: ContractMethodsList, 41 provider: Provider, 42 abiName: ts.Identifier, 43 functionMaker: (m: Method) => ts.Expression, 44 ): VariableStatement { 45 return declareConstant( 46 name, 47 factory.createArrowFunction( 48 undefined, 49 undefined, 50 [createParameter(client, provider.type())], 51 undefined, 52 undefined, 53 factory.createBlock([ 54 provider.declareContractCodec(client, abiName), 55 factory.createReturnStatement( 56 factory.createObjectLiteralExpression( 57 methods 58 .filter((method) => method.type === 'function') 59 .map((method) => factory.createPropertyAssignment(method.name, functionMaker(method)), true), 60 true, 61 ), 62 ), 63 ]), 64 ), 65 true, 66 ); 67 }