上一章介紹了Exincore,你能夠1秒完成資產的市價買賣。若是你想限訂價格買賣,或者買賣一些exincore不支持的資產,你須要OceanOne。java
Ocean.one是基於Mixin Network的去中心化交易所,它中心化交易所同樣友好。 你能夠在OceanOne上交易任何資產,只須要將你的幣轉給OceanOne, 將交易信息寫在交易的memo裏,OceanOne會在市場裏列出你的交易需求, 交易成功後,會將目標幣轉入到你的MixinNetwork賬上,它有三大特色與優點:git
你先須要建立一個機器人, 方法在 教程一.github
正如教程一里咱們介紹過的, 咱們須要依賴 mixin-java-sdk, 你應該先安裝過它了,zhang/mixin_labs-java-bot/blob/master/README.md).json
第四課, 在上一課中已經安裝好了.api
此處演示用 USDT購買BTC 或者 用BTC購買USDT。交易前,先檢查一下錢包地址。 完整的步驟以下:bash
比特幣與USDT的充值地址是同樣的。ide
private static final String BTC_ASSET_ID = "c6d0c728-2624-429b-8e0d-d9d19b6592fa";
private static final String EOS_ASSET_ID = "6cfe566e-4aad-470b-8c9a-2fd35b49c68d";
private static final String USDT_ASSET_ID = "815b0b1a-2764-3736-8faa-42d694fa620a";
MixinAPI mixinApiUser = generateAPI_FromCSV();
JsonObject asset = mixinApiUser.getAsset(BTC_ASSET_ID);
System.out.println(asset);
System.out.println("------------------------BTC------Information---------------------------");
System.out.println("The BTC wallet address is " + asset.get("public_key").getAsString());
System.out.println("The BTC wallet balance is " + asset.get("balance").getAsString());
System.out.println("-----------------------------------------------------------------------");
複製代碼
如何來查詢Ocean.one市場的價格信息呢?你要先了解你交易的基礎幣是什麼,若是你想買比特幣,賣出USDT,那麼基礎貨幣就是USDT;若是你想買USDT,賣出比特幣,那麼基礎貨幣就是比特幣.學習
if ( subinput.equals("1") ) {
FetchOceanMarketInfos(BTC_ASSET_ID,USDT_ASSET_ID);
}
private static void FetchOceanMarketInfos(String targetAssetID, String baseAssetID) {
OkHttpClient client = new OkHttpClient();
String baseUrl = "https://events.ocean.one/markets/%s-%s/book ";
String fullUrl = String.format(baseUrl,targetAssetID,baseAssetID);
// String fullUrl = baseUrl + url;
System.out.println(fullUrl);
Request request = new Request.Builder()
.url(fullUrl)
.build();
try {
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
String res = response.body().string();
// System.out.println(res);
JsonParser parser = new JsonParser();
JsonElement jsonTree = parser.parse(res);
JsonObject orders;
orders = jsonTree.getAsJsonObject();
JsonArray asksOrders = orders.get("data").getAsJsonObject().
get("data").getAsJsonObject().
get("asks").getAsJsonArray();
JsonArray bidsOrders = orders.get("data").getAsJsonObject().
get("data").getAsJsonObject().
get("bids").getAsJsonArray();
// System.out.println(orders.get("data").getAsJsonObject().get("data").getAsJsonObject().get("bids").getAsJsonArray());
System.out.println("--Side--Price--Amount--Funds---");
asksOrders.forEach((element) -> {
JsonObject jsonObj = element.getAsJsonObject();
System.out.println(jsonObj.get("side").getAsString() + " " +
jsonObj.get("price").getAsString() + " " +
jsonObj.get("amount").getAsString() + " " +
jsonObj.get("funds").getAsString() );
});
bidsOrders.forEach((element) -> {
JsonObject jsonObj = element.getAsJsonObject();
System.out.println(jsonObj.get("side").getAsString() + " " +
jsonObj.get("price").getAsString() + " " +
jsonObj.get("amount").getAsString() + " " +
jsonObj.get("funds").getAsString() );
});
System.out.println("----endo--of--btc/usdt----");
return;
} catch(Exception e) { e.printStackTrace(); }
return;
}
複製代碼
在第二章裏,基於Mixin Network的 Java 比特幣開發教程: 機器人接受比特幣並當即退還用戶, 咱們學習過轉賬,這兒咱們介紹如何告訴Ocean.one,咱們給它轉賬的目的是什麼,信息所有放在memo裏.gradle
public static String GenerateOrderMemo(String Side, String AssetUUID, String Price) {
try {
MessageBufferPacker m = MessagePack.newDefaultBufferPacker();
UUID myAssetUUID = UUID.fromString(AssetUUID);
Value map = ValueFactory.newMap(ValueFactory.newString("S"), ValueFactory.newString(Side),
ValueFactory.newString("A"), ValueFactory.newBinary(asBytes(myAssetUUID)),
ValueFactory.newString("P"), ValueFactory.newString(Price),
ValueFactory.newString("T"), ValueFactory.newString("L") );
m.packValue(map);
return Base64.getEncoder().encodeToString(m.toByteArray());
} catch (Exception e) { e.printStackTrace(); }
return "";
}
複製代碼
轉打算出售的BTC給Ocean.one(OCEANONE_BOT),將你打算換回來的目標虛擬資產的UUID放入memo.ui
private static final String OCEANONE_BOT = "aaff5bef-42fb-4c9f-90e0-29f69176b7d4";
private static final String BTC_ASSET_ID = "c6d0c728-2624-429b-8e0d-d9d19b6592fa";
private static final String EOS_ASSET_ID = "6cfe566e-4aad-470b-8c9a-2fd35b49c68d";
private static final String USDT_ASSET_ID = "815b0b1a-2764-3736-8faa-42d694fa620a";
private static final String BTC_WALLET_ADDR = "14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C";
private static final String MASTER_UUID = "0b4f49dc-8fb4-4539-9a89-fb3afc613747";
if ( subinput.equals("s1") ) {
System.out.print("Please input the BTC price base USDT: ");
String pinput = System.console().readLine();
System.out.println(pinput);
System.out.print("Please input the BTC amount: ");
String aminput = System.console().readLine();
System.out.println(aminput);
float amountf = Float.valueOf(aminput.trim()).floatValue();
String buyMemo = GenerateOrderMemo("A",USDT_ASSET_ID,pinput);
MixinAPI mixinApiUser = generateAPI_FromCSV();
// UUID usdtUUID = UUID.fromString(USDT_ASSET_ID);
// String memoTarget = encodeUUID(usdtUUID);
System.out.println("------------------Ocean.one-USDT-BTC-EXCHANGE----------------------------");
System.out.println(buyMemo);
JsonObject asset = mixinApiUser.getAsset(BTC_ASSET_ID);
System.out.println(asset);
System.out.println(asset.get("balance").getAsFloat());
if ( asset.get("balance").getAsFloat() > 0 && asset.get("balance").getAsFloat() >= amountf ) {
JsonObject transInfo = mixinApiUser.transfer(BTC_ASSET_ID, OCEANONE_BOT,
aminput,
buyMemo);
System.out.println("------------------------BTC Transfer To EXCHANGE Information----------------------");
System.out.println(transInfo);
System.out.println("-----------------------------------------------------------------------");
} else System.out.println("----------------Not enough BTC--------------------------------------------");
}
複製代碼
若是你是打算買BTC,操做以下:
if ( subinput.equals("b1") ) {
System.out.print("Please input the BTC price base USDT: ");
String pinput = System.console().readLine();
System.out.println(pinput);
System.out.print("Please input the USDT amount: ");
String aminput = System.console().readLine();
System.out.println(aminput);
float amountf = Float.valueOf(aminput.trim()).floatValue();
String buyMemo = GenerateOrderMemo("B",BTC_ASSET_ID,pinput);
MixinAPI mixinApiUser = generateAPI_FromCSV();
// UUID usdtUUID = UUID.fromString(USDT_ASSET_ID);
// String memoTarget = encodeUUID(usdtUUID);
System.out.println("------------------Ocean.one-USDT-BTC-EXCHANGE----------------------------");
System.out.println(buyMemo);
JsonObject asset = mixinApiUser.getAsset(USDT_ASSET_ID);
System.out.println(asset);
System.out.println(asset.get("balance").getAsFloat());
if ( asset.get("balance").getAsFloat() >= 1 && asset.get("balance").getAsFloat() >= amountf ) {
JsonObject transInfo = mixinApiUser.transfer(USDT_ASSET_ID, OCEANONE_BOT,
aminput,
buyMemo);
System.out.println("------------------------BTC Transfer To EXCHANGE Information----------------------");
System.out.println(transInfo);
System.out.println("-----------------------------------------------------------------------");
} else System.out.println("----------------Not enough USDT--------------------------------------------");
}
複製代碼
一個成功的掛單以下:
------------------Ocean.one--EXCHANGE----------------------------
hKFToUKhQcQQyUrIj0ZxOXa2CgkGTxgR6KFQojExoVShTA==
{"type":"asset","asset_id":"815b0b1a-2764-3736-8faa-42d694fa620a","chain_id":"c6d0c728-2624-429b-8e0d-d9d19b6592fa","symbol":"USDT","name":"Tether USD","icon_url":"https://images.mixin.one/ndNBEpObYs7450U08oAOMnSEPzN66SL8Mh-f2pPWBDeWaKbXTPUIdrZph7yj8Z93Rl8uZ16m7Qjz-E-9JFKSsJ-F=s128","balance":"2","public_key":"15RNBb5GzoXWRoEMT5MJL3pqzSjdPoXf6J","account_name":"","account_tag":"","price_btc":"0.00018747","price_usd":"0.98731224","change_btc":"0.021985715750932774","change_usd":"-0.01843154053058167","asset_key":"815b0b1a-2764-3736-8faa-42d694fa620a","confirmations":6,"capitalization":0}
2.0
--------------815b0b1a-2764-3736-8faa-42d694fa620a Transfer To EXCHANGE Information---------
{"type":"transfer","snapshot_id":"f526fd18-c3d2-4a6d-a0f0-3a720e93c48e","opponent_id":"aaff5bef-42fb-4c9f-90e0-29f69176b7d4","asset_id":"815b0b1a-2764-3736-8faa-42d694fa620a","amount":"-2","trace_id":"6cf37ca6-4efa-4e78-bea1-53c5c5d54d2b","memo":"hKFToUKhQcQQyUrIj0ZxOXa2CgkGTxgR6KFQojExoVShTA==","created_at":"2019-04-26T01:56:00.803572612Z","counter_user_id":"0b4f49dc-8fb4-4539-9a89-fb3afc613747"}
---Order is 6cf37ca6-4efa-4e78-bea1-53c5c5d54d2b: ------
複製代碼
Ocean.one將trace_id當作訂單,好比上面的例子, 6cf37ca6-4efa-4e78-bea1-53c5c5d54d2b 就是訂單號,咱們用他來取消訂單。
public static String GenerateOrderCancelMemo(String myUuid) {
try {
MessageBufferPacker m = MessagePack.newDefaultBufferPacker();
UUID AssetUUID = UUID.fromString(myUuid);
Value map = ValueFactory.newMap(
ValueFactory.newString("O"), ValueFactory.newBinary(asBytes(AssetUUID)) );
m.packValue(map);
return Base64.getEncoder().encodeToString(m.toByteArray());
} catch (Exception e) { e.printStackTrace(); }
return "";
}
複製代碼
Check the wallet's balance.
MixinAPI mixinApiUser = generateAPI_FromCSV();
JsonObject asset = mixinApiUser.getAsset(BTC_ASSET_ID);
複製代碼
編譯執行,便可開始交易了.
java -cp .:build/libs/bitcoin_wallet-java.jar:libs/* bitcoin_wallet.java.App
複製代碼
注意:不能使用gradle run來運行,由於咱們使用的System.console().readLine()不被Gradle支持,只能使用java -cp 來運行!
本代碼執行時的命令列表:
Make your choose(eg: q for Exit!):