From 9031180e72e881827c30e757237a63ce9304c149 Mon Sep 17 00:00:00 2001
From: zainali5120 <512061637@qq.com>
Date: Sun, 31 May 2020 22:44:07 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/main/java/com/xcong/excoin/modules/blackchain/service/BchService.java                  |  138 ++
 src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAuthenticationInfoVo.java |   26 
 src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java                  |  283 ++++
 src/main/java/com/xcong/excoin/modules/member/dao/AgentReturnDao.java                      |   10 
 src/main/java/com/xcong/excoin/modules/platform/dao/PlatformFeeSettingDao.java             |   14 
 src/main/java/com/xcong/excoin/modules/blackchain/service/DateUtil.java                    | 1369 +++++++++++++++++++
 src/main/java/com/xcong/excoin/modules/platform/entity/PlatformCnyUsdtExchangeEntity.java  |    8 
 src/main/resources/mapper/platform/PlatformFeeSettingDao.xml                               |   24 
 src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java                |    6 
 pom.xml                                                                                    |   20 
 src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransactions.java               |   36 
 src/main/java/com/xcong/excoin/modules/blackchain/service/HttpUtil.java                    |  281 ++++
 src/main/java/com/xcong/excoin/modules/member/parameter/dto/MemberPaymethodDto.java        |    6 
 src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAvivableCoinInfoVo.java   |   19 
 src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java          |  110 +
 lib/ripple-core-0.0.1-SNAPSHOT.jar                                                         |    0 
 src/main/java/com/xcong/excoin/modules/blackchain/controller/BlockController.java          |   47 
 src/main/resources/mapper/member/AgentReturnDao.xml                                        |    5 
 src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoListVo.java       |   16 
 src/main/java/com/xcong/excoin/modules/blackchain/service/BigDecimalUtil.java              |  190 ++
 src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoVo.java           |   14 
 src/main/resources/mapper/member/MemberCoinAddressDao.xml                                  |   19 
 src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransResult.java                |   49 
 src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java             |   92 
 src/main/java/com/xcong/excoin/modules/blackchain/service/BlockSerive.java                 |    9 
 src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java        |  219 +++
 src/main/java/com/xcong/excoin/modules/blackchain/service/LtcService.java                  |  125 +
 src/main/java/com/xcong/excoin/modules/blackchain/service/BtcService.java                  |  138 ++
 src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTx.java                         |   63 
 src/main/java/com/xcong/excoin/modules/platform/entity/PlatformFeeSettingEntity.java       |   53 
 src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtService.java                 |  167 ++
 src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberPersonCenterInfoVo.java   |   32 
 src/main/java/com/xcong/excoin/modules/blackchain/service/XrpService.java                  |  487 +++++++
 src/main/java/com/xcong/excoin/modules/member/service/MemberService.java                   |    8 
 34 files changed, 4,033 insertions(+), 50 deletions(-)

diff --git a/lib/ripple-core-0.0.1-SNAPSHOT.jar b/lib/ripple-core-0.0.1-SNAPSHOT.jar
new file mode 100644
index 0000000..e3744e0
--- /dev/null
+++ b/lib/ripple-core-0.0.1-SNAPSHOT.jar
Binary files differ
diff --git a/pom.xml b/pom.xml
index f2cea20..191b9fe 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,6 +35,14 @@
     </properties>
 
     <dependencies>
+    
+        <dependency>
+            <groupId>ripple</groupId>
+            <artifactId>ripple</artifactId>
+            <version>0.0.1</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/lib/ripple-core-0.0.1-SNAPSHOT.jar</systemPath>
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
@@ -112,6 +120,18 @@
             <artifactId>mysql-connector-java</artifactId>
             <version>${mysql-driver.version}</version>
         </dependency>
