abiFuncToMethod function

String abiFuncToMethod(
  1. ContractFunction func,
  2. {bool nullable = false}
)

convert a ContractFragment to a source code fragment of a dart proxy implementation.

Implementation

String abiFuncToMethod(ContractFunction func, {bool nullable = false}) {
  var paramWithNames =
      zip<FunctionParameter, int>(func.parameters, CountForever())
          .map((t) => paramAddParamName(t.value1, t.value2))
          .toList();
  var paramTypesAndNames = paramWithNames.map((pn) =>
      '${web3TypesToDart(pn.value1.type.runtimeType.toString())} ${pn.value2}');
  var paramNames = paramWithNames.map((pn) => pn.value2);
  return [
    [
      wrap<Future>(
          func.isConstant ? abiOutputToReturnType(func.outputs) : 'String',
          nullable: nullable),
      ' ',
      func.name.isNotEmpty
          ? func.name
          : func.isConstructor
              ? '\$constructor'
              : '\$fallback',
      '(',
      [
        ...(paramTypesAndNames),
        ...(func.isConstant
            ? <String>['{EthereumAddress${nullable ? "?" : ""} from}']
            : [
                'Credentials privateKey',
                (func.isPayable
                    ? 'TransactionPayable tx'
                    : 'TransactionNotPayable tx')
              ]),
      ].join(', '),
      ') async {',
    ].join(''),
    [
      'var _f = ',
      func.name.isNotEmpty
          ? '\$contract.function(\'${func.name}\')'
          : '\$abi.functions.where((f) => f.name == \'${func.name}\' && f.${func.isConstructor ? "isConstructor" : "isDefault"}).first',
      ';'
    ].join(''),
    ...(func.isConstant
        ? <String>[
            [
              'var _params = <dynamic>[',
              paramNames.join(', '),
              '];',
            ].join(''),
            'var result = await \$client.call(sender: _addrOrDefault(from), contract: \$contract, function: _f, params: _params, atBlock: BlockNum.current());',
            (func.outputs.length > 1)
                ? 'return Tuple${func.outputs.length}(' +
                    [
                      for (var r in zip(
                          Iterable<int>.generate(func.outputs.length),
                          func.outputs))
                        'result[${r.value1}] as ${web3TypesToDart(r.value2.type.runtimeType.toString())}'
                    ].join(', ') +
                    ');'
                : 'return' +
                    (func.outputs.length == 1
                        ? ' result[0] as ${web3TypesToDart(func.outputs.first.type.runtimeType.toString())}'
                        : '') +
                    ';',
          ]
        : [
            [
              'var _params = _f.encodeCall(<dynamic>[',
              paramNames.join(', '),
              ']);',
            ].join(''),
            'var finalized = tx.finalize(data: _params, from: await privateKey.extractAddress(), to: \$contract.address);',
            'var txid = await \$client.sendTransaction(privateKey, finalized, fetchChainIdFromNetworkId: true);',
            // 'var txr = waitFor(() => \$client.getTransactionReceipt(txid));',
            'return txid;'
          ]),
    '}',
  ].join('\n');
}