diff --git a/cyberwow/lib/logic/interface/rpc/rpc.dart b/cyberwow/lib/logic/interface/rpc/rpc.dart
new file mode 100644
index 0000000..741417d
--- /dev/null
+++ b/cyberwow/lib/logic/interface/rpc/rpc.dart
@@ -0,0 +1,79 @@
+/*
+
+Copyright 2019 fuwa
+
+This file is part of CyberWOW.
+
+CyberWOW is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+CyberWOW is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with CyberWOW. If not, see .
+
+*/
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:http/http.dart' as http;
+import 'package:flutter/foundation.dart';
+
+import '../../../config.dart' as config;
+import '../../../helper.dart';
+import '../../../logging.dart';
+
+Future rpcHTTP(final String method) async {
+ final url = 'http://${config.host}:${config.c.port}/json_rpc';
+
+ final body = json.encode
+ (
+ {
+ 'jsonrpc': '2.0',
+ 'method': method,
+ }
+ );
+
+ try {
+ final response = await http.post
+ ( url,
+ body: body
+ );
+ return response;
+ }
+ catch (e) {
+ log.warning(e);
+ return null;
+ }
+}
+
+dynamic jsonDecode(final String responseBody) => json.decode(responseBody);
+
+Future rpc(final String method, {final String field}) async {
+ final response = await rpcHTTP(method);
+
+ if (response == null) return null;
+
+ if (response.statusCode != 200) {
+ return null;
+ } else {
+ final _body = await compute(jsonDecode, response.body);
+ final _result = _body['result'];
+ if (_result == null) return null;
+
+ final _field = field == null ? _result : _result[field];
+
+ return _field;
+ }
+}
+
+Future rpcString(final String method, {final String field}) async {
+ final _field = await rpc(method, field: field);
+ return pretty(_field);
+}
diff --git a/cyberwow/lib/logic/interface/rpc/rpc2.dart b/cyberwow/lib/logic/interface/rpc/rpc2.dart
new file mode 100644
index 0000000..58c28d4
--- /dev/null
+++ b/cyberwow/lib/logic/interface/rpc/rpc2.dart
@@ -0,0 +1,64 @@
+/*
+
+Copyright 2019 fuwa
+
+This file is part of CyberWOW.
+
+CyberWOW is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+CyberWOW is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with CyberWOW. If not, see .
+
+*/
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:math';
+
+import 'package:http/http.dart' as http;
+import 'package:flutter/foundation.dart';
+import 'package:intl/intl.dart';
+
+import '../../../config.dart' as config;
+import '../../../helper.dart';
+import '../../../logging.dart';
+
+Future rpc2(final String method) async {
+ final url = 'http://${config.host}:${config.c.port}/${method}';
+
+ try {
+ final response = await http.post
+ ( url,
+ );
+ return response;
+ }
+ catch (e) {
+ log.warning(e);
+ return null;
+ }
+}
+
+dynamic jsonDecode(final String responseBody) => json.decode(responseBody);
+
+Future rpc2String(final String method, {final String field}) async {
+ final response = await rpc2(method);
+
+ if (response == null) return '';
+
+ if (response.statusCode != 200) {
+ return '';
+ } else {
+ final _body = await compute(jsonDecode, response.body);
+ final _field = field == null ? _body: _body[field];
+
+ return pretty(_field);
+ }
+}
diff --git a/cyberwow/lib/logic/sensor/rpc/rpc.dart b/cyberwow/lib/logic/sensor/rpc/rpc.dart
index 40f721a..c806768 100644
--- a/cyberwow/lib/logic/sensor/rpc/rpc.dart
+++ b/cyberwow/lib/logic/sensor/rpc/rpc.dart
@@ -23,65 +23,10 @@ import 'dart:async';
import 'dart:convert';
import 'package:http/http.dart' as http;
-import 'package:flutter/foundation.dart';
-import '../../../config.dart' as config;
import '../../../helper.dart';
import '../../../logging.dart';
-
-int rpcID = 0;
-
-Future rpcHTTP(final String method) async {
- final url = 'http://${config.host}:${config.c.port}/json_rpc';
-
- rpcID += 1;
-
- final body = json.encode
- (
- {
- 'jsonrpc': '2.0',
- 'id': rpcID.toString(),
- 'method': method,
- }
- );
-
- try {
- final response = await http.post
- ( url,
- body: body
- );
- return response;
- }
- catch (e) {
- log.warning(e);
- return null;
- }
-}
-
-dynamic jsonDecode(final String responseBody) => json.decode(responseBody);
-
-Future rpc(final String method, {final String field}) async {
- final response = await rpcHTTP(method);
-
- if (response == null) return null;
-
- if (response.statusCode != 200) {
- return null;
- } else {
- final _body = await compute(jsonDecode, response.body);
- final _result = _body['result'];
- if (_result == null) return null;
-
- final _field = field == null ? _result : _result[field];
-
- return _field;
- }
-}
-
-Future rpcString(final String method, {final String field}) async {
- final _field = await rpc(method, field: field);
- return pretty(_field);
-}
+import '../../interface/rpc/rpc.dart';
Future syncInfo() => rpc('sync_info');
Future syncInfoString() => rpcString('sync_info');
diff --git a/cyberwow/lib/logic/sensor/rpc/rpc2.dart b/cyberwow/lib/logic/sensor/rpc/rpc2.dart
index ee920d4..59cfd23 100644
--- a/cyberwow/lib/logic/sensor/rpc/rpc2.dart
+++ b/cyberwow/lib/logic/sensor/rpc/rpc2.dart
@@ -25,45 +25,12 @@ import 'dart:math';
import 'package:http/http.dart' as http;
import 'package:flutter/foundation.dart';
-import 'package:intl/intl.dart';
-import '../../../config.dart' as config;
import '../../../helper.dart';
import '../../../logging.dart';
+import '../../interface/rpc/rpc2.dart' as rpc2;
-Future rpc2(final String method) async {
- final url = 'http://${config.host}:${config.c.port}/${method}';
-
- try {
- final response = await http.post
- ( url,
- );
- return response;
- }
- catch (e) {
- log.warning(e);
- return null;
- }
-}
-
-dynamic jsonDecode(final String responseBody) => json.decode(responseBody);
-
-Future rpc2String(final String method, {final String field}) async {
- final response = await rpc2(method);
-
- if (response == null) return '';
-
- if (response.statusCode != 200) {
- return '';
- } else {
- final _body = await compute(jsonDecode, response.body);
- final _field = field == null ? _body: _body[field];
-
- return pretty(_field);
- }
-}
-
-Future getTransactionPool() async => rpc2('get_transaction_pool');
+Future getTransactionPool() async => rpc2.rpc2('get_transaction_pool');
Future>> getTransactionPoolSimple() async {
final response = await getTransactionPool();