Line data Source code
1 : import 'dart:convert';
2 : import 'package:collection/collection.dart';
3 : import 'package:walletkit_dart/walletkit_dart.dart';
4 :
5 : class ContractABI {
6 : final List<LocalContractFunction> functions;
7 : final List<ContractEvent> events;
8 :
9 4 : const ContractABI(this.functions, this.events);
10 :
11 4 : factory ContractABI.fromAbi(String jsonAbi) {
12 4 : final abi = jsonDecode(jsonAbi);
13 4 : final functions = <LocalContractFunction>[];
14 4 : final events = <ContractEvent>[];
15 8 : for (final item in abi) {
16 4 : final type = item['type'];
17 4 : final name = item['name'];
18 :
19 : if (name == null) {
20 : continue;
21 : }
22 :
23 12 : if (type == "fallback" || type == "constructor" || type == "error") {
24 : continue;
25 : }
26 :
27 4 : if (type == "event") {
28 3 : final anonymous = item['anonymous'] as bool;
29 3 : final parameters = <FunctionParam>[];
30 :
31 6 : for (final param in item["inputs"]) {
32 6 : parameters.add(FunctionParam.fromJson(param));
33 : }
34 3 : events.add(
35 3 : ContractEvent(
36 : name: name,
37 : parameters: parameters,
38 : anonymous: anonymous,
39 : ),
40 : );
41 : continue;
42 : }
43 4 : final stateMutability = StateMutability.fromString(
44 4 : item['stateMutability'] as String,
45 : );
46 4 : final parameters = <FunctionParam>[];
47 4 : final outputs = <FunctionParam>[];
48 :
49 8 : for (final param in item["inputs"]) {
50 8 : parameters.add(FunctionParam.fromJson(param));
51 : }
52 4 : if (item["outputs"] != null) {
53 8 : for (final param in item["outputs"]) {
54 8 : outputs.add(FunctionParam.fromJson(param));
55 : }
56 : }
57 4 : functions.add(
58 4 : LocalContractFunction(
59 : name: name,
60 : parameters: parameters,
61 : stateMutability: stateMutability,
62 : outputTypes: outputs,
63 : ),
64 : );
65 : }
66 4 : return ContractABI(functions, events);
67 : }
68 :
69 2 : LocalContractFunction? getFunction(String functionName) {
70 10 : return functions.singleWhereOrNull((e) => e.name == functionName);
71 : }
72 :
73 0 : LocalContractFunction? getFunctionFromSelector(String selector) {
74 0 : return functions
75 0 : .singleWhereOrNull((e) => e.functionSelectorHex == selector);
76 : }
77 : }
78 :
79 : class ContractEvent {
80 : final String name;
81 : final List<FunctionParam> parameters;
82 : final bool anonymous;
83 :
84 3 : const ContractEvent({
85 : required this.name,
86 : required this.parameters,
87 : required this.anonymous,
88 : });
89 : }
90 :
91 : enum StateMutability {
92 : pure,
93 : view,
94 : nonpayable,
95 : payable;
96 :
97 4 : static StateMutability fromString(String type) {
98 8 : return StateMutability.values.singleWhere((e) {
99 8 : return e.name == type;
100 : });
101 : }
102 : }
|