0x を動かしてみた (その4)

f:id:simplex-blog:20181225211156p:plain

0x を動かしてみた (その4)

0x Project0x-launch-kit で Standard Relayer API を提供する SRA Server を立ち上げ、0x-starter-project から接続できるようにしてみました


【実行環境】

・使用した環境のバージョンは以下の通りです

  • MacOS: 10.13.6
  • node.js: 8.14.0
  • yarn: 1.12.3
  • 0x.js: 2.0.6

0x-launch-kit をビルドする

・プロジェクトをクローンします

$ git clone https://github.com/0xProject/0x-launch-kit.git
$ cd 0x-launch-kit

・Ganache-CLI に接続できるように変更します

[ ./ts/src/config.js ]

// Default network id to use when not specified
- exports.NETWORK_ID = 42;
+ exports.NETWORK_ID = 50;

// Whitelisted token addresses. Set to a '*' instead of an array to allow all tokens.
exports.WHITELISTED_TOKENS = [
    - '0x2002d3812f58e35f0ea1ffbf80a75a38c32175fa',
    - '0xd0a1e359811322d97991e03f863a0c30c2cf029c',
    + '0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c', // ZRX
    + '0x0b1ba0af832d7c05fd64161e0db78e85978e8082', // WETH
];

// Ethereum RPC url
- exports.RPC_URL = 'https://mainnet.infura.io';
+ exports.RPC_URL = 'http://127.0.0.1:8545';

[ ./package.json ]

