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  }