abiFuncToMethod function
- ContractFunction func,
- {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');
}