"dependencies": {
    - "0x.js": "^1.0.4",
    + "0x.js": "^2.0.0",

    - "@0x/order-watcher": "^2.2.3",
    + "@0x/order-watcher": "^2.2.7",

・もし 0x-starter-project の fake_sra_server が起動していれば終了させます

・インストールして起動します

$ yarn install
$ yarn start:js

OUTPUT

query: BEGIN TRANSACTION
query: SELECT * FROM "sqlite_master" WHERE "type" = 'table' AND "name" IN ('signed_order_model')
query: SELECT * FROM "sqlite_master" WHERE "type" = 'index' AND "tbl_name" IN ('signed_order_model')
query: PRAGMA table_info("signed_order_model")
query: PRAGMA index_list("signed_order_model")
query: PRAGMA foreign_key_list("signed_order_model")
query: COMMIT
Standard relayer API (HTTP) listening on port 3000!

MEMO

  • SRA Server として下記 API が実装されている
    • GET /v2/orderbook
    • POST /v2/order_config
    • POST /v2/order
    • GET /v2/order/orderHash
    • GET /v2/asset_pairs
    • GET /v2/orders
    • GET /v2/fee_recipients

ERC20 Token を SRA Server 経由で交換してみる

・SRA Server を使用して ERC20 を交換するサンプルコードを実行します

※ エラー回避のため OrderBook 内にある最後の Order を取得するように変更します

[ ./src/scenarios/fill_order_sra.ts ]

// Taker queries the Orderbook from the Relayer

- const sraOrder = response.asks.records[0].order;
+ const sraOrder = response.asks.records.slice(-1)[0].order;

実行します

$ yarn scenario:fill_order_sra

OUTPUT

┌─────────────────────────────────┐
│ Fill Order Standard Relayer API │
└─────────────────────────────────┘
Accounts
Maker     0x5409ed021d9299bf6814279a6a1411a7e866a631
Taker     0x6ecbe1db9ef729cbe972c83fb886247691fb6beb
Setup
Maker ZRX Approval   0xa155b297a6d9d77bd33e4ebbd785b52b44330d339c933589419edc468413bcba
Taker WETH Approval  0xce3e966c5249eb318f90950fcde627f3fe2603d66a1fbfa2098b6485f9603d03
Taker WETH Deposit   0xab64a9366f72da18294a92c02276f17335b5ff48c92d9402b16c0bef72f80303
Order
signature              0x1c9a83043395bb1c4ddea098c38696e47c5c612283bc08be4c7050c20ca021b37a674053375e51e52427c97316ef4bf6fa8372018d6827421b45896c9a89c2299a03
senderAddress          0x0000000000000000000000000000000000000000
makerAddress           0x5409ed021d9299bf6814279a6a1411a7e866a631
takerAddress           0x0000000000000000000000000000000000000000
makerFee               0
takerFee               0
makerAssetAmount       5000000000000000000
takerAssetAmount       100000000000000000
makerAssetData         0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c
takerAssetData         0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082
salt                   70963124904396667469018218063203951879416206141968409186036337745147089339198
exchangeAddress        0x48bacb9266a570d521063ef5dd96e61686dbe788
feeRecipientAddress    0x0000000000000000000000000000000000000000
expirationTimeSeconds  1544608246
total: 3

Transaction
┌───────────┬────────────────────────────────────────────────────────────────────┐
│ fillOrder │ 0x3caf9dfa3a9ff3d0a60c1a2ebbe47b9fc875bc85ed046f49df8d3e0270881fee │
├───────────┼────────────────────────────────────────────────────────────────────┤
│ orderHash │ 0x7e9fdb6d17627ee8129018ee1c2cdd3c4bf513b11f3abab60829bb2227263cfb │
├───────────┼────────────────────────────────────────────────────────────────────┤
│ gasUsed   │ 126748                                                             │
├───────────┼────────────────────────────────────────────────────────────────────┤
│ status    │ Success                                                            │
└───────────┴────────────────────────────────────────────────────────────────────┘

Logs
Fill
contract                0x48bacb9266a570d521063ef5dd96e61686dbe788
makerAddress            0x5409ed021d9299bf6814279a6a1411a7e866a631
feeRecipientAddress     0x0000000000000000000000000000000000000000
takerAddress            0x6ecbe1db9ef729cbe972c83fb886247691fb6beb
senderAddress           0x6ecbe1db9ef729cbe972c83fb886247691fb6beb
makerAssetFilledAmount  5000000000000000000
takerAssetFilledAmount  100000000000000000
makerFeePaid            0
takerFeePaid            0
orderHash               0x7e9fdb6d17627ee8129018ee1c2cdd3c4bf513b11f3abab60829bb2227263cfb
makerAssetData          0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c
takerAssetData          0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082
Transfer
contract  0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c
_from     0x5409ed021d9299bf6814279a6a1411a7e866a631
_to       0x6ecbe1db9ef729cbe972c83fb886247691fb6beb
_value    5000000000000000000
Transfer
contract  0x0b1ba0af832d7c05fd64161e0db78e85978e8082
_from     0x6ecbe1db9ef729cbe972c83fb886247691fb6beb
_to       0x5409ed021d9299bf6814279a6a1411a7e866a631
_value    100000000000000000

Balances
Token  Maker                  Taker
WETH   2.8                    2.8
ZRX    999994870              5129.999999999999996999
ETH    99.962146759975432942  94.25546516

MEMO

  • Maker [1番目のアドレス : 0x5409ed021d9299bf6814279a6a1411a7e866a631] は、保有する ZRX のうち 5ZRX を 0.1 WETH と交換する注文を出す
  • Relayer API で OrderBook に Order を記載する
  • Relayer API で OrderBook から Order を取得する
  • Taker [2番目のアドレス : 0x6ecbe1db9ef729cbe972c83fb886247691fb6beb] は、その注文に応じる
  • Taker が支払う WETH は ETH から自動的に変換される
  • OrderBook に記録した Order を改めて取得して Fill している

Standard Relayer API で OrderBook を取得してみる

・SRA Server から現在の OrderBook を取得します

$ curl "http://localhost:3000/v2/orderbook?baseAssetData=0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c&quoteAssetData=0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082&networkId=50&page=0&perPage=10"

OUTPUT

"bids": {
    "total": 0,
    "page": 0,
    "perPage": 20,
    "records": [
    ]
},
"asks": {
    "total": 1,
    "page": 0,
    "perPage": 20,
    "records": [
    {
        "metaData": {
        },
        "order": {
            "signature": "0x1c9a83043395bb1c4ddea098c38696e47c5c612283bc08be4c7050c20ca021b37a674053375e51e52427c97316ef4bf6fa8372018d6827421b45896c9a89c2299a03",
            "senderAddress": "0x0000000000000000000000000000000000000000",
            "makerAddress": "0x5409ed021d9299bf6814279a6a1411a7e866a631",
            "takerAddress": "0x0000000000000000000000000000000000000000",
            "makerFee": "0",
            "takerFee": "0",
            "makerAssetAmount": "5000000000000000000",
            "takerAssetAmount": "100000000000000000",
            "makerAssetData": "0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c",
            "takerAssetData": "0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082",
            "salt": "70963124904396667469018218063203951879416206141968409186036337745147089339198",
            "exchangeAddress": "0x48bacb9266a570d521063ef5dd96e61686dbe788",
            "feeRecipientAddress": "0x0000000000000000000000000000000000000000",
            "expirationTimeSeconds": "1544608246"
        }
    }
    ]
}

}

MEMO

・下記のパラメータを設定して取得します

  • [ baseAssetData ]: makerAssetData or takerAssetData (required)
  • [ quoteAssetData ]: makerAssetData or takerAssetData (required)
  • [ networkId ] : The id of the Ethereum network
  • [ page ] : The number of the page to request in the collection.
  • [ perPage ] : The number of records to return per page.

次回

0x Protocol の内部データなどを記載してみます