No description, website, or topics provided.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.

README.md

Skycoin Exchange

Installation

go get github.com/skycoin/skycoin-exchange

Sync the dependencies

go get github.com/robfig/glock
glock sync github.com/skycoin/skycoin-exchange

Running server

cd skycoin-exchange/cmd/server
go run main.go -seed=$seed -skycoin_node_addr=$skycoin_node_address

The seed flag must be specificed, server will generate wallet base on it. The default server port is 8080, and you can use the port flag to change it.

As the exchange will comunicate with skycoin node, we use the skycoin_node_addr flag to make it configurable. The default value of 127.0.0.1:6420 will be used if it's not set.

Setup admin in server

As some apis need admin privilege, the server do not have admin account by default,use the following command to set up admin accounts.

go run main.go -admins="0311ff3ed447e3ebe176e929017556e2d2be7c52b1f241dd80df98635ea9f53b22"

Multiple admin accounts are connected by commas.

Help

For more usage, run the help command:

go run main.go --help

API client

Running the client

./client.sh

Default client port is 6060, use the p flag to change it.

Create account

  • mode: POST
  • url: /api/v1/accounts

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "pubkey": "03c9852d11d2d84d23356df6390f10a53dbd8026ed4bc58f9ccddd7a7c69e00715",
  "created_at": 1470188576
}

Once the new account is created, this account will become the active account, that means the following apis calls are all base on this account.

Get account

This api is used to get account in client, you can use it to list all the acccounts, or to get the active account.

  • mode: GET
  • url: /api/v1/account?active=[:active]
  • params:
    • active: optional condition, if not set, return all accounts, otherwise the active must be 1 and return the active account.

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "accounts": [
    {
      "pubkey": "02c9656e65f70753f021832a7a1874c966917974b242b11b2d73d04bcaaea21a4d",
      "wallet_ids": {
        "bitcoin": "bitcoin_myf"
      }
    }
  ]
}

Switch account

  • mode: PUT
  • url: /api/v1/account/state?pubkey=[:pubkey]

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  }
}

Get supported coins

  • mode:GET
  • url: /api/v1/coins

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "coins": [
    "BTC",
    "SKY"
  ]
}

Get deposit address

  • mode: POST
  • url: /api/v1/account/deposit_address?coin_type=[:coin_type]
  • params:
    • coin_type: can be bitcoin, skycoin, etc.

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "coin_type": "bitcoin",
  "address": "1HBuSp1G151xTqLpMT3mBDXskC5iVNTAwx"
}

Get account balance

  • mode: GET
  • url: /api/v1/account/balance?coin_type=[:coin_type]
  • params:
    • coin_type: can be bitcoin, skycoin.

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "coin_type": "bitcoin",
  "balance": 480000
}

Withdraw coins

  • mdoe: POST
  • url: /api/v1/account/withdrawal?coin_type=[:type]&amount=[:amt]&toaddr=[:toaddr]
  • params:
    • coin_type: can be bitcoin, skycoin, etc.
    • amount: the coin number you want to withdrawal, btc in satoshis, sky in drops.
    • toaddr: address you want to receive the coins.

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "new_txid": "21b1a9c59a3a631f14b7f91c9b886f6e379c36dd357f7628964107c4d953ea5a"
}

Create order

  • mode: POST
  • url: /api/v1/account/order?coin_pair=[:coin_pair]&type=[:type]&price=[:price]&amt=[:amt]
  • params:
    • coin_pair: coin pair, like bitcoin/skycoin.
    • type: order type, can be bid or ask
    • price: price
    • amt: amount

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "order_id": 8
}

Get orders

  • mode: GET
  • url: /api/v1/orders/[:type]?coin_pair=[:coin_pair]&start=[:start]&end=[:end]
  • params:
    • type: order type, can be bid or ask.
    • coin_pair: coin pair, joined by '/', like: bitcoin/skycoin.
    • start: start index of the orders.
    • end: end index of the orders.

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "coin_pair": "bitcoin/skycoin",
  "type": "bid",
  "orders": [
    {
      "id": 8,
      "type": "bid",
      "price": 25,
      "amount": 90000,
      "rest_amt": 90000,
      "created_at": 1470193222
    },
    {
      "id": 3,
      "type": "bid",
      "price": 25,
      "amount": 90000,
      "rest_amt": 90000,
      "created_at": 1470152057
    }
  ]
}

