Java bitcoin development tutorial: limited price trading of bitcoin in open exchange

Time:2019-11-22

Java bitcoin development tutorial: limited price trading of bitcoin in open exchange
The previous chapter introduced exincore, where you can buy and sell assets at market price in one second. You need oceanone if you want to limit price trading, or buy and sell assets that are not supported by exincore.

Scheme II: ocean.one exchange

Ocean. One is a decentralized exchange based on mixin network, which is as friendly as the centralized exchange.
You can trade any asset on oceanone. Just transfer your currency to oceanone and write the transaction information in the memo of the transaction. Oceanone will list your transaction needs in the market,
After the transaction is successful, the target currency will be transferred to your mixin network account, which has three major features and advantages:

  • No need to register with oceanone
  • No need to deposit money to the exchange
  • Support all assets that can be transferred on mixin network and all erc20 EOS tokens.

Preparatory knowledge:

You need to create a robot first, method in tutorial 1

Install dependency package

As we introduced in tutorial 1, we need to rely onmixin-java-sdk, you should have installed it first

Install required packages

Lesson four, it was installed in the last lesson

Charge it to mixin network and read out its balance

Here is a demonstration of buying BTC with usdt or buying usdt with BTC. Check your wallet address before you trade.
The complete steps are as follows:

  • Check the balance and wallet address of bitcoin or usdt. And write down the address of the wallet.
  • From a third-party exchange or your cold wallet, charge the money to the wallet address above.
  • Check the balance of the currency again to see whether the account is good or not. (bitcoin’s arrival time is the height of five blocks, about 100 minutes).

Bitcoin and usdt have the same recharge address.

  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("-----------------------------------------------------------------------");

Obtain market price information of ocean.one

How to query the price information of ocean.one market? You should first understand what the base currency you are trading is. If you want to buy bitcoin and sell usdt, the base currency is usdt; if you want to buy usdt and sell bitcoin, the base currency is bitcoin

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;
}

Create a memo before trading!

In the second chapter, Java bitcoin development tutorial based on mixin network: robots accept bitcoin and return it to users immediately. We have learned how to transfer accounts. Here we introduce how to tell ocean.one what we want to transfer accounts for and put all information in memo

  • SideDirection, “B” or “a”, “B” is purchase, and “a” is sale
  • AssetUUIDUUID of the target virtual asset
  • PricePrice: if the operation direction is “B”, the price is the price of assetuuid; if the operation direction is “B”, the price is the price transferred to ocean.one
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 "";
}

Example of selling BTC

Transfer the BTC you plan to sell to ocean.one (ocean one? BOT), and put the UUID of the target virtual asset you plan to exchange back into memo

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--------------------------------------------");
}

If you are going to buy BTC, the operation is as follows:

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--------------------------------------------");
}

A successful list is as follows:

------------------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: ------

Cancel the list

Ocean.one uses trace Ou ID as an order, such as the above example,6cf37ca6-4efa-4e78-bea1-53c5c5d54d2bIt’s the order number. We use him to cancel the order.

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 "";
}

Confirm receipt by reading asset balance

Check the wallet’s balance.

MixinAPI mixinApiUser = generateAPI_FromCSV();
JsonObject asset = mixinApiUser.getAsset(BTC_ASSET_ID);

Source code execution

Compile and execute to start the transaction

  • gradle buildCompile the project
  • java -cpRun the project
java -cp .:build/libs/bitcoin_wallet-java.jar:libs/* bitcoin_wallet.java.App

Note: you can’t use gradle run to run because we useSystem.console().readLine()Not supported by gradle, can only usejava -cp
To run!

Command list when this code is executed:

  • 1: Create Bitcoin Wallet and update PIN
  • 2: Read Bitcoin balance & address
  • 3: Read USDT balance & address
  • 4: Read EOS balance & address
  • tbb:Transfer BTC from Bot to Wallet
  • tbm:Transfer BTC from Wallet to Master
  • teb:Transfer EOS from Bot to Wallet
  • tem:Transfer EOS from Wallet to Master
  • tub:Transfer USDT from Bot to Wallet
  • tum:Transfer USDT from Wallet to Master
  • 5: pay 0.0001 BTC buy USDT
  • 6: pay $1 USDT buy BTC
  • 7: Read Snapshots
  • 8: Fetch market price(USDT)
  • 9: Fetch market price(BTC)
  • v: Verify Wallet Pin
  • wb: Withdraw BTC
  • we: WitchDraw EOS
  • a: Read All Assets Infos
  • o: Ocean.One Exchange
  • q: Exit

Make your choose(eg: q for Exit!):

  • 1: Orders-Book of BTC/USDT
  • b1: Buy BTC pay USDT
  • s1: Sell BTC get USDT
  • 2: Orders-Book of EOS/USDT
  • b2: Buy EOS pay USDT
  • s2: Sell EOS get USDT
  • 3: Orders-Book of XIN/USDT
  • b3: Buy XIN pay USDT
  • s3: Sell XIN get USDT
  • 4: Orders-Book of XIN/BTC
  • b4: Buy XIN pay BTC
  • s4: Sell XIN get BTC
  • 5: Orders-Book of EOS/BTC
  • b4: Buy EOS pay BTC
  • s4: Sell EOS get BTC
  • 6: Orders-Book of SC/BTC
  • b6: Buy SC pay BTC
  • s6: Sell SC get BTC
  • 7: Orders-Book of EOS/XIN
  • b7: Buy EOS pay XIN
  • s7: Sell EOS get XIN
  • 8: Orders-Book of ETH/XIN
  • b8: Buy ETH pay XIN
  • s8: Sell EOS get XIN
  • 9: Orders-Book of SC/XIN
  • b9: Buy SC pay XIN
  • s9: Sell SC get XIN
  • c: Cancel the order
  • q: Exit

Complete code