+        
+        <dependency>
+            <groupId>org.web3j</groupId>
+            <artifactId>core</artifactId>
+            <version>4.5.5</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.web3j/parity -->
+        <dependency>
+            <groupId>org.web3j</groupId>
+            <artifactId>parity</artifactId>
+            <version>4.5.10</version>
+        </dependency>
 
         <!-- 参数校验 start -->
         <dependency>
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/controller/BlockController.java b/src/main/java/com/xcong/excoin/modules/blackchain/controller/BlockController.java
new file mode 100644
index 0000000..e024e8d
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/controller/BlockController.java
@@ -0,0 +1,47 @@
+package com.xcong.excoin.modules.blackchain.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.modules.blackchain.service.BlockSerive;
+import com.xcong.excoin.utils.RedisUtils;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Api(value = "链上钱包接口", tags = "链上钱包接口")
+@RestController
+@RequestMapping(value = "/api/block")
+public class BlockController {
+	
+
+
+	@Autowired
+	RedisUtils  redisUtils;
+	@Autowired
+	BlockSerive blockSerive;
+	/**
+	 * BTC
+	 * @param token
+	 * @return
+	 */
+	@ApiOperation(value = "链上生成钱包地址接口", notes = "链上生成钱包地址接口")
+	@ApiImplicitParams({
+		@ApiImplicitParam(name = "symbol", value = "币种", required = true, dataType = "String", paramType="query")
+	})
+	@GetMapping(value = "/findBlockAddress")
+	public Result findBlockAddress(String symbol) {
+		return blockSerive.findBlockAddress(symbol);
+	}
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransResult.java b/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransResult.java
new file mode 100644
index 0000000..a9bf035
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransResult.java
@@ -0,0 +1,49 @@
+package com.xcong.excoin.modules.blackchain.model;
+
+import java.util.List;
+
+// https://github.com/ripple/rippled-historical-database#get-account-transaction-history
+public class XrpTransResult {
+	private String result; //success
+	private Integer count; //
+	private String marker;//
+	
+	//transactions
+	List<XrpTransactions> transactions;
+
+	public String getResult() {
+		return result;
+	}
+
+	public void setResult(String result) {
+		this.result = result;
+	}
+
+	public Integer getCount() {
+		return count;
+	}
+
+	public void setCount(Integer count) {
+		this.count = count;
+	}
+
+	public String getMarker() {
+		return marker;
+	}
+
+	public void setMarker(String marker) {
+		this.marker = marker;
+	}
+
+	public List<XrpTransactions> getTransactions() {
+		return transactions;
+	}
+
+	public void setTransactions(List<XrpTransactions> transactions) {
+		this.transactions = transactions;
+	}
+	
+	
+	
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransactions.java b/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransactions.java
new file mode 100644
index 0000000..f69f00f
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransactions.java
@@ -0,0 +1,36 @@
+package com.xcong.excoin.modules.blackchain.model;
+
+public class XrpTransactions {
+
+	private String hash;
+	private Integer ledger_index;
+	private String date;//2019-10-28T15:01:01+00:00
+	private XrpTx tx;
+	
+	public String getHash() {
+		return hash;
+	}
+	public void setHash(String hash) {
+		this.hash = hash;
+	}
+	public Integer getLedger_index() {
+		return ledger_index;
+	}
+	public void setLedger_index(Integer ledger_index) {
+		this.ledger_index = ledger_index;
+	}
+	public String getDate() {
+		return date;
+	}
+	public void setDate(String date) {
+		this.date = date;
+	}
+	public XrpTx getTx() {
+		return tx;
+	}
+	public void setTx(XrpTx tx) {
+		this.tx = tx;
+	}
+	
+	
+}
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTx.java b/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTx.java
new file mode 100644
index 0000000..513f593
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTx.java
@@ -0,0 +1,63 @@
+package com.xcong.excoin.modules.blackchain.model;
+
+public class XrpTx {
+	private String TransactionType;
+	private Integer Flags;
+	private Integer Sequence;
+	private Integer DestinationTag; // 对应的用户标签
+	private Integer Amount; // 金额 除以1000000 一百万
+	private Integer Fee;  // 手续费
+	private String Account; // 转账人
+	private String Destination; // 收款人(收款人是系统账户 说明是转入)
+	
+	public String getTransactionType() {
+		return TransactionType;
+	}
+	public void setTransactionType(String transactionType) {
+		TransactionType = transactionType;
+	}
+	public Integer getFlags() {
+		return Flags;
+	}
+	public void setFlags(Integer flags) {
+		Flags = flags;
+	}
+	public Integer getSequence() {
+		return Sequence;
+	}
+	public void setSequence(Integer sequence) {
+		Sequence = sequence;
+	}
+	public Integer getDestinationTag() {
+		return DestinationTag;
+	}
+	public void setDestinationTag(Integer destinationTag) {
+		DestinationTag = destinationTag;
+	}
+	public Integer getAmount() {
+		return Amount;
+	}
+	public void setAmount(Integer amount) {
+		Amount = amount;
+	}
+	public Integer getFee() {
+		return Fee;
+	}
+	public void setFee(Integer fee) {
+		Fee = fee;
+	}
+	public String getAccount() {
+		return Account;
+	}
+	public void setAccount(String account) {
+		Account = account;
+	}
+	public String getDestination() {
+		return Destination;
+	}
+	public void setDestination(String destination) {
+		Destination = destination;
+	}
+	
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/BchService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/BchService.java
new file mode 100644
index 0000000..eb142df
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/BchService.java
@@ -0,0 +1,138 @@
+package com.xcong.excoin.modules.blackchain.service;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+
+
+public class BchService {
+
+	
+	private static BchService service = null;
+	private final static String RESULT = "result";
+	private final static String METHOD_SEND_TO_ADDRESS = "sendtoaddress";
+	private final static String METHOD_GET_TRANSACTION = "gettransaction";
+	private final static String METHOD_LIST_TRANSACTIONS = "listtransactions";
+	private final static String METHOD_GET_BLOCK_COUNT = "getblockcount";
+	private final static String METHOD_NEW_ADDRESS = "getnewaddress";
+	private final static String METHOD_GET_BALANCE = "getbalance";
+	private final static String METHOD_GET_BALANCE_ADDRESS = "getreceivedbyaddress";
+	private final static String METHOD_WALLET_PASSPHRASE = "walletpassphrase";
+	private final static String METHOD_WALLET_LOCK = "walletlock";
+
+	private String url = "http://121.40.86.163:1882";
+	private String username = "biyi";
+	private String password = "biyi12345";
+
+	public static BchService getInstance() {
+		if (service != null) {
+			return service;
+		}
+		return new BchService();
+	}
+
+	private BchService() {
+	}
+
+	/**
+	 * 创建BTC钱包 每个账户对应一个地址 方便后续操作
+	 * @param mId 账户
+	 * @return
+	 */
+	public static Map<String, String> createWallet(String mId) {
+		BchService btcService = getInstance();
+		// 创建钱包地址
+		String address = btcService.getAddress(mId);
+		// 私钥
+		String privateKey = btcService.dumpprivkey(address);
+		Map<String, String> result = new HashMap<String,String>();
+		result.put("address", address);
+		result.put("privateKey", privateKey);
+		return result;
+	}
+	public String getAddress(String label) {
+		try {
+			JSONObject json = doRequest(METHOD_NEW_ADDRESS,label);
+			if (isError(json)) {
+				return "";
+			}
+			return json.getString(RESULT);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	private JSONObject doRequest(String method, Object... params) {
+		JSONObject param = new JSONObject();
+		param.put("id", System.currentTimeMillis() + "");
+		param.put("jsonrpc", "2.0");
+		param.put("method", method);
+		if (params != null) {
+			param.put("params", params);
+		}
+		String creb = Base64.encodeBase64String((username + ":" + password).getBytes());
+		Map<String, String> headers = new HashMap<>(2);
+		headers.put("Authorization", "Basic " + creb);
+		return JSON.parseObject(HttpUtil.jsonPost(url, headers, param.toJSONString()));
+	}
+
+	private boolean isError(JSONObject json) {
+		if (json == null || (StringUtils.isNotEmpty(json.getString("error")) && json.get("error") != "null")) {
+			return true;
+		}
+		return false;
+	}
+	
+	public String dumpprivkey(String address) {
+		try {
+			JSONObject obj = doRequest("dumpprivkey", address);
+			System.out.println(obj);
+			if (!isError(obj)) {
+				return obj.getString(RESULT);
+			} else {
+				return null;
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	/**
+	 * 查询给定地址的总收款额(只计算接受的)
+	 * @param address
+	 * @return
+	 */
+	public BigDecimal getBalance(String address) {
+		JSONObject json = doRequest(METHOD_GET_BALANCE_ADDRESS,address,3);
+		if (!isError(json)) {
+			return new BigDecimal(json.getString(RESULT));
+		} else {
+			return null;
+		}
+	}
+	
+	public String METHOD_GET_BLOCK_COUNT() {
+		JSONObject json = doRequest(METHOD_GET_BLOCK_COUNT);
+		if (!isError(json)) {
+			return json.getString(RESULT);
+		} else {
+			return null;
+		}
+	}
+	public static void main(String[] args) {
+		BchService ser = new BchService();
+		//ser.getBalance("36RiLqCrnFfBoyUUHpGvEotXiMRtrJG8dp");
+		//System.out.println(ser.METHOD_GET_BLOCK_COUNT());
+	   System.out.println(ser.getBalance("36RiLqCrnFfBoyUUHpGvEotXiMRtrJG8dp"));
+	}
+	
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/BigDecimalUtil.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/BigDecimalUtil.java
new file mode 100644
index 0000000..3043a0f
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/BigDecimalUtil.java
@@ -0,0 +1,190 @@
+package com.xcong.excoin.modules.blackchain.service;
+
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+
+/**
+ * 数据计算工具类
+ *
+ * @author cloud cloud
+ * @create 2017/10/11
+ **/
+public class BigDecimalUtil {
+
+
+    /**
+     * 基本单位
+     */
+    private static final BigDecimal UNIT = new BigDecimal(100000000);
+
+    /**
+     * 对double数据进行取精度.
+     * @param value  double数据.
+     * @param scale  精度位数(保留的小数位数).
+     * @param roundingMode  精度取值方式.
+     * @return 精度计算后的数据.
+     */
+    public static double round(double value, int scale,
+                               int roundingMode) {
+        BigDecimal bd = new BigDecimal(value);
+        bd = bd.setScale(scale, roundingMode);
+        double d = bd.doubleValue();
+        bd = null;
+        return d;
+    }
+
+    /**
+     * 获取四位小数的字符串,小数位不够补充0
+     * @param value
+     * @return  X.0000
+     */
+    public static String getFourString(double value){
+    	DecimalFormat df = new DecimalFormat("0.0000");
+		return df.format(value);
+    }
+    
+
+    /**
+     * double 相加
+     * @param d1
+     * @param d2
+     * @return
+     */
+    public static double sum(Double d1,Double d2){
+        BigDecimal bd1 = new BigDecimal(d1.toString());
+        BigDecimal bd2 = new BigDecimal(d2.toString());
+        return bd1.add(bd2).doubleValue();
+    }
+
+    public static double sum(String a,String b){
+        BigDecimal pa = new BigDecimal(a);
+        BigDecimal pb = new BigDecimal(b);
+        return pa.add(pb).doubleValue();
+    }
+
+
+    /**
+     * double 相减
+     * @param d1
+     * @param d2
+     * @return
+     */
+    public static double sub(double d1,double d2){
+        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
+        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
+        return bd1.subtract(bd2).setScale(6,BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+
+    /**
+     * double 乘法
+     * @param d1
+     * @param d2
+     * @return
+     */
+    public static double mul(double d1,double d2){
+        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
+        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
+        return bd1.multiply(bd2).setScale(6,BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+
+
+    /**
+     * double 除法
+     * @param d1
+     * @param d2
+     * @param scale 四舍五入 小数点位数
+     * @return
+     */
+    public static double div(double d1,double d2,int scale){
+        //  当然在此之前,你要判断分母是否为0,
+        //  为0你可以根据实际需求做相应的处理
+
+        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
+        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
+        return bd1.divide
+                (bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+
+    /**
+     * 长整数相乘
+     * @param pa
+     * @param pb
+     * @return
+     */
+    public static long longMul(long pa,long pb){
+        BigDecimal b1 = new BigDecimal(pa);
+        BigDecimal b2 = new BigDecimal(pb);
+        return b1.multiply(b2).longValue();
+    }
+
+    public static long longMul(long pa ,Double rate){
+        BigDecimal b1 = new BigDecimal(pa);
+        BigDecimal b2 = new BigDecimal(rate.toString());
+        b2 = b2.setScale(6,BigDecimal.ROUND_HALF_UP);
+        return b1.multiply(b2).longValue();
+    }
+
+    public static long longMul(long pa ,String rate){
+        BigDecimal b1 = new BigDecimal(pa);
+        BigDecimal b2 = new BigDecimal(rate);
+        return b1.multiply(b2).longValue();
+    }
+
+    /**
+     * 长整数相减
+     * @param pa
+     * @param pb
+     * @return
+     */
+    public static long longSub(long pa,long pb){
+        BigDecimal b1 = new BigDecimal(pa);
+        BigDecimal b2 = new BigDecimal(pb);
+        return b1.subtract(b2).longValue();
+    }
+
+    /**
+     * 长整数相加
+     * @param pa
+     * @param pb
+     * @return
+     */
+    public static long longAdd(long pa,long pb){
+        BigDecimal b1 = new BigDecimal(pa);
+        BigDecimal b2 = new BigDecimal(pb);
+        return b1.add(b2).longValue();
+    }
+
+    /**
+     * 入参转化
+     * @param value
+     * @return
+     */
+    public static long inputConvert(Double value){
+       BigDecimal input =  new BigDecimal(value.toString());
+       return input.multiply(UNIT).longValue();
+    }
+
+    /**
+     * 输出转化
+     * @param value
+     * @return
+     */
+    public static double outputConvert(long value){
+        BigDecimal output = new BigDecimal(value);
+        return output.divide(UNIT,6, RoundingMode.DOWN).doubleValue();
+    }
+
+    public static void main(String[] args) {
+        long res = longMul(100000000,0.000009999999);
+        System.out.println(res);
+
+    }
+    
+    public static long sum(Long d1,String d2){
+        BigDecimal bd1 = new BigDecimal(d1.toString());
+        BigDecimal bd2 = new BigDecimal(d2);
+        return bd1.add(bd2).longValue();
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/BlockSerive.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/BlockSerive.java
new file mode 100644
index 0000000..4784320
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/BlockSerive.java
@@ -0,0 +1,9 @@
+package com.xcong.excoin.modules.blackchain.service;
+
+import com.xcong.excoin.common.response.Result;
+
+public interface BlockSerive {
+
+	Result findBlockAddress(String symbol);
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/BtcService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/BtcService.java
new file mode 100644
index 0000000..b8a4c84
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/BtcService.java
@@ -0,0 +1,138 @@
+package com.xcong.excoin.modules.blackchain.service;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+
+
+public class BtcService {
+
+	
+	private static BtcService service = null;
+	private final static String RESULT = "result";
+	private final static String METHOD_SEND_TO_ADDRESS = "sendtoaddress";
+	private final static String METHOD_GET_TRANSACTION = "gettransaction";
+	private final static String METHOD_LIST_TRANSACTIONS = "listtransactions";
+	private final static String METHOD_GET_BLOCK_COUNT = "getblockcount";
+	private final static String METHOD_NEW_ADDRESS = "getnewaddress";
+	private final static String METHOD_GET_BALANCE = "getbalance";
+	private final static String METHOD_GET_BALANCE_ADDRESS = "getreceivedbyaddress";
+	private final static String METHOD_WALLET_PASSPHRASE = "walletpassphrase";
+	private final static String METHOD_WALLET_LOCK = "walletlock";
+
+	private String url = "http://120.55.86.146:1880";
+	private String username = "biyi";
+	private String password = "biyi1234";
+
+	public static BtcService getInstance() {
+		if (service != null) {
+			return service;
+		}
+		return new BtcService();
+	}
+
+	private BtcService() {
+	}
+
+	/**
+	 * 创建BTC钱包 每个账户对应一个地址 方便后续操作
+	 * @param mId 账户
+	 * @return
+	 */
+	public static Map<String, String> createWallet(String mId) {
+		BtcService btcService = getInstance();
+		// 创建钱包地址
+		String address = btcService.getAddress(mId);
+		// 私钥
+		String privateKey = btcService.dumpprivkey(address);
+		Map<String, String> result = new HashMap<String,String>();
+		result.put("address", address);
+		result.put("privateKey", privateKey);
+		return result;
+	}
+	public String getAddress(String label) {
+		try {
+			JSONObject json = doRequest(METHOD_NEW_ADDRESS,label);
+			if (isError(json)) {
+				return "";
+			}
+			return json.getString(RESULT);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	private JSONObject doRequest(String method, Object... params) {
+		JSONObject param = new JSONObject();
+		param.put("id", System.currentTimeMillis() + "");
+		param.put("jsonrpc", "2.0");
+		param.put("method", method);
+		if (params != null) {
+			param.put("params", params);
+		}
+		String creb = Base64.encodeBase64String((username + ":" + password).getBytes());
+		Map<String, String> headers = new HashMap<>(2);
+		headers.put("Authorization", "Basic " + creb);
+		return JSON.parseObject(HttpUtil.jsonPost(url, headers, param.toJSONString()));
+	}
+
+	private boolean isError(JSONObject json) {
+		if (json == null || (StringUtils.isNotEmpty(json.getString("error")) && json.get("error") != "null")) {
+			return true;
+		}
+		return false;
+	}
+	
+	public String dumpprivkey(String address) {
+		try {
+			JSONObject obj = doRequest("dumpprivkey", address);
+			System.out.println(obj);
+			if (!isError(obj)) {
+				return obj.getString(RESULT);
+			} else {
+				return null;
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	/**
+	 * 查询给定地址的总收款额(只计算接受的)
+	 * @param address
+	 * @return
+	 */
+	public BigDecimal getBalance(String address) {
+		JSONObject json = doRequest(METHOD_GET_BALANCE_ADDRESS,address,3);
+		if (!isError(json)) {
+			return new BigDecimal(json.getString(RESULT));
+		} else {
+			return null;
+		}
+	}
+	
+	public String METHOD_GET_BLOCK_COUNT() {
+		JSONObject json = doRequest(METHOD_GET_BLOCK_COUNT);
+		if (!isError(json)) {
+			return json.getString(RESULT);
+		} else {
+			return null;
+		}
+	}
+	public static void main(String[] args) {
+		BtcService ser = new BtcService();
+		//ser.getBalance("36RiLqCrnFfBoyUUHpGvEotXiMRtrJG8dp");
+		//System.out.println(ser.METHOD_GET_BLOCK_COUNT());
+	   System.out.println(ser.getBalance("36RiLqCrnFfBoyUUHpGvEotXiMRtrJG8dp"));
+	}
+	
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/DateUtil.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/DateUtil.java
new file mode 100644
index 0000000..d8217db
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/DateUtil.java
@@ -0,0 +1,1369 @@
+package com.xcong.excoin.modules.blackchain.service;
+import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.text.ParsePosition;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.lang.StringUtils;
+public class DateUtil {
+
+	public DateUtil() {
+
+	}
+	/**
+	 * 测试用
+	 * @param args
+	 * @throws ParseException 
+	 */
+	public static void main(String[] args) throws ParseException {
+//		long time = System.currentTimeMillis()+7200000;
+//		Date a = new Date(time);
+//		long space = dateSpaceHours(new Date(), a);
+//		System.out.println(space);
+//		System.out.println(DateUtil.dateToString(DateUtil.getStringToDate(DateUtil.getSQLDateYMD())));
+		
+//		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+//		Date date= DateUtil.addDays(new Date(), -1);
+//		System.out.println(date);
+//		System.out.println(DateUtil.dateToString(date));
+//		System.out.println(simpleDateFormat.format(date));
+//		System.out.println(DateUtil.getStringToDate(dateToStringYMD(date),"yyyy-MM-dd"));
+//		System.out.println(DateUtil.getStringToDate(null));
+		//for(int i=0;i<10;i++){
+		//System.out.println(getSQLDateYMD());
+		//}
+		//System.out.println(dateDiff("2013-06-08 12:25:23","2013-07-08 12:25:23"));
+		//		System.out.println(currentTimeDiff2("2013-12-08"));
+		//		System.out.println(compare_date("2013-07-08 12:25:23", "2013-07-08 12:23:23"));
+		//System.out.println(fomatDate("2013-10-16 9:27:34"));
+		//System.out.println(System.currentTimeMillis());
+		//System.out.println(getTenTimestamp());
+		//System.out.println(getSixRandom());
+		//		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		//获取当前时间
+		//		Date time = Calendar.getInstance().getTime();
+
+		//		System.out.println(simpleDateFormat.format(datePlusOrMinus("2013-10-16 9:27:34",2)));
+
+		//		System.out.println(dateToString(datePlusOrMinus(getSQLDate(), 2)));
+
+		//		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		//		String strDate1 = "2012-3-15";
+		//		String strDate2 = "2013-5-13";
+		//		Date date1=sdf.parse(strDate1);
+		//		Date date2=sdf.parse(strDate2);
+		//		//		
+		//		//		System.out.println(getMonths(date2,date1));
+		//		System.out.println(daysBetween(date2, date1));
+		//		System.out.println(fomatDate("2014-04"));
+		//		System.out.println(fomatDate("2014-05"));
+		//		System.out.println(Double.parseDouble(fomatDate("2014-05")) > Double.parseDouble(fomatDate("2014-04")));
+		//		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+		//		String date1 = "2014-04";
+		//		String date2 = "2015-08";
+		//		Date start = sdf.parse(date1);
+		//        Date end = sdf.parse(date2);
+		//        
+		//        
+		//        System.out.println("###start:==" + start);
+		//        System.out.println("###end:==" + end);
+
+		//		System.out.println("月份="+myTimeStr(9615000));
+		//		System.out.println(fomatDateToNumber("2014-07-28 14:12:14"));
+		//System.out.println(compareDate("2014-08-13","2014-08-12"));
+		//		System.out.println(getNineRandom());
+		//		System.out.println("222="+dateDiffStr("2014-06-11 00:00:00","2014-06-25 23:59:59"));
+//		System.out.println("getUTCTimeStr()=="+DateUtil.currentTimeDiffToHour("2015-01-22 18:12:59"));
+		//System.out.println(DateUtil.dateDiff("2015-09-02 09:55:14",DateUtil.dateToString(new Date())));
+		System.out.println(DateUtil.currentTimeDiff("2018-07-11 18:00:00"));
+	}
+	
+	/**
+	 * 计算今天的剩余秒数
+	 * @return
+	 */
+	public static int getTodaySeconds(){
+		Calendar cal = Calendar.getInstance();
+		long start = TimeUnit.MILLISECONDS.toSeconds(cal.getTimeInMillis());
+		cal.add(Calendar.DAY_OF_YEAR, 1);
+		cal.set(Calendar.MINUTE, 0);
+		cal.set(Calendar.HOUR_OF_DAY, 0);
+		cal.set(Calendar.SECOND, 0);
+		cal.set(Calendar.MILLISECOND, 0);
+		long end = TimeUnit.MILLISECONDS.toSeconds(cal.getTimeInMillis());
+		return (int) (end - start);
+	}
+	
+	/**
+	 * 获取当前分钟
+	 * @return
+	 */
+	public static Integer getNowDateMin(){
+		Calendar c1 = Calendar.getInstance();
+	    c1.setTime(new Date());
+	    return c1.get(Calendar.MINUTE);
+	}
+	/**
+	 * 获取当前day
+	 * @return
+	 */
+	public static Integer getNowDateDay(){
+		Calendar c1 = Calendar.getInstance();
+	    c1.setTime(new Date());
+	    return c1.get(Calendar.DATE);
+	}
+
+	/**
+	 * 获取当前秒
+	 * @return
+	 */
+	public static Integer getNowDateSecond(){
+		Calendar c1 = Calendar.getInstance();
+	    c1.setTime(new Date());
+	    return c1.get(Calendar.SECOND);
+	}
+	/**
+	 * 返回两个日期之间相差天数---只比较天数
+	 * @param fDate
+	 * @param oDate
+	 * @return
+	 */
+	public static int daysOfTwo(Date fDate, Date oDate) {
+
+	       Calendar aCalendar = Calendar.getInstance();
+
+	       aCalendar.setTime(fDate);
+
+	       int day1 = aCalendar.get(Calendar.DAY_OF_YEAR);
+
+	       aCalendar.setTime(oDate);
+
+	       int day2 = aCalendar.get(Calendar.DAY_OF_YEAR);
+
+	       return Math.abs(day2 - day1);
+
+	}
+	
+	/**
+	 * 把日期格式转换为字符串格式HH:mm:ss
+	 * @param date
+	 * @return
+	 */
+	public static String dateToStringHMS (Date date){
+		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
+		return simpleDateFormat.format(date);
+	}
+	/**
+	 * 把日期格式转换为字符串格式HH:mm
+	 * @param date
+	 * @return
+	 */
+	public static String dateToStringHM (Date date){
+		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
+		return simpleDateFormat.format(date);
+	}
+	/**
+	 * 把日期格式转换为字符串格式HHmm
+	 * @param date
+	 * @return
+	 */
+	public static int dateToIntHM (Date date){
+		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HHmm");
+		return Integer.parseInt(simpleDateFormat.format(date));
+	}
+	/**
+	 * 指定格式日期往后加多少分钟
+	 * @param format
+	 * @param StrDate
+	 * @param min
+	 * @return
+	 */
+	@SuppressWarnings("static-access")
+	public static String addMin(String format,String StrDate,int min){
+			Calendar   cal = Calendar.getInstance(); 
+			SimpleDateFormat sFmt = new SimpleDateFormat(format); 
+			cal.setTime(sFmt.parse( (StrDate), new ParsePosition(0))); 
+
+			if (min != 0) { 
+				cal.add(cal.MINUTE,min); 
+			} 
+			return sFmt.format(cal.getTime()); 
+	}
+	/**
+	 * 指定格式日期往后加多少分钟
+	 * @param date
+	 * @param min
+	 * @return
+	 */
+	public static Date addMin(Date date,int min){
+			Calendar   cal = Calendar.getInstance(); 
+			cal.setTime(date); 
+			if (min != 0) { 
+				cal.add(Calendar.MINUTE,min); 
+			} 
+			return cal.getTime(); 
+	}
+	/**
+	 * HH:mm:ss上加秒
+	 * @param date
+	 * @param seconds
+	 * @return
+	 */
+    public static String addSecond(Date date, int seconds) {
+    	Calendar calendar = Calendar.getInstance();
+    	calendar.setTime(date);
+    	calendar.add(Calendar.SECOND, seconds);
+    	date =calendar.getTime();
+    	return dateToStringHMS(date);
+    }
+
+	/**
+	 * 产生2位
+	 */
+	public static String getThreeRandom(){
+		int random1 = (int) (Math.random() * 900 + 100);
+		String random = String.valueOf(random1);
+		return random;
+	}
+	
+	/**
+	 * 把日期格式转换为字符串格式yyyy-MM-dd
+	 * @param
+	 * @return
+	 */
+	public static String dateToStringYMD (){
+		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+		return simpleDateFormat.format(new Date());
+	}
+	/**
+	 * 把日期格式转换为字符串格式yyyy-MM-dd
+	 * @param
+	 * @return
+	 */
+	public static String dateToStringYMD (Date data){
+		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+		return simpleDateFormat.format(data);
+	}
+	
+	/**
+	   * String类型时间转为Timestamp,str与format必须格式一致
+	   * 
+	    * @param str
+	   * @param
+	   * @return
+	 */
+	public static Timestamp str2Timestamp(String str) {
+	      Timestamp ts = null;
+	      try {
+	         if (null != str && !"".equals(str)) {
+	            DateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+	            ts = new Timestamp(sdf.parse(str).getTime());
+	         }
+	      } catch (Exception e) {
+	         // TODO: handle exception
+	         e.printStackTrace();
+	      }
+	      return ts;
+	 }
+
+	/**
+	   * Date类型时间转为String格式,format为需要返回的格式
+	   * 
+	   * @param
+	   * @param
+	   * @return
+	*/
+	public static String timeStamp2Str(Date dateTime) {
+		/*SimpleDateFormat oldFormat  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		Date date = new Date();
+		try {
+			date = oldFormat.parse(dateTime);
+		} catch (ParseException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}*/
+	    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+	    return sdf.format(dateTime);
+	}
+	   
+	/**
+	 * 获取一个月的天数
+	 * @param year
+	 * @param month
+	 * @return
+	 */
+	public static int dateToString (String year,String month){
+        Calendar c= Calendar.getInstance();
+		 	c.set(Calendar.YEAR, Integer.parseInt(year));
+		 	c.set(Calendar.MONTH, Integer.parseInt(month)+1);
+		return c.getActualMaximum(Calendar.DAY_OF_MONTH);
+	}
+	
+	/**
+	 * 把日期格式转换为字符串格式
+	 * @param date
+	 * @return
+	 */
+	public static String dateToString (Date date){
+		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		return simpleDateFormat.format(date);
+	}
+	/**
+	 * 把日期格式转换为字符串格式
+	 * @param date
+	 * @return
+	 */
+	public static String dateToString (Date date,String dateFormat){
+		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
+		return simpleDateFormat.format(date);
+	}
+
+	/**
+	 * 把日期格式转换为YYMMDDHHMMSS格式
+	 * @param
+	 * @return
+	 */
+	public static String dateToNumber (String time){
+		SimpleDateFormat oldFormat  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		SimpleDateFormat newFormat  = new SimpleDateFormat("yyMMddHHmmss");
+		Date date = new Date();
+		try {
+			date = oldFormat.parse(time);
+		} catch (ParseException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return newFormat.format(date);
+	}
+
+	/**
+	 * 根据有效期格式化时间
+	 * @param type  1每年 2 每月 3 每天 4 每小时 5 每分钟
+	 * @param time  yyMMddHHmmss
+	 * @return
+	 */
+	public static String termvalidityFormat(int type,String time){
+		String retime = null;
+		try {
+
+			if(type == 1){
+				retime = "00"+time.substring(2, time.length());
+			}else if(type == 2){
+				retime = "0000"+time.substring(4, time.length());
+			}else if(type == 3){
+				retime = "000000"+time.substring(6, time.length());
+			}else if(type == 4){
+				retime = "00000000"+time.substring(8, time.length());
+			}else if(type == 5){
+				retime = "0000000000"+time.substring(10, time.length());
+			}else {
+				retime = time;
+			}
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return retime;
+
+	}
+
+	/**
+	 * 把原始字符串扩展成自定的长度
+	 * @param oriStr 原始字符串
+	 * @param fillChar 要填充的字符
+	 * @param setLength 要扩展成的长度
+	 * @param preFill 前扩充还是后扩充 true-在前面填充,false-后面填充
+	 * @return
+	 */
+	public static String fixStringToSetLength(String oriStr, String fillChar, int setLength, boolean preFill) {
+		if(oriStr == null || fillChar.equals("")) {
+			return oriStr;
+		}
+
+		int oriLength = oriStr.length();
+		StringBuilder sb = null;
+		if(preFill == true) {
+			sb = new StringBuilder();
+			for(int i = oriLength; i < setLength; i++) {
+				sb.append(fillChar);
+			}
+			sb.append(oriStr);
+		} else {
+			sb = new StringBuilder(oriStr);
+			for(int i = oriLength; i < setLength; i++) {
+				sb.append(fillChar);
+			}
+		}
+
+		return sb.toString();
+	}
+
+
+
+	//日期往后加多少个月,多少天,多少年
+	@SuppressWarnings("static-access")
+	public static String addMonth(String format,String StrDate,int year,int month,int day){
+
+		Calendar   cal = Calendar.getInstance(); 
+		SimpleDateFormat sFmt = new SimpleDateFormat(format); 
+		cal.setTime(sFmt.parse( (StrDate), new ParsePosition(0))); 
+
+		if (day != 0) { 
+			cal.add(cal.DATE,day); 
+		} 
+		if (month != 0) { 
+			cal.add(cal.MONTH, month); 
+		} 
+		if (year != 0) { 
+			cal.add(cal.YEAR, year); 
+		} 
+		return sFmt.format(cal.getTime()); 
+	}
+
+	/**
+	 * 在当前时间增加或减少N个小時
+	 * @param
+	 * @param month
+	 * @return
+	 */
+	public static Date addHour(int hour){
+		Calendar   cal = Calendar.getInstance();
+		cal.add( Calendar.HOUR, hour);
+		return cal.getTime();
+	}
+	
+	/**
+	 * 在当前时间增加或减少N个月
+	 * @param
+	 * @param month
+	 * @return
+	 */
+	public static Date addMonth(int month){
+		Calendar   cal = Calendar.getInstance();
+		cal.add( Calendar.MONTH, month);
+		return cal.getTime();
+	}
+	
+	/**
+	 * 增加days天
+	 * @param date
+	 * @param days
+	 * @return
+	 */
+	public static Date addDays(Date date ,int days){
+		Calendar   cal = Calendar.getInstance();
+		cal.setTime(date);
+		cal.add(Calendar.DAY_OF_MONTH, days);
+		return cal.getTime();
+	}
+	/**
+	 * 判断两个时间字符串之差
+	 * @param date1
+	 * @param date2
+	 * @return 毫秒数
+	 */
+	public static Long dateDiff(String date1,String date2) {
+		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		try {
+			return df.parse(date1).getTime() - df.parse(date2).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	/**
+	 * 判断两个指定格式时间字符串之差
+	 * @param format
+	 * @param date1
+	 * @param date2
+	 * @return 毫秒数
+	 */
+	public static Long dateDiff(String format,String date1,String date2) {
+		DateFormat df = new SimpleDateFormat(format);
+		try {
+			return df.parse(date1).getTime() - df.parse(date2).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/**
+	 * 计算时间差,相差多少天、小时、分、秒
+	 * @param stime
+	 * @param etime
+	 * @return
+	 */
+	public static String dateDiffStr(String stime,String etime){
+		String diff = "";
+		try {
+			SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+			java.util.Date begin=dfs.parse(stime);
+			java.util.Date end = dfs.parse(etime);
+			long between=(end.getTime()-begin.getTime())/1000;//除以1000是为了转换成秒
+			long day1=between/(24*3600);
+			long hour1=between%(24*3600)/3600;
+			long minute1=between%3600/60;
+			long second1=between%60;
+			System.out.println(""+day1+"天"+hour1+"小时"+minute1+"分"+second1+"秒");
+			if(day1>0){
+				diff = ""+day1+"天"+hour1+"小时"+minute1+"分"+second1+"秒";
+				return diff;
+			}
+
+			if(hour1>0){
+				diff = ""+hour1+"小时"+minute1+"分"+second1+"秒";
+				return diff;
+			}
+
+			if(minute1>0){
+				diff = ""+minute1+"分"+second1+"秒";
+				return diff;
+			}
+
+			if(second1>=0){
+				diff = ""+second1+"秒";
+				return diff;
+			}
+
+			return diff;
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return diff;
+
+	}
+
+	/**
+	 * 和当前时间差 
+	 * @param date
+	 * @return 当前时间 - date 毫秒数
+	 */
+	public static Long currentTimeDiff(String date) {
+		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		try {
+			return System.currentTimeMillis() -  df.parse(date).getTime();
+		} catch (ParseException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return null;
+	}
+	/**
+	 * 和当前时间差 
+	 * @param date
+	 * @return 当前时间 - date 返回相差小时
+	 */
+	public static int currentTimeDiffToHour(String date) {
+		if(date == null || date.equals("")){
+			return 25;
+		}
+		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		try {
+			Long longss = System.currentTimeMillis() -  df.parse(date).getTime();
+			int hour = Integer.parseInt(longss/(1000*3600)+"");
+			return hour;
+		} catch (ParseException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return 25;
+	}
+
+	/**
+	 * 和当前时间差 分钟
+	 * @param date
+	 * @return 当前时间 - 返回分钟
+	 */
+	public static int currentTimeDiffToMin(String date) {
+		if(date == null || date.equals("")){
+			return 25;
+		}
+		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		try {
+			Long longss = System.currentTimeMillis() -  df.parse(date).getTime();
+			int hour = Integer.parseInt(longss/(1000*60)+"");
+			return hour;
+		} catch (ParseException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return 0;
+	}
+	/**
+	 * 和当前时间差(不需要时分秒) 
+	 * @param date
+	 * @return 当前时间 - date 
+	 * 
+	 * 	 */
+	public static Long currentTimeDiff2(String date) {
+		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+		try {
+			return System.currentTimeMillis() -  df.parse(date).getTime();
+		} catch (ParseException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+
+	/**
+	 * 日期比较
+	 * @param DATE1
+	 * @param DATE2
+	 * @return DATE1 > DATE2 返回1 
+	 */
+	public static int compare_date(String DATE1, String DATE2) {
+
+
+		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		try {
+			Date dt1 = df.parse(DATE1);
+			Date dt2 = df.parse(DATE2);
+			if (dt1.getTime() > dt2.getTime()) {
+				return 1;
+			} else if (dt1.getTime() < dt2.getTime()) {
+				return -1;
+			} else {
+				return 0;
+			}
+		} catch (Exception exception) {
+			exception.printStackTrace();
+		}
+		return 0;
+	}
+	
+	
+	/**
+	 * 日期比较
+	 * @param DATE1
+	 * @param DATE2
+	 * @return DATE1 > DATE2 返回1 
+	 */
+	public static int compareDate(String DATE1, String DATE2) {
+
+		if(DATE1 == null || DATE1.equals("")){
+			return -1;
+		}
+		if(DATE2 == null || DATE2.equals("")){
+			return 1;
+		}
+		if(DATE1.equals(DATE2)){
+			return 0;
+		}
+		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+		try {
+			Date dt1 = df.parse(DATE1);
+			Date dt2 = df.parse(DATE2);
+			if (dt1.getTime() > dt2.getTime()) {
+				return 1;
+			} else if (dt1.getTime() < dt2.getTime()) {
+				return -1;
+			} else {
+				return 0;
+			}
+		} catch (Exception exception) {
+			exception.printStackTrace();
+		}
+		return 0;
+	}
+	
+
+	/**
+	 * 日期比较
+	 * @param DATE1
+	 * @param DATE2
+	 * @return DATE1 > DATE2 返回1 
+	 */
+	public static int compareDate(String DATE1, String DATE2,String formate) {
+
+		if(DATE1 == null || DATE1.equals("")){
+			return -1;
+		}
+		if(DATE2 == null || DATE2.equals("")){
+			return 1;
+		}
+		if(DATE1.equals(DATE2)){
+			return 0;
+		}
+		DateFormat df = new SimpleDateFormat(formate);
+		try {
+			Date dt1 = df.parse(DATE1);
+			Date dt2 = df.parse(DATE2);
+			if (dt1.getTime() > dt2.getTime()) {
+				return 1;
+			} else if (dt1.getTime() < dt2.getTime()) {
+				return -1;
+			} else {
+				return 0;
+			}
+		} catch (Exception exception) {
+			exception.printStackTrace();
+		}
+		return 0;
+	}
+
+
+	/**
+	 * 将日期yyyy-MM-dd HH:mm:ss 格式化为 yyyyMMddHHmmss
+	 * @param date
+	 * @return
+	 */
+	public static String fomatDate(String date){
+		String dateStr = null;
+		if(date == null || "".equals(date)){
+			dateStr = "";
+		}else{
+			try {
+				dateStr = date.replaceAll(":", "").replaceAll("-", "").replaceAll(" ", "");
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+
+		return dateStr;
+	}
+
+	/**
+	 * 获取插入数据库格式的时间
+	 * @return
+	 */
+	public static String getSQLDate() {
+		String systemdate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
+		.format(Calendar.getInstance().getTime()); // 获取系统当前时间
+		return systemdate;
+	}
+
+	/**
+	 * 字符串转日期 yyyy-MM-dd HH:mm:ss
+	 * @param date
+	 * @return
+	 */
+	public static Date getStringToDate(String date){
+		if (StringUtils.isEmpty(date)) {
+			return null;
+		}
+		Date date2 = new Date();
+		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		try {
+			date2 = simpleDateFormat.parse(date);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return date2;
+	}
+	/**
+	 * 字符串转日期 yyyy-MM-dd HH:mm:ss
+	 * @param date
+	 * @return
+	 */
+	public static Date getStringToDate(String date,String format){
+		Date date2 = new Date();
+		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
+		try {
+			date2 = simpleDateFormat.parse(date);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return date2;
+	}
+	
+	/**
+	 * 获取插入数据库格式的时间yyyy-MM-dd
+	 * @return
+	 */
+	public static String getSQLDateYMD() {
+		String systemdate = new SimpleDateFormat("yyyy-MM-dd")
+		.format(Calendar.getInstance().getTime()); // 获取系统当前时间
+		return systemdate;
+	}
+
+	public static Integer getSQLDateMonth() {
+		String systemdate = new SimpleDateFormat("MM")
+		.format(Calendar.getInstance().getTime()); // 获取系统当前时间
+		return Integer.parseInt(systemdate);
+	}
+
+	/**
+	 * 对月份进行加减
+	 * @param i
+	 * @return
+	 * @throws ParseException 
+	 */
+	public static Date datePlusOrMinus(String systime ,Integer i) throws ParseException{
+		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		Date systDate =df.parse(systime);
+		GregorianCalendar gc =new GregorianCalendar();
+		gc.setTime(systDate);
+		gc.add(2,i);
+		return gc.getTime();
+	}
+
+	/**
+	 * 得到月日时分秒10位时间戳字符串
+	 */
+	public static String getTenTimestamp() {
+		String systemdate = new SimpleDateFormat("MMddHHmmss").format(Calendar.getInstance().getTime());
+		return systemdate;
+	}
+
+
+	/**
+	 * 得到年月日
+	 */
+	public static String getDateTime() {
+		SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
+		String systemdate = sdf.format(Calendar.getInstance().getTime());
+		return systemdate.substring(0, systemdate.length());
+	}
+
+	/**
+	 * 得到16位时间戳字符串,前面14位年月日时分秒,第15位毫秒,第16位随机数
+	 */
+	public static String getUniqueTimestamp() {
+		SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmssSSS");
+		String systemdate = sdf.format(Calendar.getInstance().getTime());
+		return systemdate.substring(0, systemdate.length()-2)+getOneRandom();
+	}
+
+	/**
+	 * 产生6位随机数
+	 */
+	public static String getSixRandom(){
+		int random1 = (int) (Math.random() * 900000 + 100000);
+		String random = String.valueOf(random1);
+		return random;
+	}
+	
+	/**
+	 * 产生4位随机数
+	 */
+	public static String getFourRandom(){
+		int random1 = (int) (Math.random() * 9000 + 1000);
+		String random = String.valueOf(random1);
+		return random;
+	}
+	/**
+	 * 产生2位随机数
+	 */
+	public static String getTwoRandom(){
+		int random1 = (int) (Math.random() * 90 + 10);
+		String random = String.valueOf(random1);
+		return random;
+	}
+	/**
+	 * 产生1位随机数
+	 */
+	public static String getOneRandom(){
+		int random1 = (int) (Math.random() * 9 + 1);
+		String random = String.valueOf(random1);
+		return random;
+	}
+
+	/**
+	 * 产生2位小于60的随机数
+	 */
+	public static String getTwoRandomSixth(){
+		int random1 = (int) (Math.random() * 90 + 10);
+		String random = String.valueOf(random1);
+		return random;
+	}
+	/**
+	 * 产生-10——10之间的数字
+	 * @return
+	 */
+	public static Integer randomZF(){
+		int a=(int)(Math.random()*2+1);
+		//System.out.println(a);
+		int aa=(int)(Math.pow(-1, a));
+		//System.out.println(aa);
+		int aaa=(int)(Math.random()*10+1);
+		int num=aa*aaa;
+		//System.out.println(num);
+		return num;
+	}
+
+	/**
+	 * 计算两个日期之间相差的月数
+	 *
+	 * @param date1
+	 * @param date2
+	 * @return
+	 */
+	public static int getMonths(Date date1, Date date2) {
+		int iMonth = 0;
+		int flag = 0;
+		try {
+			Calendar objCalendarDate1 = Calendar.getInstance();
+			objCalendarDate1.setTime(date1);
+
+			Calendar objCalendarDate2 = Calendar.getInstance();
+			objCalendarDate2.setTime(date2);
+
+			if (objCalendarDate2.equals(objCalendarDate1))
+				return 0;
+			if (objCalendarDate1.after(objCalendarDate2)) {
+				Calendar temp = objCalendarDate1;
+				objCalendarDate1 = objCalendarDate2;
+				objCalendarDate2 = temp;
+			}
+			if (objCalendarDate2.get(Calendar.DAY_OF_MONTH) < objCalendarDate1
+					.get(Calendar.DAY_OF_MONTH))
+				flag = 1;
+
+			if (objCalendarDate2.get(Calendar.YEAR) > objCalendarDate1
+					.get(Calendar.YEAR))
+				iMonth = ((objCalendarDate2.get(Calendar.YEAR) - objCalendarDate1
+						.get(Calendar.YEAR))
+						* 12 + objCalendarDate2.get(Calendar.MONTH) - flag)
+						- objCalendarDate1.get(Calendar.MONTH);
+			else
+				iMonth = objCalendarDate2.get(Calendar.MONTH)
+				- objCalendarDate1.get(Calendar.MONTH) - flag;
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return iMonth;
+	}
+
+	/**
+	 * 计算两个日期之间相差的天数
+	 *
+	 * @param date1
+	 * @param date2
+	 * @return
+	 */
+	public static final int daysBetween(Date date1, Date date2) { 
+
+		java.util.Calendar time1 = java.util.Calendar.getInstance();   
+		java.util.Calendar time2 = java.util.Calendar.getInstance();  
+		time1.setTime(date1);
+		time2.setTime(date2);
+		int days = 0;
+		if(time1.getTime().getTime() >= time2.getTime().getTime()){
+			days = ((int) (time1.getTime().getTime() / 1000) - (int) (time2.getTime().getTime() / 1000)) / 3600 / 24;   
+		}else{
+			days = ((int) (time2.getTime().getTime() / 1000) - (int) (time1.getTime().getTime() / 1000)) / 3600 / 24;   
+		}
+		return days;   
+	} 
+
+	/**
+	 * 计算两个日期之间相差秒
+	 *
+	 * @param sdate1
+	 * @param sdate2
+	 * @return
+	 */
+	public static final int secBetween(String sdate1, String sdate2) { 
+		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
+		Date date1 = null;
+		try {
+			date1 = df.parse(sdate1);
+		} catch (ParseException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		Date date2 = null;
+		try {
+			date2 = df.parse(sdate2);
+		} catch (ParseException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		java.util.Calendar time1 = java.util.Calendar.getInstance();   
+		java.util.Calendar time2 = java.util.Calendar.getInstance();  
+		time1.setTime(date1);
+		time2.setTime(date2);
+
+		int sec = 0;
+		if(time1.getTime().getTime() >= time2.getTime().getTime()){
+			sec = ((int) (time1.getTime().getTime() / 1000) - (int) (time2.getTime().getTime() / 1000));   
+		}else{
+			sec = ((int) (time2.getTime().getTime() / 1000) - (int) (time1.getTime().getTime() / 1000));   
+		}
+		return sec;   
+	} 
+
+	/**
+	 * 
+	 * @param date1 <String>
+	 * @param date2 <String>
+	 * @return int
+	 * @throws ParseException
+	 */
+	public static int getMonthSpace(String date1, String date2)
+	throws ParseException {
+
+		int result = 0;
+
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+
+		Calendar c1 = Calendar.getInstance();
+		Calendar c2 = Calendar.getInstance();
+
+		c1.setTime(sdf.parse(date1));
+		c2.setTime(sdf.parse(date2));
+
+		result = c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH);
+
+		return result == 0 ? 1 : Math.abs(result);
+
+	}
+
+	/**
+	 * 根据毫秒数计算时分秒
+	 * @param timeMillis
+	 * @return
+	 */
+	public static String myTimeStr(long timeMillis) {  
+		int timezone = 8;  
+		long totalSeconds = timeMillis / 1000;  
+		totalSeconds += 60 * 60 * timezone;  
+		int second = (int)(totalSeconds % 60);// 秒  
+		long totalMinutes = totalSeconds / 60;  
+		int minute = (int)(totalMinutes % 60);// 分  
+		long totalHours = totalMinutes / 60;  
+		int hour = (int)(totalHours % 24);// 时  
+		int totalDays = (int)(totalHours / 24);  
+
+		int _year = 1970;  
+
+		int year = _year + totalDays / 366;  
+		int month = 1;  
+		int day = 1;  
+
+		int diffDays;  
+		boolean leapYear;  
+		while (true) {  
+			int diff = (year - _year) * 365;  
+			diff += (year - 1) / 4 - (_year - 1) / 4;  
+			diff -= ((year - 1) / 100 - (_year - 1) / 100);  
+			diff += (year - 1) / 400 - (_year - 1) / 400;  
+
+			diffDays = totalDays - diff;  
+
+			leapYear = (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0);  
+			if (!leapYear && diffDays < 365 || leapYear && diffDays < 366) {  
+				break;  
+			} else {  
+				year++;  
+			}  
+		}  
+
+		int[] monthDays;  
+		if (diffDays >= 59 && leapYear) {  
+			monthDays = new int[]{-1,0,31,60,91,121,152,182,213, 244, 274, 305, 335 };  
+		} else {  
+			monthDays = new int[]{-1,0,31,59,90,120,151,181,212, 243, 273, 304, 334 };  
+		}  
+		for (int i = monthDays.length - 1; i >= 1; i--) {  
+			if (diffDays >= monthDays[i]) {  
+				month = i;  
+				day = diffDays - monthDays[i] + 1;  
+				break;  
+			}  
+		}  
+
+		return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;  
+
+	}  
+	/**
+	 * 根据秒数计算小时
+	 * @param
+	 * @return
+	 */
+	public static String secondToHour(String second) {  
+		if(second == null || "".equals(second) || "null".equals(second)){
+			return null;
+		}
+		Double sec = Double.parseDouble(second);
+		Double hour = sec/3600;
+		DecimalFormat df=new DecimalFormat("0.0");  
+		return df.format(hour).toString();  
+	}
+	/**
+	 * 根据秒数计算分钟
+	 * @param
+	 * @return
+	 */
+	public static String secondToMinute(String second) {  
+		if(second == null || "".equals(second) || "null".equals(second)){
+			return null;
+		}
+		Double sec = Double.parseDouble(second);
+		Double minute = sec/60;
+		DecimalFormat df=new DecimalFormat("0.0");  
+		return df.format(minute).toString();  
+	}
+	/**
+	 * 根据小时数计算秒
+	 * @param
+	 * @return
+	 */
+	public static String hourToSecond(String hour) {  
+		if(hour == null || "".equals(hour) || "null".equals(hour)){
+			return null;
+		}
+		DecimalFormat df=new DecimalFormat("0"); 
+		return df.format(Double.parseDouble(hour)*3600).toString();
+	}
+	/**
+	 * 根据分钟计算秒
+	 * @param
+	 * @return
+	 */
+	public static String MinuteToSecond(String minute) {  
+		if(minute == null || "".equals(minute) || "null".equals(minute)){
+			return null;
+		}
+		DecimalFormat df=new DecimalFormat("0"); 
+		return df.format(Double.parseDouble(minute)*60).toString();
+	}
+
+	/**
+	 * 将日期yyyy-MM-dd HH:mm:ss 格式化为 yyMMddHHmmss
+	 * @param date
+	 * @return
+	 */
+	public static String fomatDateToNumber(String date){
+		String dateStr = null;
+		if(date == null || "".equals(date)){
+			dateStr = "";
+		}else{
+			try {
+				dateStr = date.replaceAll(":", "").replaceAll("-", "").replaceAll(" ", "");
+				dateStr = dateStr.substring(2);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+
+		return dateStr;
+	}
+
+	/**
+	 * 把YYMMDDHHMMSS格式转换为date格式
+	 * @param
+	 * @return
+	 */
+	public static String numberToDate (String number){
+		SimpleDateFormat oldFormat  = new SimpleDateFormat("yyMMddHHmmss");
+		SimpleDateFormat newFormat  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		Date date = new Date();
+		try {
+			date = oldFormat.parse(number);
+		} catch (ParseException e) {
+			e.printStackTrace();
+			return null;
+		}
+		return newFormat.format(date);
+	}
+
+	/**
+	 * 产生8位HHmmss
+	 */
+	public static String getEightRandom(){
+		String systemdate = new SimpleDateFormat("HHmmss")
+		.format(Calendar.getInstance().getTime()); // 获取系统当前时间
+		int random1 = (int) (Math.random() * 90 + 10);
+		String random = String.valueOf(random1);
+		return systemdate + random;
+	}
+
+	/**
+	 * 时间戳转换成时间
+	 * @param time
+	 * @return
+	 */
+	public static String TimeStampToDateTime(long time){
+		String datetime = null;
+		try {
+			SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
+			datetime = sdf.format(new Date(time*1000)); 
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return datetime;
+	}
+	
+
+	/**
+	 * 时间转成时间戳 毫秒
+	 * @param datetime
+	 * @return
+	 */
+	public static long DateTimeToTimeStampSS(String datetime){
+		 try {
+			 SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+		     Date date=simpleDateFormat.parse(datetime);
+		     long timeStemp = date.getTime();
+		     return timeStemp;
+		} catch (Exception e) {
+			e.printStackTrace();
+			return 0L ;
+		}
+		
+	}
+	
+	/**
+	 * 时间转成时间戳 秒
+	 * @param datetime
+	 * @return
+	 */
+	public static long DateTimeToTimeStampS(String datetime){
+		 try {
+			 SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+		     Date date=simpleDateFormat.parse(datetime);
+		     long timeStemp = date.getTime()/1000;
+		     return timeStemp;
+		} catch (Exception e) {
+			e.printStackTrace();
+			return System.currentTimeMillis()/1000 ;
+		}
+		
+	}
+	
+	/**
+	 * 转成时间戳
+	 * @param datetime
+	 * @return
+	 */
+	public static long NumberTimeToTimeStamp(String datetime){
+		try {
+			SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyMMddHHmmss");
+			Date date=simpleDateFormat.parse(datetime);
+			long timeStemp = date.getTime()/1000;
+			return timeStemp;
+		} catch (Exception e) {
+			e.printStackTrace();
+			return System.currentTimeMillis()/1000 ;
+		}
+		
+	}
+
+	/** 
+	 * 得到UTC时间,类型为字符串,格式为"yyyy-MM-dd HH:mm"<br /> 
+	 * 如果获取失败,返回null 
+	 * @return 
+	 */  
+	public static String getUTCTimeStr() {
+		SimpleDateFormat foo = new SimpleDateFormat("yyyy-MM-dd hh:mm");
+		System.out.println("foo:"+foo.format(new Date()));
+
+		Calendar gc = GregorianCalendar.getInstance();
+		System.out.println("gc.getTime():"+gc.getTime());
+		System.out.println("gc.getTimeInMillis():"+new Date(gc.getTimeInMillis()));
+
+		//当前系统默认时区的时间:
+		Calendar calendar=new GregorianCalendar();
+		System.out.print("时区:"+calendar.getTimeZone().getID()+"  ");
+		System.out.println("时间:"+calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE));
+		//美国洛杉矶时区
+		TimeZone tz=TimeZone.getTimeZone("America/Los_Angeles");
+		//时区转换
+		calendar.setTimeZone(tz);
+		System.out.print("时区:"+calendar.getTimeZone().getID()+"  ");
+		System.out.println("时间:"+calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE));
+
+		//1、取得本地时间:
+		java.util.Calendar cal = java.util.Calendar.getInstance();
+
+		//2、取得时间偏移量:
+		int zoneOffset = cal.get(java.util.Calendar.ZONE_OFFSET);
+
+		//3、取得夏令时差:
+		int dstOffset = cal.get(java.util.Calendar.DST_OFFSET);
+
+		//4、从本地时间里扣除这些差量,即可以取得UTC时间:
+		cal.add(java.util.Calendar.MILLISECOND, -(zoneOffset + dstOffset));
+
+		//之后调用cal.get(int x)或cal.getTimeInMillis()方法所取得的时间即是UTC标准时间。
+		System.out.println("UTC:"+new Date(cal.getTimeInMillis()));
+
+		Calendar calendar1 = Calendar.getInstance();
+		TimeZone tztz = TimeZone.getTimeZone("GMT");       
+		calendar1.setTimeZone(tztz);
+		System.out.println(calendar.getTime());
+		System.out.println("9999:"+calendar.getTimeInMillis()/1000);
+
+		System.out.println("utc1="+System.currentTimeMillis()/1000);
+		System.out.println("utc="+new Date().getTime()/1000);
+
+
+		System.out.println(TimeStampToDateTime(1421724351));
+		System.out.println("=="+DateTimeToTimeStampS("2015-01-20 11:35:06"));
+		System.out.println(TimeStampToDateTime(DateTimeToTimeStampS("2015-01-20 11:35:06")));
+		return null;
+	}  
+
+	/** 
+     * 获得指定日期的前/后n天,小时
+     *  
+     * @param specifiedDay 
+     * @return 
+     */  
+    public static String getSpecifiedDayAbove(String specifiedDay,int n,int h) {  
+        Calendar c = Calendar.getInstance();  
+        Date date = null;  
+        try {  
+            date = new SimpleDateFormat("yy-MM-dd HH:mm:ss").parse(specifiedDay);  
+        } catch (ParseException e) {  
+            e.printStackTrace();  
+        }  
+        c.setTime(date);  
+        int day = c.get(Calendar.DATE);  
+        c.set(Calendar.DATE, day + n);  
+        int hour = c.get(Calendar.HOUR);
+        c.set(Calendar.HOUR,hour + h);
+  
+        String dayAfter = new SimpleDateFormat("yy-MM-dd HH:mm:ss")  
+                .format(c.getTime());  
+        return dayAfter;  
+    } 
+    
+    /**
+     * 两个时间的小时差
+     * @param st
+     * @param ed
+     * @return
+     */
+    public static long dateSpaceHours(Date st,Date ed){
+    	return (long) Math.ceil((ed.getTime() - st.getTime())/3600000.0);
+    }
+	
+    public static String formatDate(Date date,  String format) throws ParseException {
+		DateFormat df = new SimpleDateFormat(format);
+		df.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+		return df.format(date);
+	}
+	public static Date parseDate(String date,  String format) {
+		DateFormat df = new SimpleDateFormat(format);
+		df.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+		try {
+			return df.parse(date);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+}
+
+
+
+
+
+
+
+
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java
new file mode 100644
index 0000000..a897a16
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java
@@ -0,0 +1,283 @@
+package com.xcong.excoin.modules.blackchain.service;
+
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+
+import org.web3j.abi.FunctionEncoder;
+import org.web3j.abi.FunctionReturnDecoder;
+import org.web3j.abi.TypeReference;
+import org.web3j.abi.datatypes.Address;
+import org.web3j.abi.datatypes.Function;
+import org.web3j.abi.datatypes.Type;
+import org.web3j.abi.datatypes.generated.Uint256;
+import org.web3j.crypto.Credentials;
+import org.web3j.crypto.RawTransaction;
+import org.web3j.crypto.TransactionEncoder;
+import org.web3j.crypto.WalletUtils;
+import org.web3j.protocol.Web3j;
+import org.web3j.protocol.admin.Admin;
+import org.web3j.protocol.core.DefaultBlockParameterName;
+import org.web3j.protocol.core.Request;
+import org.web3j.protocol.core.methods.request.Transaction;
+import org.web3j.protocol.core.methods.response.*;
+import org.web3j.protocol.http.HttpService;
+import org.web3j.utils.Convert;
+import org.web3j.utils.Numeric;
+import org.web3j.utils.Convert.Unit;
+
+/**
+ * ETH类,使用Web3j 下面为使用教程
+ * https://kauri.io/article/925d923e12c543da9a0a3e617be963b4/manage-an-ethereum-account-with-java-and-web3js
+ * 
+ * @author Administrator
+ *
+ */
+
+public class EthService {
+
+	private static String ethWalletPath = "/home/javaweb/webresource/eth";
+	// private static String ethWalletPath="E://";
+	private Web3j web3j;
+	// private Admin admin;
+	// private Parity parity;
+	/**
+	 * 服务器地址
+	 */
+	//private static final String ETH_UTL = "https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321";
+	private static final String ETH_UTL = "http://120.55.86.146:8545";
+
+	public EthService() {
+		try {
+			HttpService service = new HttpService(ETH_UTL);
+			web3j = Web3j.build(service);
+			// parity = Parity.build(service);
+			// admin = Admin.build(service);
+		} catch (Exception e) {
+			System.out.println("liangjieshibao");
+			// logger.error("==============虚拟币-以太坊链接获取失败!");
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * 查询ETH余额
+	 * 
+	 * @param address
+	 * @return
+	 */
+	public static BigDecimal getEthBlance(String address) {
+		Web3j web3 = Web3j.build(new HttpService(ETH_UTL));
+		EthGetBalance balanceWei;
+		try {
+			balanceWei = web3.ethGetBalance(address, DefaultBlockParameterName.LATEST).send();
+			if (balanceWei.getResult() == null) {
+				return null;
+			}
+			BigDecimal balanceInEther = Convert.fromWei(balanceWei.getBalance().toString(), Unit.ETHER);
+			return balanceInEther;
+		} catch (Exception e) {
+			System.out.println("ETH查询失败:" + address);
+			e.printStackTrace();
+		}
+		return null;
+
+	}
+
+	/**
+	 * 创建ETH钱包
+	 * 
+	 * @return
+	 */
+	public static Map<String, String> createEth() {
+		Map<String, String> wallet = new HashMap<String, String>();
+		try {
+			String walletPassword = "secr3t";
+			// 文件路径
+			String walletDirectory = ethWalletPath;
+
+			String walletName = WalletUtils.generateNewWalletFile(walletPassword, new File(walletDirectory));
+			System.out.println("wallet location: " + walletDirectory + "/" + walletName);
+			Credentials credentials = WalletUtils.loadCredentials(walletPassword, walletDirectory + "/" + walletName);
+			String accountAddress = credentials.getAddress();
+			String privateKey = credentials.getEcKeyPair().getPrivateKey().toString(16);
+			// 钱包地址
+			wallet.put("address", accountAddress);
+			// 钱包私钥
+			wallet.put("privateKey", privateKey);
+			// 产生的钱包文件地址
+			wallet.put("walletLocation", walletDirectory + "/" + walletName);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return wallet;
+	}
+
+	public boolean checkTransferResult(String hash) {
+		// 0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816 交易hash
+		Request<?, EthGetTransactionReceipt> ethGetTransactionReceiptRequest = web3j.ethGetTransactionReceipt(hash);
+		EthGetTransactionReceipt send = null;
+		try {
+			send = ethGetTransactionReceiptRequest.send();
+			if(send!=null){
+				TransactionReceipt result = send.getResult();
+				if(result!=null){
+					String status = result.getStatus();
+					System.out.println(status);//0x1
+					if("0x1".equals(status)){
+						return true;
+					}else{
+						return false;
+					}
+				}
+
+			}
+
+		} catch (IOException e) {
+			e.printStackTrace();
+			return false;
+		}
+        return false;
+	}
+
+	public static void main(String[] args) throws IOException {
+		HttpService service = new HttpService(ETH_UTL);
+		Web3j build = Web3j.build(service);
+		//Request<?, EthTransaction> ethTransactionRequest = build.ethGetTransactionByHash("0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816");
+		Request<?, EthGetTransactionReceipt> ethGetTransactionReceiptRequest = build.ethGetTransactionReceipt("0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816");
+		EthGetTransactionReceipt send = ethGetTransactionReceiptRequest.send();
+		String status = send.getResult().getStatus();
+		System.out.println(status);//0x1
+//		EthTransaction send = ethTransactionRequest.send();
+//		String input = send.getResult().getInput();
+//		System.out.println(input);
+	}
+
+	/**
+	 * 
+	 * 方法描述:获取代币余额
+	 * 
+	 * @param fromAddress
+	 * @param
+	 * @param
+	 * @return long
+	 */
+	public BigDecimal tokenGetBalance(String fromAddress) {
+		try {
+			// 合约地址
+			String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";
+			int decimal = 6;
+			String methodName = "balanceOf";
+			List<Type> inputParameters = new ArrayList<>();
+			List<TypeReference<?>> outputParameters = new ArrayList<>();
+			Address address = new Address(fromAddress);
+			inputParameters.add(address);
+			TypeReference<Uint256> typeReference = new TypeReference<Uint256>() {
+			};
+			outputParameters.add(typeReference);
+			Function function = new Function(methodName, inputParameters, outputParameters);
+			String data = FunctionEncoder.encode(function);
+			Transaction transaction = Transaction.createEthCallTransaction(fromAddress, contractAddress, data);
+
+			EthCall ethCall;
+			BigInteger balanceValue = BigInteger.ZERO;
+			try {
+				ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send();
+				List<Type> results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters());
+				balanceValue = (BigInteger) results.get(0).getValue();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			double res = BigDecimalUtil.div(new BigDecimal(balanceValue).doubleValue(), Math.pow(10, decimal), 8);
+			if (res > 0) {
+				return new BigDecimal(res);
+			}
+		} catch (Exception e) {
+			// logger.error("==============以太坊代币链接获取失败!");
+			e.printStackTrace();
+		}
+		return BigDecimal.ZERO;
+	}
+
+	// USDT
+	public String tokenSend(String privateKey, String fromAddress, String toAddress, String amount)
+			throws InterruptedException, ExecutionException {
+		// Web3j web3j = Web3j.build(new
+		// HttpService("https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321"));
+		String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";
+		Credentials credentials = Credentials.create(privateKey);
+
+		EthGetTransactionCount ethGetTransactionCount = web3j
+				.ethGetTransactionCount(fromAddress, DefaultBlockParameterName.LATEST).sendAsync().get();
+
+		BigInteger nonce = ethGetTransactionCount.getTransactionCount();
+
+		Function function = new Function("transfer",
+				Arrays.asList(new Address(toAddress), new Uint256(new BigInteger(amount))),
+				Arrays.asList(new TypeReference<Type>() {
+				}));
+
+		String encodedFunction = FunctionEncoder.encode(function);
+
+		RawTransaction rawTransaction = RawTransaction.createTransaction(nonce,
+				Convert.toWei("40", Convert.Unit.GWEI).toBigInteger(),// 给矿工开的转账单价 单价越高越快
+				Convert.toWei("80000", Convert.Unit.WEI).toBigInteger(), contractAddress, encodedFunction);//里程上限
+		        // 10*80000/1000000000=0.0008 手续费
+
+		byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
+		String hexValue = Numeric.toHexString(signedMessage);
+
+		// log.debug("transfer hexValue:" + hexValue);
+
+		EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get();
+
+
+		if (ethSendTransaction.hasError()) {
+			// log.info("transfer error:", ethSendTransaction.getError().getMessage());
+			return "";
+		} else {
+			String transactionHash = ethSendTransaction.getTransactionHash();
+			// log.info("Transfer transactionHash:" + transactionHash);
+			return transactionHash;
+		}
+	}
+
+	public String ethSend(String privateKey, String fromAddress, String toAddress, String amount)
+			throws InterruptedException, ExecutionException {
+		// Web3j web3j = Web3j.build(new
+		// HttpService("https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321"));
+
+		Credentials credentials = Credentials.create(privateKey);
+
+		EthGetTransactionCount ethGetTransactionCount = web3j
+				.ethGetTransactionCount(fromAddress, DefaultBlockParameterName.LATEST).sendAsync().get();
+
+		BigInteger nonce = ethGetTransactionCount.getTransactionCount();
+		BigInteger value = Convert.toWei(amount, Convert.Unit.ETHER).toBigInteger();
+		RawTransaction rawTransaction = RawTransaction.createEtherTransaction(nonce,
+				Convert.toWei("40", Convert.Unit.GWEI).toBigInteger(),
+				Convert.toWei("60000", Convert.Unit.WEI).toBigInteger(), toAddress, value);
+		byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
+		String hexValue = Numeric.toHexString(signedMessage);
+
+		EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get();
+		if (ethSendTransaction.hasError()) {
+			// log.info("transfer error:", ethSendTransaction.getError().getMessage());
+			return "";
+		} else {
+			String transactionHash = ethSendTransaction.getTransactionHash();
+			// log.info("Transfer transactionHash:" + transactionHash);
+			return transactionHash;
+		}
+	}
+
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/HttpUtil.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/HttpUtil.java
new file mode 100644
index 0000000..a146fe4
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/HttpUtil.java
@@ -0,0 +1,281 @@
+package com.xcong.excoin.modules.blackchain.service;
+
+/**
+ * @author: DengJiong
+ * @date: 2018-05-09 18:43
+ * @description:
+ */
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.net.ssl.*;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * http 工具类
+ *
+ * @author cloud cloud
+ * @create 2017/10/18
+ **/
+public class HttpUtil {
+
+    private static final String CHARSET = "UTF-8";
+    private static final String HTTP_POST = "POST";
+    private static final String HTTP_GET = "GET";
+
+    private static final String HTTP_PUT = "PUT";
+
+    /**
+     * Send GET request
+     */
+    public static String get(String url, Map<String, String> queryParas, Map<String, String> headers) {
+        HttpURLConnection conn = null;
+        try {
+            conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), HTTP_GET, headers);
+            conn.connect();
+            return readResponseString(conn);
+        }
+        catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        finally {
+            if (conn != null) {
+                conn.disconnect();
+            }
+        }
+    }
+
+    public static String get(String url, Map<String, String> queryParas) {
+        return get(url, queryParas, null);
+    }
+
+    public static String get(String url) {
+        return get(url, null, null);
+    }
+
+    public static String jsonGet(String url,Map<String,String> params){
+        Map<String,String> headers = new HashMap<>();
+        headers.put("Content-Type","application/json");
+        return get(url,params,headers);
+    }
+
+
+    /**
+     * Send POST request
+     */
+    public static String post(String url, Map<String, String> queryParas, String data, Map<String, String> headers) {
+        HttpURLConnection conn = null;
+        try {
+            conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), HTTP_POST, headers);
+            conn.connect();
+            OutputStream out = conn.getOutputStream();
+            out.write(data.getBytes(CHARSET));
+            out.flush();
+            out.close();
+            return readResponseString(conn);
+        }
+        catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        finally {
+            if (conn != null) {
+                conn.disconnect();
+            }
+        }
+    }
+
+    public static String post(String url, Map<String, String> queryParas, String data) {
+        return post(url, queryParas, data, null);
+    }
+
+    public static String post(String url, String data, Map<String, String> headers) {
+        return post(url, null, data, headers);
+    }
+
+    public static String post(String url, String data) {
+        return post(url, null, data, null);
+    }
+
+    public static String jsonPost(String url,String data){
+        Map<String,String> headers = new HashMap<>();
+        headers.put("Content-Type","application/json");
+        return post(url,null,data,headers);
+    }
+
+    public static String jsonPost(String url,Map<String,String>headers,String data){
+        if(headers == null){
+            headers = new HashMap<>();
+        }
+        headers.put("Content-Type","application/json");
+        return post(url,null,data,headers);
+    }
+
+    /**
+     * Send POST request
+     */
+    public static String put(String url, Map<String, String> queryParas, String data, Map<String, String> headers) {
+        HttpURLConnection conn = null;
+        try {
+            conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), HTTP_PUT, headers);
+            conn.connect();
+            OutputStream out = conn.getOutputStream();
+            out.write(data.getBytes(CHARSET));
+            out.flush();
+            out.close();
+            return readResponseString(conn);
+        }
+        catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        finally {
+            if (conn != null) {
+                conn.disconnect();
+            }
+        }
+    }
+
+
+
+    public static String jsonPut(String url,String data){
+        Map<String,String> headers = new HashMap<>();
+        headers.put("Content-Type","application/json");
+        return put(url,null,data,headers);
+    }
+
+
+    /**
+     * https 域名校验
+     */
+    private static class TrustAnyHostnameVerifier implements HostnameVerifier {
+        @Override
+        public boolean verify(String hostname, SSLSession session) {
+            return true;
+        }
+    }
+
+    /**
+     * https 证书管理
+     */
+    private static class TrustAnyTrustManager implements X509TrustManager {
+        @Override
+        public X509Certificate[] getAcceptedIssuers() {
+            return null;
+        }
+        @Override
+        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+        }
+        @Override
+        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+        }
+    }
+
+    private static SSLSocketFactory initSSLSocketFactory() {
+        try {
+            TrustManager[] tm = {new TrustAnyTrustManager()};
+            SSLContext sslContext = SSLContext.getInstance("TLS", "SunJSSE");
+            sslContext.init(null, tm, new java.security.SecureRandom());
+            return sslContext.getSocketFactory();
+        }
+        catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static final SSLSocketFactory sslSocketFactory = initSSLSocketFactory();
+    private static final TrustAnyHostnameVerifier trustAnyHostnameVerifier = new TrustAnyHostnameVerifier();
+
+    private static HttpURLConnection getHttpConnection(String url, String method, Map<String, String> headers) throws Exception {
+        URL _url = new URL(url);
+        HttpURLConnection conn = (HttpURLConnection)_url.openConnection();
+        if (conn instanceof HttpsURLConnection) {
+            ((HttpsURLConnection)conn).setSSLSocketFactory(sslSocketFactory);
+            ((HttpsURLConnection)conn).setHostnameVerifier(trustAnyHostnameVerifier);
+        }
+        conn.setRequestMethod(method);
+        conn.setDoOutput(true);
+        conn.setDoInput(true);
+        conn.setConnectTimeout(30000);
+        conn.setReadTimeout(30000);
+        conn.setUseCaches(false); // Post 请求不能使用缓存
+        if(headers != null){
+            String contentType = headers.get("Content-Type");
+            if(StringUtils.isNotEmpty(contentType)){
+                conn.setRequestProperty("Content-Type",contentType);
+            }else{
+                conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=utf-8");
+            }
+        }
+        conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");
+        if (headers != null && !headers.isEmpty())
+            for (Map.Entry<String, String> entry : headers.entrySet())
+                conn.setRequestProperty(entry.getKey(), entry.getValue());
+
+        return conn;
+    }
+
+    private static String readResponseString(HttpURLConnection conn) {
+        StringBuilder sb = new StringBuilder();
+        InputStream inputStream = null;
+        try {
+            inputStream = conn.getInputStream();
+            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, CHARSET));
+            String line = null;
+            while ((line = reader.readLine()) != null){
+                sb.append(line).append("\n");
+            }
+            return sb.toString();
+        }
+        catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * Build queryString of the url
+     */
+    private static String buildUrlWithQueryString(String url, Map<String, String> queryParas) {
+        if (queryParas == null || queryParas.isEmpty())
+            return url;
+
+        StringBuilder sb = new StringBuilder(url);
+        boolean isFirst;
+        if (url.indexOf("?") == -1) {
+            isFirst = true;
+            sb.append("?");
+        }
+        else {
+            isFirst = false;
+        }
+
+        for (Map.Entry<String, String> entry : queryParas.entrySet()) {
+            if (isFirst) isFirst = false;
+            else sb.append("&");
+
+            String key = entry.getKey();
+            String value = entry.getValue();
+            if (!StringUtils.isEmpty(value)){
+                try {value = URLEncoder.encode(value, CHARSET);} catch (UnsupportedEncodingException e) {throw new RuntimeException(e);}
+                sb.append(key).append("=").append(value);
+            }
+        }
+        return sb.toString();
+    }
+}
+
+
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java
new file mode 100644
index 0000000..7f62bdb
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java
@@ -0,0 +1,219 @@
+package com.xcong.excoin.modules.blackchain.service.Impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.xcong.excoin.common.LoginUserUtils;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.modules.blackchain.service.BlockSerive;
+import com.xcong.excoin.modules.blackchain.service.BtcService;
+import com.xcong.excoin.modules.blackchain.service.EthService;
+import com.xcong.excoin.modules.blackchain.service.LtcService;
+import com.xcong.excoin.modules.blackchain.service.UsdtService;
+import com.xcong.excoin.modules.blackchain.service.XrpService;
+import com.xcong.excoin.modules.member.dao.MemberCoinAddressDao;
+import com.xcong.excoin.modules.member.dao.MemberDao;
+import com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.utils.MessageSourceUtils;
+import com.xcong.excoin.utils.RedisUtils;
+
+@Service
+public class BlockSeriveImpl implements BlockSerive {
+
+	@Resource
+	RedisUtils  redisUtil;
+	@Resource
+	MemberDao memberDao;
+	@Resource
+	MemberCoinAddressDao memberMapper;
+	
+	@Override
+	public Result findBlockAddress(String symbol) {
+		
+		//获取用户ID
+		String mId = LoginUserUtils.getAppLoginUser().getId().toString();
+		MemberEntity member = memberDao.selectById(mId);
+		if(member==null) {
+			return Result.fail(MessageSourceUtils.getString("member_service_0003"));
+		}
+		String lable = member.getInviteId();
+		Result result = new Result();
+		try {
+		Map<String, String> map = new HashMap<String, String>();
+		MemberCoinAddressEntity memberCoinAddress = new MemberCoinAddressEntity();
+		
+		if("USDT".equals(symbol)) {
+			memberCoinAddress = memberMapper.selectBlockAddressWithTag(Long.parseLong(mId), symbol,member.getInviteId());
+		}else {
+			memberCoinAddress = memberMapper.selectBlockAddress(Long.parseLong(mId), symbol);
+		}
+		////System.out.println("symbol  ========== "+symbol);
+		if(memberCoinAddress!=null) {
+			////System.out.println("1===================================");
+			map.put("address", memberCoinAddress.getAddress());
+			map.put("lable", memberCoinAddress.getLabel());
+			result.setData(map);
+			result.setCode(0);
+		}else {
+			////System.out.println("2===================================");
+			String address = "";
+			String key = "";
+			String uuid = member.getInviteId();
+			switch (symbol) {
+			case "BTC":
+				Map<String,String> btcMap = UsdtService.createWallet(mId);
+				address = btcMap.get("address");
+				key = btcMap.get("privateKey");
+				map.put("address", address);
+				break;
+			case "ETH":
+				Map<String,String> ethMap = EthService.createEth();
+				address = ethMap.get("address");
+				key = ethMap.get("privateKey");
+				map.put("address", address);
+				break;
+			case "BCH":
+				MemberCoinAddressEntity btcAddress = memberMapper.selectBlockAddress(Long.parseLong(mId), "BTC");
+				if(btcAddress!=null) {
+					address = btcAddress.getAddress();
+					key = btcAddress.getPrivateKey();
+					map.put("address", address);
+				}else {
+					Map<String,String> bchMap = BtcService.createWallet(mId);
+					address = bchMap.get("address");
+					key = bchMap.get("privateKey");
+					map.put("address", address);
+					
+					MemberCoinAddressEntity coinAddress = new MemberCoinAddressEntity();
+					coinAddress.setAddress(address);
+					coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES);
+					coinAddress.setMemberId(Long.parseLong(mId));
+					coinAddress.setPrivateKey(key);
+					coinAddress.setSymbol("BTC");
+					coinAddress.setLabel(uuid);
+					memberMapper.insert(coinAddress);
+				}
+				break;
+			case "EOS":
+				address = "biyicteos123";
+//				lable = member.getUID();
+//				Map<String,String> eosMap = new HashMap<String, String>();
+				map.put("address", address);
+				map.put("lable",uuid);
+				break;
+			case "XRP":
+				JSONObject jSONObject = XrpService.createWallet();
+				address = (String)jSONObject.get("xAddress");
+				key = (String)jSONObject.get("secret");
+//				lable = member.getUID();
+				map.put("address", address);
+				map.put("lable", uuid);
+				break;
+			case "LTC":
+				Map<String,String> ltcMap = LtcService.createWallet(mId);
+				address = ltcMap.get("address");
+				key = ltcMap.get("privateKey");
+				map.put("address", address);
+				break;
+			case "ETC":
+				MemberCoinAddressEntity ethAddress = memberMapper.selectBlockAddress(Long.parseLong(mId), "ETH");
+				if(ethAddress!=null) {
+					address = ethAddress.getAddress();
+					key = ethAddress.getPrivateKey();
+					map.put("address", address);
+				}else {
+					Map<String,String> etcMap = EthService.createEth();
+					address = etcMap.get("address");
+					key = etcMap.get("privateKey");
+					map.put("address", address);
+					
+					MemberCoinAddressEntity coinAddress = new MemberCoinAddressEntity();
+					coinAddress.setAddress(address);
+					coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES);
+					coinAddress.setMemberId(Long.parseLong(mId));
+					coinAddress.setPrivateKey(key);
+					coinAddress.setSymbol("ETH");
+					coinAddress.setLabel(uuid);
+					memberMapper.insert(coinAddress);
+				}
+				
+				break;
+			case "USDT":
+				if("OMNI".equals(lable)) {
+					MemberCoinAddressEntity btcAddress2 = memberMapper.selectBlockAddress(Long.parseLong(mId), "BTC");
+					if(btcAddress2!=null) {
+						address = btcAddress2.getAddress();
+						key = btcAddress2.getPrivateKey();
+						map.put("address", address);
+					}else {
+						//如果BTC地址不存在,创建一个BTC地址
+						Map<String,String> usdtMap = UsdtService.createWallet(mId);
+						address = usdtMap.get("address");
+						key = usdtMap.get("privateKey");
+						map.put("address", address);
+						
+						MemberCoinAddressEntity coinAddress = new MemberCoinAddressEntity();
+						coinAddress.setAddress(address);
+						coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES);
+						coinAddress.setMemberId(Long.parseLong(mId));
+						coinAddress.setPrivateKey(key);
+						coinAddress.setSymbol("BTC");
+						coinAddress.setLabel(uuid);
+						memberMapper.insert(coinAddress);
+					}
+					
+				}else {
+					MemberCoinAddressEntity ethAddress2 = memberMapper.selectBlockAddress(Long.parseLong(mId), "ETH");
+					if(ethAddress2!=null) {
+						address = ethAddress2.getAddress();
+						key = ethAddress2.getPrivateKey();
+						map.put("address", address);
+					}else {
+						Map<String,String> usdtMap = EthService.createEth();
+						address = usdtMap.get("address");
+						key = usdtMap.get("privateKey");
+						map.put("address", address);
+						
+						MemberCoinAddressEntity coinAddress = new MemberCoinAddressEntity();
+						coinAddress.setAddress(address);
+						coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES);
+						coinAddress.setMemberId(Long.parseLong(mId));
+						coinAddress.setPrivateKey(key);
+						coinAddress.setSymbol("ETH");
+						coinAddress.setLabel(uuid);
+						memberMapper.insert(coinAddress);
+					}
+				}
+				break;
+			default:
+				break;
+			}
+			MemberCoinAddressEntity coinAddress = new MemberCoinAddressEntity();
+			coinAddress.setAddress(address);
+			coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES);
+			coinAddress.setMemberId(Long.parseLong(mId));
+			coinAddress.setPrivateKey(key);
+			coinAddress.setSymbol(symbol);
+			coinAddress.setLabel(uuid);
+			if(symbol.equals("USDT")) {
+				coinAddress.setTag(lable);
+			}
+			
+			memberMapper.insert(coinAddress);
+			////System.out.println("生成的地址:"+address+"  密钥:"+key);
+			result.setData(map);
+			result.setCode(0);
+		}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/LtcService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/LtcService.java
new file mode 100644
index 0000000..9acd8a1
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/LtcService.java
@@ -0,0 +1,125 @@
+package com.xcong.excoin.modules.blackchain.service;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+
+
+public class LtcService {
+
+	private static LtcService service = null;
+	private final static String RESULT = "result";
+	private final static String METHOD_SEND_TO_ADDRESS = "sendtoaddress";
+	private final static String METHOD_GET_TRANSACTION = "gettransaction";
+	private final static String METHOD_LIST_TRANSACTIONS = "listtransactions";
+	private final static String METHOD_GET_BLOCK_COUNT = "getblockcount";
+	private final static String METHOD_NEW_ADDRESS = "getnewaddress";
+	private final static String METHOD_GET_BALANCE = "getbalance";
+	private final static String METHOD_WALLET_PASSPHRASE = "walletpassphrase";
+	private final static String METHOD_WALLET_LOCK = "walletlock";
+	private final static String METHOD_GET_BALANCE_ADDRESS = "getreceivedbyaddress";
+
+	private String url = "http://121.40.86.163:1888";
+	private String username = "biyiltc";
+	private String password = "biyiltc";
+
+	public static LtcService getInstance() {
+		if (service != null) {
+			return service;
+		}
+		return new LtcService();
+	}
+
+	private LtcService() {
+	}
+
+	/**
+	 * 创建BTC钱包 每个账户对应一个地址 方便后续操作
+	 * @param mId 账户
+	 * @return
+	 */
+	public static Map<String, String> createWallet(String mId) {
+		LtcService btcService = getInstance();
+		// 创建钱包地址
+		String address = btcService.getAddress(mId);
+		// 私钥
+		String privateKey = btcService.dumpprivkey(address);
+		Map<String, String> result = new HashMap<String,String>();
+		result.put("address", address);
+		result.put("privateKey", privateKey);
+		return result;
+	}
+	public String getAddress(String label) {
+		try {
+			 JSONObject json = doRequest(METHOD_NEW_ADDRESS,label);
+			//JSONObject json = doRequest(METHOD_NEW_ADDRESS);
+			if (isError(json)) {
+				return "";
+			}
+			return json.getString(RESULT);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	private JSONObject doRequest(String method, Object... params) {
+		JSONObject param = new JSONObject();
+		param.put("id", System.currentTimeMillis() + "");
+		param.put("jsonrpc", "2.0");
+		param.put("method", method);
+		if (params != null) {
+			param.put("params", params);
+		}
+		String creb = Base64.encodeBase64String((username + ":" + password).getBytes());
+		Map<String, String> headers = new HashMap<>(2);
+		headers.put("Authorization", "Basic " + creb);
+		return JSON.parseObject(HttpUtil.jsonPost(url, headers, param.toJSONString()));
+	}
+
+	private boolean isError(JSONObject json) {
+		if (json == null || (StringUtils.isNotEmpty(json.getString("error")) && json.get("error") != "null")) {
+			return true;
+		}
+		return false;
+	}
+	
+	public String dumpprivkey(String address) {
+		try {
+			JSONObject obj = doRequest("dumpprivkey", address);
+			//System.out.println(obj);
+			if (!isError(obj)) {
+				return obj.getString(RESULT);
+			} else {
+				return null;
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	/**
+	 * 查询给定地址的总收款额(只计算接受的)
+	 * @param address
+	 * @return
+	 */
+	public BigDecimal getBalance(String address) {
+		JSONObject json = doRequest(METHOD_GET_BALANCE_ADDRESS,address,3);
+		if (!isError(json)) {
+			return new BigDecimal(json.getString(RESULT));
+		} else {
+			return null;
+		}
+	}
+
+	public static void main(String[] args) {
+		BigDecimal s = LtcService.getInstance().getBalance("MS6UBteTkQYbbBg5xEPWUQ1PPG7zkxY368");
+	   System.out.println(s);
+	}
+}
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtService.java
new file mode 100644
index 0000000..bfb5074
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtService.java
@@ -0,0 +1,167 @@
+package com.xcong.excoin.modules.blackchain.service;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+
+public class UsdtService {
+//	public static void main(String[] args) throws IOException {
+//		ECKey key = new ECKey();
+//		//logger.info("We created a new key:\n" + key);
+//		// TEST 网络
+//		NetworkParameters params = MainNetParams.get();
+//		Address addressFromKey = key.toAddress(params);
+//		System.out.println("Public Address generated: " + addressFromKey);
+//		//logger.info("Public Address generated: " + addressFromKey);
+//		String privateKey = key.getPrivateKeyEncoded(params).toString();
+//		System.out.println("Private key is: " + privateKey);
+//		//logger.info("Private key is: " + privateKey);
+//		//logger.info("Private Hex key is: " + key.getPrivateKeyAsHex());
+//		Wallet wallet = new Wallet(TestNet3Params.get());
+//		File walletFile = new File("D//:test.wallet");
+//		wallet.importKey(key);
+//		wallet.saveToFile(walletFile);
+//	}
+
+    private static UsdtService service = null;
+    private final static String RESULT = "result";
+    private final static String METHOD_SEND_TO_ADDRESS = "sendtoaddress";
+    private final static String METHOD_GET_TRANSACTION = "gettransaction";
+    private final static String METHOD_LIST_TRANSACTIONS = "listtransactions";
+    private final static String METHOD_GET_BLOCK_COUNT = "getblockcount";
+    private final static String METHOD_NEW_ADDRESS = "getnewaddress";
+    private final static String METHOD_GET_BALANCE = "getbalance";
+    private final static String METHOD_GET_BALANCE_ADDRESS = "getreceivedbyaddress";
+    private final static String METHOD_WALLET_PASSPHRASE = "walletpassphrase";
+    private final static String METHOD_WALLET_LOCK = "walletlock";
+
+    private String url = "http://120.55.86.146:1880";
+    private String username = "biyi";
+    private String password = "biyi1234";
+
+    public static UsdtService getInstance() {
+        if (service != null) {
+            return service;
+        }
+        return new UsdtService();
+    }
+
+    private UsdtService() {
+    }
+
+    /**
+     * 创建BTC钱包 每个账户对应一个地址 方便后续操作
+     *
+     * @param mId 账户
+     * @return
+     */
+    public static Map<String, String> createWallet(String mId) {
+        UsdtService btcService = getInstance();
+        // 创建钱包地址
+        String address = btcService.getAddress(mId);
+        // 私钥
+        String privateKey = btcService.dumpprivkey(address);
+        Map<String, String> result = new HashMap<String, String>();
+        result.put("address", address);
+        result.put("privateKey", privateKey);
+        return result;
+    }
+
+    public String getAddress(String label) {
+        try {
+            JSONObject json = doRequest(METHOD_NEW_ADDRESS, label);
+            if (isError(json)) {
+                return "";
+            }
+            return json.getString(RESULT);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    private JSONObject doRequest(String method, Object... params) {
+        JSONObject param = new JSONObject();
+        param.put("id", System.currentTimeMillis() + "");
+        param.put("jsonrpc", "2.0");
+        param.put("method", method);
+        if (params != null) {
+            param.put("params", params);
+        }
+        String creb = Base64.encodeBase64String((username + ":" + password).getBytes());
+        Map<String, String> headers = new HashMap<>(2);
+        headers.put("Authorization", "Basic " + creb);
+        return JSON.parseObject(HttpUtil.jsonPost(url, headers, param.toJSONString()));
+    }
+
+    private boolean isError(JSONObject json) {
+        if (json == null || (StringUtils.isNotEmpty(json.getString("error")) && json.get("error") != "null")) {
+            return true;
+        }
+        return false;
+    }
+
+    public String dumpprivkey(String address) {
+        try {
+            JSONObject obj = doRequest("dumpprivkey", address);
+            System.out.println(obj);
+            if (!isError(obj)) {
+                return obj.getString(RESULT);
+            } else {
+                return null;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 查询给定地址的总收款额(只计算接受的)
+     *
+     * @param address
+     * @return
+     */
+    public BigDecimal getBalance(String address) {
+        try {
+            JSONObject json = doRequest("omni_getbalance", address, 31);
+            if (!isError(json)) {
+                return new BigDecimal(json.getJSONObject(RESULT).get("balance").toString());
+            } else {
+                return null;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.out.println("BTC-USDT查询余额失败");
+            return null;
+        }
+
+    }
+
+    public String METHOD_GET_BLOCK_COUNT() {
+        JSONObject json = doRequest(METHOD_GET_BLOCK_COUNT);
+        if (!isError(json)) {
+            return json.getString(RESULT);
+        } else {
+            return null;
+        }
+    }
+
+
+
+
+
+    public static void main(String[] args) {
+
+        System.out.println(UsdtService.getInstance().getBalance("1PLCr8A2z7YLEtoPLJdzzqpfb3Ym87UCtt"));
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/XrpService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/XrpService.java
new file mode 100644
index 0000000..397ce7d
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/XrpService.java
@@ -0,0 +1,487 @@
+package com.xcong.excoin.modules.blackchain.service;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.text.MessageFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.ripple.core.coretypes.AccountID;
+import com.ripple.core.coretypes.Amount;
+import com.ripple.core.coretypes.uint.UInt32;
+import com.ripple.core.types.known.tx.signed.SignedTransaction;
+import com.ripple.core.types.known.tx.txns.Payment;
+import com.xcong.excoin.modules.blackchain.model.XrpTransResult;
+
+public class XrpService {
+
+	// private //logger //logger = //logger.get//logger(getClass());
+	/**
+	 * 官方接口地址
+	 */
+	private static String getUrl = "https://data.ripple.com";
+	private String postUrl = "https://s1.ripple.com:51234";
+
+	/**
+	 * 本地nodejs创建钱包地址
+	 */
+	private static String localUrl = "http://121.40.86.163:1886";
+	private String address;
+	private String password;
+
+	private static final String gasFee = "100";
+	private static final String COIN_XRP = "XRP";
+
+	private final static String RESULT = "result";
+	private final static String SUCCESS = "success";
+	private final static String TES_SUCCESS = "tesSUCCESS";
+
+	private final static String METHOD_GET_TRANSACTION = "/v2/accounts/{0}/transactions";
+	private final static String METHOD_GET_BALANCE = "/v2/accounts/{0}/balances";
+	private final static String METHOD_POST_SIGN = "sign";
+	private final static String METHOD_POST_INDEX = "ledger_current";
+	private final static String METHOD_POST_ACCOUNT_INFO = "account_info";
+	private final static String METHOD_POST_SUBMIT = "submit";
+
+	public XrpService(String address, String password) {
+		try {
+			this.address = address;
+			this.password = password;
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	public String getAddress() {
+		return address;
+	}
+
+	public static void main(String[] args) {
+		// 十分钟查一次 每次100条
+        String result =  HttpUtil.get("https://data.ripple.com/v2/accounts/rBEXvZL66VvaMzX5R2W5g5xC9Z3D81wkzb/transactions?start=2019-09-01T10:10:00Z");
+	     JSONObject json = JSONObject.parseObject(result);
+	     XrpTransResult res = json.toJavaObject(XrpTransResult.class);
+	}
+
+	/**
+	 * 创建钱包 { "xAddress":"X7bpbHDKxS3Mr417RPtgS3TFFHwAHqULXJUVZntHWAKnccw",
+	 * "secret":"snYpXT4wrhi8ve2miSUHUdn9wgzz7",
+	 * "classicAddress":"rsJftGoh49zju51k2LdvUYrzLzJ44XJpXh",
+	 * "address":"rsJftGoh49zju51k2LdvUYrzLzJ44XJpXh" }
+	 * 
+	 * @return
+	 */
+	public static JSONObject createWallet() {
+		String res = HttpUtil.get(localUrl);
+		JSONObject obj = JSONObject.parseObject(res);
+		return obj;
+	}
+
+	/**
+	 * 查询交易记录 用于更新用户的余额 本系统的地址:X75MxY8sjcebBasymUXDYcYHWj6v8wqWLGmg9N3x65SXUJw
+	 * https://data.ripple.com/v2/accounts/rBEXvZL66VvaMzX5R2W5g5xC9Z3D81wkzb/transactions
+	 * https://data.ripple.com/v2/accounts/rBEXvZL66VvaMzX5R2W5g5xC9Z3D81wkzb/transactions?start=2019-09-01T10:10:00Z&limit=1
+	 */
+
+	/**
+	 * start YYYY-MM-DDThh:mm:ssZ String - Timestamp Start time of query range. The default is the
+	 * earliest date available. 
+	 * end String - Timestamp End time of query range. The
+	 * default is the current date. 
+	 * min_sequence String Minimum sequence number to
+	 * query. 
+	 * max_sequence String Max sequence number to query. 
+	 * type String Restrict results to a specified transaction type. 
+	 * result String Restrict results to a specified transaction result. 
+	 * binary Boolean Return results in binary format.
+	 * descending Boolean If true, return results in reverse chronological order.The default is false. 
+	 * limit Integer Maximum results per page. The default is 20. Cannot be more than 1,000.
+	 *  marker String Pagination key from previously
+	 * returned response.
+	 * 
+	 * https://github.com/ripple/rippled-historical-database
+	 */
+	public static XrpTransResult getTransactions(Date start) {
+        // SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-DDThh:mm:ssZ");
+ 		SimpleDateFormat formatDay = new SimpleDateFormat("YYYY-MM-dd");
+ 		SimpleDateFormat formatHour = new SimpleDateFormat("hh:mm:ss");
+         String startTime = formatDay.format(start)+"T"+formatHour.format(start)+"Z";
+         String url ="https://data.ripple.com/v2/accounts/X75MxY8sjcebBasymUXDYcYHWj6v8wqWLGmg9N3x65SXUJw/transactions?start="+startTime+"&limit=1000"; 
+         // 十分钟查一次 每次100条
+         String result =  HttpUtil.get(url);
+	     try {
+	    	 JSONObject json = JSONObject.parseObject(result);
+		     XrpTransResult res = json.toJavaObject(XrpTransResult.class); 
+		     return res;
+	     }catch(Exception e) {
+	    	 e.printStackTrace();
+	     }
+	    return null;
+	}
+
+	/**
+	 * XRP查询余额
+	 * 
+	 * @return
+	 */
+	public static double getBalance(String address) {
+		try {
+			HashMap<String, String> params = new HashMap<String, String>();
+			params.put("currency", COIN_XRP);
+			String re = HttpUtil.jsonGet(getUrl + MessageFormat.format(METHOD_GET_BALANCE, address), params);
+			if (!StringUtils.isEmpty(re)) {
+				JSONObject json = JSON.parseObject(re);
+				if (SUCCESS.equals(json.getString(RESULT))) {
+					JSONArray array = json.getJSONArray("balances");
+					if (array != null && array.size() > 0) {
+						// 总余额
+						double balance = array.getJSONObject(0).getDoubleValue("value");
+						if (balance >= 20) {
+							// 可用余额 xrp会冻结20个币
+							return BigDecimalUtil.sub(balance, 20);
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			// logger.error("==============虚拟币-瑞波币getBalance失败!");
+			e.printStackTrace();
+		}
+		return 0.00;
+	}
+
+	/**
+	 * 发送交易
+	 * 
+	 * @param address
+	 * @param value
+	 * @return
+	 */
+	public synchronized String send(String toAddress, double value, String tag) {
+		try {
+			String txBlob = this.sign(toAddress, value, tag);
+			if (StringUtils.isEmpty(txBlob)) {
+				// logger.error("签名失败:{" + toAddress + "}");
+				return null;
+			}
+			HashMap<String, Object> params = new HashMap<String, Object>();
+			params.put("tx_blob", txBlob);
+			// 签名
+			JSONObject json = doRequest(METHOD_POST_SUBMIT, params);
+			if (!isError(json)) {
+				// logger.error("============瑞波币XRP转账返回!json="+json);
+				JSONObject result = json.getJSONObject(RESULT);
+				if (result != null) {
+					if (TES_SUCCESS.equals(result.getString("engine_result"))) {
+						String hash = result.getJSONObject("tx_json").getString("hash");
+						if (!StringUtils.isEmpty(hash)) {
+							// logger.error("转账成功:toAddress:{" + toAddress + "},value:{" + value +
+							// "},hash:{" + hash + "}");
+							return hash;
+						} else {
+							// logger.error(
+							// "转账失败:toAddress:{" + toAddress + "},value:{" + value + "},hash:{" + hash +
+							// "}");
+						}
+					}
+				}
+			} else {
+				// logger.error("============瑞波币XRP转账失败!json="+json);
+			}
+		} catch (Exception e) {
+			// logger.error("==============虚拟币-瑞波币send失败!");
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	public synchronized String sendOnLine(String toAddress, double value, String tag) {
+		try {
+			String txBlob = this.signOnLine(toAddress, value, tag);
+			if (StringUtils.isEmpty(txBlob)) {
+				// logger.error("签名失败:{" + toAddress + "}");
+				return null;
+			}
+			HashMap<String, Object> params = new HashMap<String, Object>();
+			params.put("tx_blob", txBlob);
+			// 签名
+			JSONObject json = doRequest(METHOD_POST_SUBMIT, params);
+			if (!isError(json)) {
+				// logger.error("============瑞波币XRP转账返回!json="+json);
+				JSONObject result = json.getJSONObject(RESULT);
+				if (result != null) {
+					if (TES_SUCCESS.equals(result.getString("engine_result"))) {
+						String hash = result.getJSONObject("tx_json").getString("hash");
+						if (!StringUtils.isEmpty(hash)) {
+							// logger.error("转账成功:toAddress:{" + toAddress + "},value:{" + value +
+							// "},hash:{" + hash + "}");
+							return hash;
+						} else {
+							// logger.error(
+							// "转账失败:toAddress:{" + toAddress + "},value:{" + value + "},hash:{" + hash +
+							// "}");
+						}
+					}
+				}
+			} else {
+				// logger.error("==============瑞波币XRP转账失败!json="+json);
+			}
+		} catch (Exception e) {
+			// logger.error("==============虚拟币-瑞波币send失败!");
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	@Deprecated
+	public String signOnLine(String toAddress, Double value, String tag) {
+		try {
+			// 瑞波币余额存储加六位长度
+			value = BigDecimalUtil.mul(value, 1000000);
+			Integer vInteger = BigDecimal.valueOf(value).intValue();
+			JSONObject txJson = new JSONObject();
+			txJson.put("Account", address);
+			txJson.put("Amount", vInteger.toString());
+			txJson.put("Destination", toAddress);// 标签
+			txJson.put("TransactionType", "Payment");
+			txJson.put("DestinationTag", tag);
+			HashMap<String, Object> params = new HashMap<String, Object>();
+			params.put("secret", password);
+			params.put("tx_json", txJson);
+			params.put("offline", false);
+			// 签名
+			JSONObject json = doRequest(METHOD_POST_SIGN, params);
+			if (!isError(json)) {
+				// logger.error("==============XRP签名返回:"+json);
+				JSONObject result = json.getJSONObject(RESULT);
+				if (result != null) {
+					if (SUCCESS.equals(result.getString("status"))) {
+						return result.getString("tx_blob");
+					}
+				}
+			} else {
+				// logger.error("瑞波币XRP签名失败!json="+json);
+			}
+		} catch (Exception e) {
+			// logger.error("==============虚拟币-瑞波币signOnLine失败!");
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/**
+	 * 签名
+	 * 
+	 * @param address
+	 * @param value
+	 * @return tx_blob
+	 */
+	public String sign(String toAddress, Double value, String tag) {
+		try {
+			value = BigDecimalUtil.mul(value, 1000000);
+			Integer vInteger = BigDecimal.valueOf(value).intValue();
+			Map<String, String> map = getAccountSequenceAndLedgerCurrentIndex();
+			Payment payment = new Payment();
+			payment.as(AccountID.Account, address);
+			payment.as(AccountID.Destination, toAddress);
+			payment.as(UInt32.DestinationTag, tag);
+			payment.as(Amount.Amount, vInteger.toString());
+			payment.as(UInt32.Sequence, map.get("accountSequence"));
+			payment.as(UInt32.LastLedgerSequence, map.get("ledgerCurrentIndex") + 4);
+			payment.as(Amount.Fee, gasFee);
+			SignedTransaction signed = payment.sign(password);
+			if (signed != null) {
+				return signed.tx_blob;
+			}
+		} catch (Exception e) {
+			// logger.error("==============虚拟币-瑞波币sign失败!");
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	public Map<String, String> getAccountSequenceAndLedgerCurrentIndex() {
+		try {
+			HashMap<String, String> params = new HashMap<String, String>();
+			params.put("account", address);
+			params.put("strict", "true");
+			params.put("ledger_index", "current");
+			params.put("queue", "true");
+			JSONObject re = doRequest(METHOD_POST_ACCOUNT_INFO, params);
+			if (re != null) {
+				JSONObject result = re.getJSONObject("result");
+				if (SUCCESS.equals(result.getString("status"))) {
+					Map<String, String> map = new HashMap<String, String>();
+					map.put("accountSequence", result.getJSONObject("account_data").getString("Sequence"));
+					map.put("ledgerCurrentIndex", result.getString("ledger_current_index"));
+					return map;
+				}
+			}
+		} catch (Exception e) {
+			// logger.error("==============虚拟币-瑞波币getAccountSequenceAndLedgerCurrentIndex失败!");
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/**
+	 * 获取用户交易序列号
+	 * 
+	 * @return
+	 */
+	public long getAccountSequence() {
+		try {
+			HashMap<String, String> params = new HashMap<String, String>();
+			params.put("account", address);
+			params.put("strict", "true");
+			params.put("ledger_index", "current");
+			params.put("queue", "true");
+			JSONObject re = doRequest(METHOD_POST_ACCOUNT_INFO, params);
+			if (re != null) {
+				JSONObject result = re.getJSONObject("result");
+				if (SUCCESS.equals(result.getString("status"))) {
+					return result.getJSONObject("account_data").getLongValue("Sequence");
+				}
+			}
+		} catch (Exception e) {
+			// logger.error("==============虚拟币-瑞波币getAccountSequence失败!");
+			e.printStackTrace();
+		}
+		return 0L;
+	}
+
+	/**
+	 * 获取最新序列
+	 * 
+	 * @return
+	 */
+	public long getLedgerIndex() {
+		try {
+			JSONObject re = doRequest(METHOD_POST_INDEX);
+			if (re != null) {
+				JSONObject result = re.getJSONObject("result");
+				if (SUCCESS.equals(result.getString("status"))) {
+					return result.getLongValue("ledger_current_index");
+				}
+			}
+		} catch (Exception e) {
+			// logger.error("==============虚拟币-瑞波币getLedgerIndex失败!");
+			e.printStackTrace();
+		}
+		return 0L;
+	}
+
+	public String getTransaction(Date dateGMT, String limit) throws ParseException {
+		try {
+			HashMap<String, String> params = new HashMap<String, String>();
+			params.put("start", DateUtil.formatDate(dateGMT, "yyyy-MM-dd'T'HH:mm:ss"));
+			params.put("result", "tesSUCCESS");
+			params.put("type", "Payment");
+			params.put("limit", limit);
+			return HttpUtil.jsonGet(getUrl + MessageFormat.format(METHOD_GET_TRANSACTION, address), params);
+			// {"result":"success","count":1,"transactions":[{"hash":"86859CBEFB870C941727E291BB13312BC3D6042D8DA08BF1DEDE6BB55F21B8EC","ledger_index":42268358,"date":"2018-10-16T06:49:30+00:00","tx":{"TransactionType":"Payment","Flags":2147483648,"Sequence":37996,"Amount":"29840000","Fee":"1000","SigningPubKey":"0279154FA62D1F28B6CB1F0264663F19EF3A1718D15363CAC1B47A9C6987231F94","TxnSignature":"304502210089F6526134F335C01C65D3E82284C06E22598A4EAD912604BF4FEAA42D5ACCE402203C044F32D399CEA6F4A16DD6DCBB339A7D0CF76E52C1AB090330A67EDFBABBE4","Account":"rH8yTBLm2SYgcL5HQGDznuNxMiy5ayYcmK","Destination":"raHb1tR1BcNB92nEqxiTuKsDap46szkJG2"},"meta":{"TransactionIndex":1,"AffectedNodes":[{"CreatedNode":{"LedgerEntryType":"AccountRoot","LedgerIndex":"56419B3209DA988033F6F0BD921806B4821A73EDF8C338FB5F06C785E527E967","NewFields":{"Sequence":1,"Balance":"29840000","Account":"raHb1tR1BcNB92nEqxiTuKsDap46szkJG2"}}},{"ModifiedNode":{"LedgerEntryType":"AccountRoot","PreviousTxnLgrSeq":42268355,"PreviousTxnID":"63D5A3121F2706099835D9A3A9E5DA574070A4E08FC70956DB1CC196DE6CDEFC","LedgerIndex":"7D2FC14FA2B344F41BB8A6E10B319301EA1C11705AE159B3E2FA82D9F3079E4C","PreviousFields":{"Sequence":37996,"Balance":"2051629511468"},"FinalFields":{"Flags":131072,"Sequence":37997,"OwnerCount":0,"Balance":"2051599670468","Account":"rH8yTBLm2SYgcL5HQGDznuNxMiy5ayYcmK"}}}],"TransactionResult":"tesSUCCESS","delivered_amount":"29840000"}}]}
+		} catch (Exception e) {
+			// logger.error("==============虚拟币-瑞波币getBalance失败!");
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	public Long parseTransaction(String startTm) throws ParseException {
+		try {
+			HashMap<String, String> params = new HashMap<String, String>();
+			if (!StringUtils.isEmpty(startTm)) {
+				Date d = new Date(BigDecimalUtil.longAdd(Long.parseLong(startTm), 1000L));
+				params.put("start", DateUtil.formatDate(d, "yyyy-MM-dd'T'HH:mm:ss"));
+			}
+			params.put("result", "tesSUCCESS");
+			params.put("type", "Payment");
+			params.put("limit", "1");
+			String re = HttpUtil.jsonGet(getUrl + MessageFormat.format(METHOD_GET_TRANSACTION, address), params);
+			if (!StringUtils.isEmpty(re)) {
+				JSONObject json = JSON.parseObject(re);
+				if (SUCCESS.equals(json.getString(RESULT))) {
+					// marker = json.getString("marker");
+					JSONArray transactions = json.getJSONArray("transactions");
+					if (transactions != null && transactions.size() > 0) {
+						for (Object object : transactions) {
+							JSONObject transaction = (JSONObject) object;
+							String hash = transaction.getString("hash");
+							String dateString = transaction.getString("date");
+							Date date = DateUtil.parseDate(dateString, "yyyy-MM-dd'T'HH:mm:ss");
+							JSONObject tx = transaction.getJSONObject("tx");
+							String destinationTag = tx.getString("DestinationTag");
+							if (StringUtils.isEmpty(destinationTag)) {
+								// logger.info("非用户充值记录");
+								return date.getTime();
+							}
+							String to = tx.getString("Destination");
+							if (!address.equals(to)) {
+								// logger.info("非用户充值记录,地址不一致");
+								return date.getTime();
+							}
+							// 校验用户是否存在
+							/*
+							 * UserEntity user = userService.getUserById(Integer.parseInt( destinationTag));
+							 * if (user == null) { //logger.info("用户不存在:{}",destinationTag); return
+							 * date.getTime(); }
+							 */
+							double amount = tx.getDoubleValue("Amount");
+							if (amount > 0) {
+								amount = BigDecimalUtil.div(amount, 1000000, 6);
+							} else {
+								// logger.error("交易金额异常:{" + amount + "}");
+								return date.getTime();
+							}
+							// 添加充值记录
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			// logger.error("==============虚拟币-瑞波币parseTransaction失败!");
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	private boolean isError(JSONObject json) {
+		if (json == null || (!StringUtils.isEmpty(json.getString("error")) && json.get("error") != "null")) {
+			return true;
+		}
+		return false;
+	}
+
+	private JSONObject doRequest(String method, Object... params) {
+		JSONObject param = new JSONObject();
+		param.put("id", System.currentTimeMillis() + "");
+		param.put("jsonrpc", "2.0");
+		param.put("method", method);
+		if (params != null) {
+			param.put("params", params);
+		}
+		String creb = Base64.encodeBase64String((address + ":" + password).getBytes());
+		Map<String, String> headers = new HashMap<>(2);
+		headers.put("Authorization", "Basic " + creb);
+		String resp = "";
+		try {
+			resp = HttpUtil.jsonPost(postUrl, headers, param.toJSONString());
+		} catch (Exception e) {
+			// logger.info(e.getMessage());
+			if (e instanceof IOException) {
+				resp = "{}";
+			}
+		}
+		return JSON.parseObject(resp);
+	}
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java b/src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java
index 7fddc94..467d131 100644
--- a/src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java
+++ b/src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java
@@ -6,10 +6,7 @@
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestHeader;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.xcong.excoin.common.response.Result;
@@ -23,11 +20,15 @@
 import com.xcong.excoin.modules.member.parameter.dto.MemberPaymethodDto;
 import com.xcong.excoin.modules.member.parameter.dto.MemberUpdatePwdDto;
 import com.xcong.excoin.modules.member.parameter.dto.MemberUpdateTradePwdDto;
+import com.xcong.excoin.modules.member.parameter.vo.MemberAuthenticationInfoVo;
+import com.xcong.excoin.modules.member.parameter.vo.MemberAvivableCoinInfoVo;
 import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressCountListVo;
 import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressListVo;
+import com.xcong.excoin.modules.member.parameter.vo.MemberCoinInfoListVo;
 import com.xcong.excoin.modules.member.parameter.vo.MemberInfoVo;
 import com.xcong.excoin.modules.member.parameter.vo.MemberPaymethodDetailListVo;
 import com.xcong.excoin.modules.member.parameter.vo.MemberPaymethodDetailVo;
+import com.xcong.excoin.modules.member.parameter.vo.MemberPersonCenterInfoVo;
 import com.xcong.excoin.modules.member.parameter.vo.MemberSendCodeWayVo;
 import com.xcong.excoin.modules.member.service.MemberService;
 
@@ -85,6 +86,17 @@
 		//System.out.println("修改密码:");
 		return memberService.memberUpdatePwd(memberUpdatePwdDto);
 	}
+	
+	/**
+     * 获取实名认证信息
+     * @return
+     */
+    @ApiOperation(value = "获取实名认证信息", notes = "获取实名认证信息")
+    @ApiResponses({@ApiResponse( code = 200, message = "success", response = MemberAuthenticationInfoVo.class)})
+    @GetMapping(value = "/memberAuthenticationInfo")
+    public Result memberAuthenticationInfo() {
+        return memberService.memberAuthenticationInfo();
+    }
 	
 	/**
 	 * 实名认证
@@ -250,40 +262,42 @@
         return memberService.memberSendCodeWay();
     }
     
-
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
+    /**
+     * 获取个人中心信息
+     * @return
+     */
+    @ApiOperation(value = "获取个人中心信息", notes = "获取个人中心信息")
+    @ApiResponses({@ApiResponse( code = 200, message = "success", response = MemberPersonCenterInfoVo.class)})
+    @GetMapping(value = "/memberPersonCenterInfo")
+    public Result memberPersonCenterInfo() {
+        return memberService.memberPersonCenterInfo();
+    }
+    
+    /**
+     * 提币币种信息
+     * @return
+     */
+    @ApiOperation(value = "获取提币币种信息", notes = "获取提币币种信息")
+    @ApiResponses({@ApiResponse( code = 200, message = "success", response = MemberCoinInfoListVo.class)})
+    @GetMapping(value = "/memberCoinInfoList")
+    public Result memberCoinInfoList() {
+        return memberService.memberCoinInfoList();
+    }
+    
+    /**
+	 * 	提币币种可用资金
+	 * @param token
+	 * @param coinVo
+	 * @return
+	 */
+    @ApiOperation(value = "提币币种可用资金", notes = "提币币种可用资金")
+    @ApiResponses({@ApiResponse( code = 200, message = "success", response = MemberAvivableCoinInfoVo.class)})
+    @ApiImplicitParams({
+		@ApiImplicitParam(name = "symbol", value = "币种", required = true, dataType = "String", paramType="query")
+	})
+    @GetMapping(value = "/memberAvivableCoinInfo")
+	public Result memberAvivableCoinInfo(String symbol) {
+		return memberService.memberAvivableCoinInfo(symbol);
+	}
+    
 }
diff --git a/src/main/java/com/xcong/excoin/modules/member/dao/AgentReturnDao.java b/src/main/java/com/xcong/excoin/modules/member/dao/AgentReturnDao.java
new file mode 100644
index 0000000..9344717
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/dao/AgentReturnDao.java
@@ -0,0 +1,10 @@
+package com.xcong.excoin.modules.member.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xcong.excoin.modules.member.entity.AgentReturnEntity;
+
+/**
+ * @author helius
+ */
+public interface AgentReturnDao extends BaseMapper<AgentReturnEntity> {
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java b/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java
index 3a7f4e3..ade4d94 100644
--- a/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java
+++ b/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java
@@ -1,13 +1,17 @@
 package com.xcong.excoin.modules.member.dao;
 
+import org.apache.ibatis.annotations.Param;
+
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity;
 
 public interface MemberCoinAddressDao  extends BaseMapper<MemberCoinAddressEntity> {
 
 	MemberCoinAddressEntity selectAddressByMemberIdAndSymbol(Long memberId, String symbol);
+	
+	MemberCoinAddressEntity selectBlockAddressWithTag(@Param("memberId")Long memberId, @Param("symbol")String symbol, @Param("tag")String tag);
+	MemberCoinAddressEntity selectBlockAddress(@Param("memberId")Long memberId, @Param("symbol")String symbol);
 
-	MemberCoinAddressEntity selectBlockAddress(Long memberId, String string);
 
 
 }
diff --git a/src/main/java/com/xcong/excoin/modules/member/parameter/dto/MemberPaymethodDto.java b/src/main/java/com/xcong/excoin/modules/member/parameter/dto/MemberPaymethodDto.java
index f11ebf0..fa2a3b2 100644
--- a/src/main/java/com/xcong/excoin/modules/member/parameter/dto/MemberPaymethodDto.java
+++ b/src/main/java/com/xcong/excoin/modules/member/parameter/dto/MemberPaymethodDto.java
@@ -42,11 +42,5 @@
     @NotNull(message = "类型不能为空")
     @ApiModelProperty(value = "类型 1-支付宝2-微信3-银行卡", example = "1")
     private String paymentType;
-    /**
-     * 默认收款方式
-     */
-    @NotNull(message = "默认收款方式不能为空")
-    @ApiModelProperty(value = "类型 1-是 0-否", example = "1")
-    private String isDefualt;
 
 }
diff --git a/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAuthenticationInfoVo.java b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAuthenticationInfoVo.java
new file mode 100644
index 0000000..e1ffeda
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAuthenticationInfoVo.java
@@ -0,0 +1,26 @@
+package com.xcong.excoin.modules.member.parameter.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "MemberAuthenticationInfoVo", description = "实名认证信息")
+public class MemberAuthenticationInfoVo {
+	
+	@ApiModelProperty(value = "实名认证状态 0-审核未通过 1-审核通过 2-等待审核")
+    private Integer certifyStatus;
+	
+    @ApiModelProperty(value = "姓")
+	private String firstName;
+
+    @ApiModelProperty(value = "名")
+	private String secondName;
+	
+    @ApiModelProperty(value = "身份证卡号")
+	private String idCardNo;
+	
+    @ApiModelProperty(value = "国家")
+	private String nation;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAvivableCoinInfoVo.java b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAvivableCoinInfoVo.java
new file mode 100644
index 0000000..feb201d
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAvivableCoinInfoVo.java
@@ -0,0 +1,19 @@
+package com.xcong.excoin.modules.member.parameter.vo;
+
+import java.math.BigDecimal;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "MemberAvivableCoinInfoVo", description = "提币币种可用资金信息")
+public class MemberAvivableCoinInfoVo {
+	
+	@ApiModelProperty(value = "可用余额")
+	private BigDecimal availableBalance;
+	
+	@ApiModelProperty(value = "手续费")
+	private BigDecimal fee;
+	
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoListVo.java b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoListVo.java
new file mode 100644
index 0000000..a5ac662
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoListVo.java
@@ -0,0 +1,16 @@
+package com.xcong.excoin.modules.member.parameter.vo;
+
+import java.util.List;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "MemberCoinInfoListVo", description = "币种信息")
+public class MemberCoinInfoListVo {
+	
+	@ApiModelProperty(value = "币种名称")
+	private List<MemberCoinInfoVo> memberCoinInfoVo;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoVo.java b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoVo.java
new file mode 100644
index 0000000..36d950e
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoVo.java
@@ -0,0 +1,14 @@
+package com.xcong.excoin.modules.member.parameter.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "MemberCoinInfoVo", description = "币种信息")
+public class MemberCoinInfoVo {
+
+	@ApiModelProperty(value = "币种名称")
+	private String name;
+	
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberPersonCenterInfoVo.java b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberPersonCenterInfoVo.java
new file mode 100644
index 0000000..827cfb3
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberPersonCenterInfoVo.java
@@ -0,0 +1,32 @@
+package com.xcong.excoin.modules.member.parameter.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "MemberPersonCenterInfoVo", description = "个人中心信息")
+public class MemberPersonCenterInfoVo {
+	
+    @ApiModelProperty(value = "手机号(包含国际手机号)1:有  0没有")
+    private Integer phone;
+
+    @ApiModelProperty(value = "邮箱1:有  0没有")
+    private Integer email;
+    
+    @ApiModelProperty(value = "交易密码1:有  0没有")
+    private Integer tradePassword;
+
+    @ApiModelProperty(value = "交易密码时效性设置1:一直需要输入密码  2不需要输入密码")
+    private Integer tradeAgingSetting;
+    /**
+     * 一直需要输入密码
+     */
+    public static final int PWD_NEED_FORVER = 1;
+
+    /**
+     * 不需要输入密码
+     */
+    public static final int PWD_NEED_NO = 2;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/service/MemberService.java b/src/main/java/com/xcong/excoin/modules/member/service/MemberService.java
index e3b1456..df9c240 100644
--- a/src/main/java/com/xcong/excoin/modules/member/service/MemberService.java
+++ b/src/main/java/com/xcong/excoin/modules/member/service/MemberService.java
@@ -64,6 +64,14 @@
 
 	public Result memberDelCoinAddress(@Valid MemberDelCoinAddressDto memberDelCoinAddressDto);
 
+	public Result memberAuthenticationInfo();
+
+	public Result memberPersonCenterInfo();
+
+	public Result memberCoinInfoList();
+
+	public Result memberAvivableCoinInfo(String symbol);
+
 	public NeedMoneyMemberVo selectFriendRelationUserByMemberId(Long memberId);
 
 	public List<NeedMoneyMemberVo> selectAllNeedMoneyMember(List<String> list);
diff --git a/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
index 31f9b4e..aa2feaa 100644
--- a/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
@@ -26,8 +26,23 @@
 import com.xcong.excoin.modules.member.parameter.dto.MemberUpdatePwdDto;
 import com.xcong.excoin.modules.member.parameter.dto.MemberUpdateTradePwdDto;
 import com.xcong.excoin.modules.member.parameter.vo.*;
+import com.xcong.excoin.modules.member.parameter.vo.MemberAuthenticationInfoVo;
+import com.xcong.excoin.modules.member.parameter.vo.MemberAvivableCoinInfoVo;
+import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressCountListVo;
+import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressCountVo;
+import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressListVo;
+import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressVo;
+import com.xcong.excoin.modules.member.parameter.vo.MemberCoinInfoListVo;
+import com.xcong.excoin.modules.member.parameter.vo.MemberCoinInfoVo;
+import com.xcong.excoin.modules.member.parameter.vo.MemberInfoVo;
+import com.xcong.excoin.modules.member.parameter.vo.MemberPaymethodDetailListVo;
+import com.xcong.excoin.modules.member.parameter.vo.MemberPaymethodDetailVo;
+import com.xcong.excoin.modules.member.parameter.vo.MemberPersonCenterInfoVo;
+import com.xcong.excoin.modules.member.parameter.vo.MemberSendCodeWayVo;
 import com.xcong.excoin.modules.member.service.MemberService;
+import com.xcong.excoin.modules.platform.dao.PlatformFeeSettingDao;
 import com.xcong.excoin.modules.platform.dao.PlatformSymbolsCoinDao;
+import com.xcong.excoin.modules.platform.entity.PlatformFeeSettingEntity;
 import com.xcong.excoin.modules.platform.entity.PlatformSymbolsCoinEntity;
 import com.xcong.excoin.utils.MessageSourceUtils;
 import com.xcong.excoin.utils.RedisUtils;
@@ -81,6 +96,9 @@
     @Resource
     PlatformSymbolsCoinDao platformSymbolsCoinDao;
     
+    @Resource
+    PlatformFeeSettingDao platformFeeSettingDao;
+
     @Resource
     MemberCoinAddressDao memberCoinAddressDao;
     
@@ -435,7 +453,6 @@
 		String paymentQrcode = memberPaymethodDto.getPaymentQrcode();
 		String paymentType = memberPaymethodDto.getPaymentType();
 		String subBank = memberPaymethodDto.getSubBank();
-		String isDefualt = memberPaymethodDto.getIsDefualt();
 		MemberPaymentMethodEntity memberPaymentMethodEntity = new MemberPaymentMethodEntity();
 		memberPaymentMethodEntity.setMemberId(memberId);
 		memberPaymentMethodEntity.setAccount(account);
@@ -444,7 +461,6 @@
 		memberPaymentMethodEntity.setPaymentQrcode(paymentQrcode);
 		memberPaymentMethodEntity.setPaymentType(paymentType);
 		memberPaymentMethodEntity.setSubBank(subBank);
-		memberPaymentMethodEntity.setIsDefualt(isDefualt);
 		memberPaymentMethodDao.insert(memberPaymentMethodEntity);
 		return Result.ok(MessageSourceUtils.getString("member_service_0024"));
     }
@@ -650,6 +666,96 @@
 	}
 
 	@Override
+	public Result memberAuthenticationInfo() {
+		//获取用户ID
+		Long memberId = LoginUserUtils.getAppLoginUser().getId();
+		MemberEntity member = memberDao.selectById(memberId);
+
+		Map<String, Object> columnMap = new HashMap<>();
+		columnMap.put("member_id", memberId);
+		List<MemberAuthenticationEntity> selectByMap = memberAuthenticationDao.selectByMap(columnMap);
+
+		MemberAuthenticationInfoVo memberAuthnticationInfoVo = new MemberAuthenticationInfoVo();
+		memberAuthnticationInfoVo.setCertifyStatus(member.getCertifyStatus());
+		if(CollUtil.isNotEmpty(selectByMap)) {
+			for(MemberAuthenticationEntity memberAuthenticationEntity : selectByMap) {
+				memberAuthnticationInfoVo.setFirstName(memberAuthenticationEntity.getFirstName());
+				memberAuthnticationInfoVo.setSecondName(memberAuthenticationEntity.getSecondName());
+				memberAuthnticationInfoVo.setNation(memberAuthenticationEntity.getNation());
+				memberAuthnticationInfoVo.setIdCardNo(memberAuthenticationEntity.getIdcardNo());
+			}
+		}
+		return Result.ok(memberAuthnticationInfoVo);
+	}
+
+	@Override
+	public Result memberPersonCenterInfo() {
+		//获取用户ID
+		Long memberId = LoginUserUtils.getAppLoginUser().getId();
+		MemberEntity member = memberDao.selectById(memberId);
+
+		MemberPersonCenterInfoVo memberPersonCenterInfoVo = new MemberPersonCenterInfoVo();
+		if(StrUtil.isNotEmpty(member.getPhone())) {
+			memberPersonCenterInfoVo.setPhone(1);
+		}
+		memberPersonCenterInfoVo.setPhone(0);
+
+		if(StrUtil.isNotEmpty(member.getEmail())) {
+			memberPersonCenterInfoVo.setEmail(1);
+		}
+		memberPersonCenterInfoVo.setEmail(0);
+
+		if(StrUtil.isNotEmpty(member.getTradePassword())) {
+			memberPersonCenterInfoVo.setTradePassword(1);
+		}
+		memberPersonCenterInfoVo.setTradePassword(0);
+
+		if(StrUtil.isNotEmpty(member.getTradeAgingSetting().toString())) {
+			memberPersonCenterInfoVo.setTradeAgingSetting(MemberPersonCenterInfoVo.PWD_NEED_FORVER);
+		}
+		memberPersonCenterInfoVo.setTradeAgingSetting(MemberPersonCenterInfoVo.PWD_NEED_FORVER);
+
+		return Result.ok(memberPersonCenterInfoVo);
+	}
+
+	@Override
+	public Result memberCoinInfoList() {
+		//获取用户ID
+		Long memberId = LoginUserUtils.getAppLoginUser().getId();
+
+		MemberCoinInfoListVo memberCoinInfoListVo = new MemberCoinInfoListVo();
+		List<PlatformSymbolsCoinEntity> selectByMap = platformSymbolsCoinDao.selectByMap(new HashMap<>());
+		List<MemberCoinInfoVo> arrayList = new ArrayList<>();
+		if(CollUtil.isNotEmpty(selectByMap)) {
+			for(PlatformSymbolsCoinEntity platformSymbolsCoinEntity : selectByMap) {
+				MemberCoinInfoVo memberCoinInfoVo = new MemberCoinInfoVo();
+				memberCoinInfoVo.setName(platformSymbolsCoinEntity.getName());
+				arrayList.add(memberCoinInfoVo);
+			}
+		}
+		memberCoinInfoListVo.setMemberCoinInfoVo(arrayList);
+
+		return Result.ok(memberCoinInfoListVo);
+	}
+
+	@Override
+	public Result memberAvivableCoinInfo(String symbol) {
+		//获取用户ID
+		Long memberId = LoginUserUtils.getAppLoginUser().getId();
+        MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, symbol);
+        if (ObjectUtil.isEmpty(walletCoin)) {
+        	  return Result.fail(MessageSourceUtils.getString("member_service_0087"));
+        }
+
+        MemberAvivableCoinInfoVo memberAvivableCoinInfoVo = new MemberAvivableCoinInfoVo();
+        memberAvivableCoinInfoVo.setAvailableBalance(walletCoin.getAvailableBalance());
+
+        PlatformFeeSettingEntity feeSetting = platformFeeSettingDao.getFeeSettingByTypeAndSymbol(2,symbol);
+        memberAvivableCoinInfoVo.setFee(feeSetting.getFeePrice());
+        return Result.ok(memberAvivableCoinInfoVo);
+    }
+
+	@Override
 	public NeedMoneyMemberVo selectFriendRelationUserByMemberId(Long memberId){
 		return memberDao.selectFriendRelationUserByMemberId(memberId);
 	}
diff --git a/src/main/java/com/xcong/excoin/modules/platform/dao/PlatformFeeSettingDao.java b/src/main/java/com/xcong/excoin/modules/platform/dao/PlatformFeeSettingDao.java
new file mode 100644
index 0000000..79b6f05
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/platform/dao/PlatformFeeSettingDao.java
@@ -0,0 +1,14 @@
+package com.xcong.excoin.modules.platform.dao;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xcong.excoin.modules.platform.entity.PlatformFeeSettingEntity;
+
+public interface PlatformFeeSettingDao extends BaseMapper<PlatformFeeSettingEntity> {
+	
+	PlatformFeeSettingEntity getFeeSettingByTypeAndSymbolLable(@Param("type")Integer type,@Param("symbol")String symbol,@Param("lable")String lable);
+
+	PlatformFeeSettingEntity getFeeSettingByTypeAndSymbol(@Param("type")Integer type,@Param("symbol")String symbol);
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformCnyUsdtExchangeEntity.java b/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformCnyUsdtExchangeEntity.java
index cf89fbb..4afacaf 100644
--- a/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformCnyUsdtExchangeEntity.java
+++ b/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformCnyUsdtExchangeEntity.java
@@ -1,5 +1,6 @@
 package com.xcong.excoin.modules.platform.entity;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -7,7 +8,12 @@
 import lombok.Data;
 @Data
 @TableName("platform_cny_usdt_exchange")
-public class PlatformCnyUsdtExchangeEntity{
+public class PlatformCnyUsdtExchangeEntity implements Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
 
 	private Long id;
 
diff --git a/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformFeeSettingEntity.java b/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformFeeSettingEntity.java
new file mode 100644
index 0000000..ecea14f
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformFeeSettingEntity.java
@@ -0,0 +1,53 @@
+package com.xcong.excoin.modules.platform.entity;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import lombok.Data;
+
+@Data
+@TableName("platform_fee_setting")
+public class PlatformFeeSettingEntity implements Serializable {
+	
+	private static final long serialVersionUID = 1L;
+	/**
+	 * 主键ID
+	 */
+	private Long id;
+	/**
+	 * 类型 1-充币2-提币3-充值USDT4-提现USDT
+	 */
+	private Integer type;
+	/**
+	 * 最低价
+	 */
+	private BigDecimal minPrice;
+	/**
+	 * 最高价
+	 */
+	private BigDecimal maxPrice;
+	/**
+	 * 手续费价
+	 */
+	private BigDecimal feePrice;
+	/**
+	 * 
+	 */
+	private Date createTime;
+	/**
+	 * 人民币价格
+	 */
+	private BigDecimal cnyPrice;
+	/**
+	 * 币种
+	 */
+	private String symbol;
+	/**
+	 * USDT链名
+	 */
+	private String lable;
+
+}
diff --git a/src/main/resources/mapper/member/AgentReturnDao.xml b/src/main/resources/mapper/member/AgentReturnDao.xml
new file mode 100644
index 0000000..3c7e7e8
--- /dev/null
+++ b/src/main/resources/mapper/member/AgentReturnDao.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xcong.excoin.modules.member.dao.AgentReturnDao">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/member/MemberCoinAddressDao.xml b/src/main/resources/mapper/member/MemberCoinAddressDao.xml
index ed64675..7355ec0 100644
--- a/src/main/resources/mapper/member/MemberCoinAddressDao.xml
+++ b/src/main/resources/mapper/member/MemberCoinAddressDao.xml
@@ -6,7 +6,7 @@
         select * from member_coin_address where member_id=#{memberId} and symbol = #{symbol}
     </select>
     
-    <select id="selectBlockAddress" resultType="com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity">
+	<select id="selectBlockAddressWithTag" resultType="com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity">
 		select *
 		  from member_coin_address 
 		 <where>
@@ -17,6 +17,23 @@
 			 <if test="symbol != null  and  symbol  != ''">
 				 and symbol = #{symbol}
 			 </if>
+			 <if test="tag != null  and  tag  != ''">
+				 and tag = #{tag}
+			 </if>
+		 </where>
+	</select>
+	
+	<select id="selectBlockAddress" resultType="com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity">
+		select * 
+		  from member_coin_address 
+		 <where>
+		 is_biyict = 1
+	 		<if test="memberId != null  and  memberId  != ''">
+	 			 and member_id = #{memberId}
+	 		</if>
+			 <if test="symbol != null  and  symbol  != ''">
+				 and symbol = #{symbol}
+			 </if>
 		 </where>
 	</select>
     
diff --git a/src/main/resources/mapper/platform/PlatformFeeSettingDao.xml b/src/main/resources/mapper/platform/PlatformFeeSettingDao.xml
new file mode 100644
index 0000000..6df23c2
--- /dev/null
+++ b/src/main/resources/mapper/platform/PlatformFeeSettingDao.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xcong.excoin.modules.platform.dao.PlatformFeeSettingDao">
+
+	<select id="getFeeSettingByTypeAndSymbolLable" resultType="com.xcong.excoin.modules.platform.entity.PlatformFeeSettingEntity">
+ 		select * from fee_setting 
+ 		 <where>
+	 		<if test="type != null  and  type  != ''">
+	 			 type = #{type}
+	 		</if>
+			 <if test="symbol != null  and  symbol  != ''">
+				 and symbol = #{symbol}
+			 </if>
+			 <if test="lable != null  and  lable  != ''">
+				 and lable = #{lable}
+			 </if>
+		 </where>
+ 	</select>
+ 	
+ 	<select id="getFeeSettingByTypeAndSymbol" resultType="com.xcong.excoin.modules.platform.entity.PlatformFeeSettingEntity">
+ 		select * from fee_setting where  type = #{type} and symbol = #{symbol}
+ 	</select>
+	
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.1