Get utxos

  • mode: GET
  • url: /api/v1/utxos?coin_type=[:coin_type]&addrs=[:addrs]
  • params:
    • coin_type: coin type, can be bitcoin or skycoin.
    • addrs: addresses, connected with comma.

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "btc_utxos": [
    {
      "address": "1EknG7EauSW4zxFtSrCQSHe5PJenks55s6",
      "txid": "c5ab911556a4628a5a98ee5386a8a3b465831c66953d288bbfeb4221e95158d8d",
      "vout": 0,
      "amount": 90000
    },
    {
      "address": "1EknG7EauSW4zxFtSrCQSHe5PJenks55s6",
      "txid": "a9a1ef0525b1446232fcb69bb4ef99ef239f78a7046f784b972f22a60348d963",
      "vout": 0,
      "amount": 90000
    }
  ]
}

NOTE: the utxos response json struct of bitcoin is different from skycoin.

Get transaction

This api is used to get tx verbose info by txid.

  • mode: GET
  • url: /api/v1/tx?coin_type=[:coin_type]&txid=[:txid]
  • params:
    • coin_type: bitcoin or skycoin
    • txid: transaction id

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "coin_type": "bitcoin",
  "tx": {
    "btc": {
      "txid": "5756ff16e2b9f881cd15b8a7e478b4899965f87f553b6210d0f8e5bf5be7df1d",
      "version": 1,
      "locktime": 981825022,
      "vin": [
        {
          "coinbase": "03a6ab05e4b883e5bda9e7a59ee4bb99e9b1bc76a3a2bb0e9c92f06e4a6349de9ccc8fbe0fad11133ed73c78ee12876334c13c02000000f09f909f2f4249503130302f4d696e65642062792073647a686162636400000000000000000000000000000000",
          "sequence": 2765846367
        }
      ],
      "vout": [
        {
          "value": "25.37726812",
          "n": 0,
          "scriptPubkey": {
            "asm": "OP_DUP OP_HASH160 c825a1ecf2a6830c4401620c3a16f1995057c2ab OP_EQUALVERIFY OP_CHECKSIG",
            "hex": "76a914c825a1ecf2a6830c4401620c3a16f1995057c2ab88ac",
            "type": "pubkeyhash",
            "addresses": [
              "1KFHE7w8BhaENAswwryaoccDb6qcT6DbYY"
            ]
          }
        }
      ],
      "blockhash": "0000000000000000027d0985fef71cbc05a5ee5cdbdc4c6baf2307e6c5db8591",
      "confirmations": 54245,
      "time": 1440604784,
      "blocktime": 1440604784
    }
  }
}

NOTE: the bitcoin transaction response struct is differen from skycoin.

Get raw transaction

  • mode: GET
  • url: /api/v1/rawtx?coin_type=[:coin_type]&txid=[:txid]
  • params:
    • coin_type: bitcoin or skycoin
    • txid: transaction id

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "coin_type": "bitcoin",
  "rawtx": "010000000132ea3894c4b2c68bb1255be5d0e8a26bd336fd7a562eca9f7c435c9268199f06020000006b483045022100dd4e1b960726e3d3d205cb5ef4d92b3e04f3839757606800ed662069a841ffdc02203f68723bbbf9800d16555ace1ef2f46e65c2a6341643f3c5bf84158b108e6d5d012103eb8b81f8ebc988c61d3cc4c4ac3d546b02a4994d612725e91d8d69a72045fb18ffffffff019d3b1f020000000017a914bfc03379d17dd1e918a026b76cde472bea7ac7268700000000"
}

Update balance

This api is used to update balance of specific account, need admin privilege, to acquire admin privilege, see setup admin in server.

  • mode: PUT
  • url: /api/v1/admin/account/balance?coin_type=[:coin_type]&dst=[:dst]&amt=[:amt]
  • params:
    • coin_type: bitcoin or skycoin
    • dst: account pubkey, the account whose balance is going to be updated.
    • amt: balance amount

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  }
}

Create wallet

  • mode: POST
  • url: /api/v1/wallet?type=[:type]&seed=[:seed]
  • params:
    • type: wallet type, can be bitcoin or skycoin
    • seed: wallet seed

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "id": "bitcoin_sd1101"
}

Generate new address

  • mode: POST
  • url: /api/v1/wallet/address?id=[:id]
  • params:
    • id: wallet id

response json:

{
  "Result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "address": "1FhzNKvpStmS4ZwpiZwRNVhTQvZBa39VNA"
}

Get public and secret key pair

  • mode: GET
  • url: /api/v1/wallet/address/key?id=[:id]&address=[:address]
  • params:
    • id: wallet id
    • address: coin address

response json:

{
  "Result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "pubkey": "03712c6bf0601f7a663ad7812f8d031e3e3f07f3f7ed03ad165dd7ee28120e7102",
  "seckey": "L4Y4E6UdCFqmmcYNGBFAXBZif6pfoox5CQNReBsnX8aimgBcRYeX"
}

Get wallet balance

  • mode: GET
  • url: /api/v1/wallet/balance?id=[:id]
response json:
{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "balance": {
    "amount": 11000000,
    "hours": 1518046
  }
}

The above response json is a skycoin wallet's balance result, you can see the balance contains hours field, while if bitcoin, the hours field will be omited.

Create raw transaction

  • mode: POST
  • url: /api/v1/create_rawtx?coin_type=[:coin_type]
  • params:
    • coin_type: skycoin or bitcoin

Specify the tx in and outs in json request body as below:

bitcoin request:

{
    "tx_ins":
    [
        {
            "txid":"44051e627966fad80f5e97890da1c67148f312cd2b617cf788f274f89abf16a4",
            "vout": 0
        }],
    "tx_outs":
    [
        {
          "address":"1GpMHk4GcWRBZfmBBd2iCt4PinhNs4SPrn",
          "value":4000
        },
        {
            "address":"1EknG7EauSW4zxFtSrCQSHe5PJenkn55s6",
            "value": 4000
        }]
}

skycoin request:

{
    "tx_ins":
    [
        {
            "txid":"11ad2877281d541e68a5e3004cccd166d85c9edf252cabfa5bb540648380cea9"
        }],
    "tx_outs":
    [
        {
          "address":"5iUowMCu1VSi565Q5DfLNXz26PwVNgN1jd",
          "value":1000000,
          "hours":2
        }]
}

Sign raw transaction

  • mode: POST
  • url: /api/v1/sign_rawtx?coin_type=[:coin_type]&raw_tx=[:rawtx]
  • params:
    • coin_type: skycoin or bitcoin
    • raw_tx: raw transaction that's going to be signed.

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "rawtx": "0100000001a416bf9af874f288f77c612bcd12f34871c6a10d89975e0fd8fa6679621e05440000000000ffffffff02a00f0000000000001976a914ad7e5f825191df239d43376d182cf85d3e9ac8a188aca00f0000000000001976a91496e14d971c0a482f37a06ba23094e0cc779676ff88ac00000000"
}

Make sure current active account owns the private key to sign the transaction.

Inject raw transaction

  • mode: POST
  • url: /api/v1/inject_rawtx?coin_type=[:coin_type]&rawtx=[:rawtx]
  • params:
    • coin_type: skycoin or bitcoin
    • rawtx: raw transaction that's going to be injected.

response json:

{
  "result": {
    "success": true,
    "errcode": 0,
    "reason": "Success"
  },
  "txid": "11ad2877281d541e68a5e3004cccd166d85c9edf252cabfa5bb540648380cea9"
}

Dependencies

Dependencies are managed with gvt.

To install gvt:

$ go get -u github.com/FiloSottile/gvt

gvt vendors all dependencies into the repo.

If you change the dependencies, you should update them as needed with gvt fetch, gvt update, gvt delete, etc.

Refer to the gvt documentation or gvt help for further instructions.

Register New Coin

  • Create new coin package in src/coin folder and create coin by example of mzcoin

  • In src/api/mobile/api.go, add new coin support in Init function:

func Init(cfg *Config) {
  initConfig(cfg,
    newCoin("skycoin", cfg.ServerAddr),
    newCoin("mzcoin", cfg.ServerAddr),
    newCoin("suncoin", cfg.ServerAddr),
    newBitcoin(cfg.ServerAddr))
}
  • In cmd/client/client.go main function, register coins:
  c.BindCoins(&bitcoin.Bitcoin{},
    skycoin.New(cfg.ServAddr),
    mzcoin.New(cfg.ServAddr),
    suncoin.New(cfg.ServAddr))
  • In cmd/server/server.go add coin's node address in registerFlags function

  • In cmd/server/serer.go register coins in main function