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

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

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

0x Project0x-starter-project を動かして、ERC721 Token の交換と、簡易 SRA Server 経由での ERC20 Token の交換をしてみました


【実行環境】

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

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

ERC721 Token を交換してみる

・ERC721 を交換するサンプルコードを実行します

$ yarn scenario:fill_order_erc721

OUTPUT

┌───────────────────┐
│ Fill Order ERC721 │
└───────────────────┘
Accounts
Maker     0x5409ed021d9299bf6814279a6a1411a7e866a631
Taker     0x6ecbe1db9ef729cbe972c83fb886247691fb6beb
Setup
Mint ERC721            0x8ecca7de7f144ca8904709c06caadec336f6f6239f5939e6d720f7ee31a22fe0
Maker ERC721 Approval  0xe93e8ab926bb9a258110d40641b3617f2adbcd77c4921c8d4fcaf01b134f1ef1
Taker WETH Approval    0x77d87ef9f40f8b608a8523e2636e58fb5b653124999046c18a03178f1cc678ac
Taker WETH Deposit     0x38dd01dd63693d6597d195d7ade16bac246deddabc4f87a62ef990d29b1fac33
Order
exchangeAddress        0x48bacb9266a570d521063ef5dd96e61686dbe788
makerAddress           0x5409ed021d9299bf6814279a6a1411a7e866a631
takerAddress           0x0000000000000000000000000000000000000000
senderAddress          0x0000000000000000000000000000000000000000
feeRecipientAddress    0x0000000000000000000000000000000000000000
expirationTimeSeconds  1544517649
salt                   86897125715016729323809817249714603914809837773875332756599276383665623116699
makerAssetAmount       1
takerAssetAmount       100000000000000000
makerAssetData         0x02571792000000000000000000000000131855dda0aaff096f6854854c55a4debf61077a5b661cc3d4a50abc2887d9bb6a532a183ce1fe87838ad7a2e302e58ca7e04238
takerAssetData         0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082
makerFee               0
takerFee               0

Allowances
Token  Maker  Taker
WETH   0      MAX_UINT

Balances
Token  Maker                  Taker
WETH   0.1                    0.1
ETH    99.996786679975432942  99.79384832

ERC721 Owner
Token   Maker            Taker
ERC721      ____
        .X +.    .
        .Xx + -.     .
        XXx++ -..
        XXxx++--..
        XXXxx+++--
        XXXxxx'
            ""

Transaction
┌───────────┬────────────────────────────────────────────────────────────────────┐
│ fillOrder │ 0x99971511b586d00e8e533a6a1b170d64af79204af9cf471328653b703244f1c0 │
├───────────┼────────────────────────────────────────────────────────────────────┤
│ orderHash │ 0x138f8c01330b9ad8a2182edf0f5ee86ee3b9a41ee5a81926335d0c02644713f9 │
├───────────┼────────────────────────────────────────────────────────────────────┤
│ gasUsed   │ 119914                                                             │
├───────────┼────────────────────────────────────────────────────────────────────┤
│ status    │ Success                                                            │
└───────────┴────────────────────────────────────────────────────────────────────┘

Logs
Fill
contract                0x48bacb9266a570d521063ef5dd96e61686dbe788
makerAddress            0x5409ed021d9299bf6814279a6a1411a7e866a631
feeRecipientAddress     0x0000000000000000000000000000000000000000
takerAddress            0x6ecbe1db9ef729cbe972c83fb886247691fb6beb
senderAddress           0x6ecbe1db9ef729cbe972c83fb886247691fb6beb
makerAssetFilledAmount  1
takerAssetFilledAmount  100000000000000000
makerFeePaid            0
takerFeePaid            0
orderHash               0x138f8c01330b9ad8a2182edf0f5ee86ee3b9a41ee5a81926335d0c02644713f9
makerAssetData          0x02571792000000000000000000000000131855dda0aaff096f6854854c55a4debf61077a5b661cc3d4a50abc2887d9bb6a532a183ce1fe87838ad7a2e302e58ca7e04238
takerAssetData          0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082
Transfer
contract  0x131855dda0aaff096f6854854c55a4debf61077a
_from     0x5409ed021d9299bf6814279a6a1411a7e866a631
_to       0x6ecbe1db9ef729cbe972c83fb886247691fb6beb
_tokenId  41340886150166046920943804267938142171652…
Transfer
contract  0x0b1ba0af832d7c05fd64161e0db78e85978e8082
_from     0x6ecbe1db9ef729cbe972c83fb886247691fb6beb
_to       0x5409ed021d9299bf6814279a6a1411a7e866a631
_value    100000000000000000

Balances
Token  Maker                  Taker
WETH   0.2                    0
ETH    99.996786679975432942  99.79145004

ERC721 Owner
Token   Maker  Taker
ERC721             ____
                .X +.    .
                .Xx + -.     .
                XXx++ -..
                XXxx++--..
                XXXxx+++--
                XXXxxx'
                    ""

MEMO

  • Maker [1番目のアドレス : 0x5409ed021d9299bf6814279a6a1411a7e866a631] は、保有する ERC721 Token を 0.1 WETH と交換する注文を出す
  • Taker [2番目のアドレス : 0x6ecbe1db9ef729cbe972c83fb886247691fb6beb] は、その注文に応じる
  • Taker が支払う WETH は ETH から自動的に変換される
  • ここでは OrderBook には記録せず、作成した Order をそのまま Fill している

簡易的な SRA Server を起動する

・Project 内にある SRA Server を起動して簡易的な Standard Relayer API を用意します

※ エラー回避のため takerFee を ZERO に変更します

[ ./src/sra_server.ts ]

/**
* POST Order config endpoint retrives the values for order fields that the relayer requires.
* http://sra-spec.s3-website-us-east-1.amazonaws.com/#operation/getOrderConfig
*/
app.post('/v2/order_config', (req, res) => {

    const orderConfigResponse = {

        - takerFee: '1000',
        + takerFee: ZERO,

・別のコンソールで立ち上げます

$ yarn fake_sra_server

OUTPUT

Standard relayer API (HTTP) listening on port 3000!

MEMO

  • 簡易 SRA Server として下記 API のみ実装されている
    • GET /v2/orderbook
    • POST /v2/order_config
    • POST /v2/order

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

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

$ yarn scenario:fill_order_sra

OUTPUT

┌─────────────────────────────────┐
│ Fill Order Standard Relayer API │
└─────────────────────────────────┘
Accounts
Maker     0x5409ed021d9299bf6814279a6a1411a7e866a631
Taker     0x6ecbe1db9ef729cbe972c83fb886247691fb6beb
Setup
Maker ZRX Approval   0xa56c3433ad0830ae3efbce8bcc284fc4ad2d3fd527ff52eb35740b7b1245df9d
Taker WETH Approval  0xc32c80441adc1e4230625d091215d91bd3477e6caefcb2fd129bca7832ee9780
Taker WETH Deposit   0x98e16f2762fdb6cfb710f83973b1bb82ca892bd2378d6df6644b266e7f2e6a32
Order
salt                   80167822647990992553704119020013790808720653296643946480884896932573344197013
exchangeAddress        0x48bacb9266a570d521063ef5dd96e61686dbe788
makerAddress           0x5409ed021d9299bf6814279a6a1411a7e866a631
takerAddress           0x0000000000000000000000000000000000000000
expirationTimeSeconds  1544607265
makerAssetAmount       5000000000000000000
takerAssetAmount       100000000000000000
makerAssetData         0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c
takerAssetData         0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082
senderAddress          0x0000000000000000000000000000000000000000
feeRecipientAddress    0x0000000000000000000000000000000000000000
makerFee               0
takerFee               0
signature              0x1bb61c5abdd1b8ee24f35cad48d35e3bbd2249fadc666e8a8f5f823fee98d669c5284ccab498f1bf6b3e1e98b04a6c7063a929bb6c56b2311d559e6dd59f1abe7003
total: 1

Transaction
┌───────────┬────────────────────────────────────────────────────────────────────┐
│ fillOrder │ 0xe25e068d9934e891d41f21400bbd27853bb0bbd59a5a7b02fdd326755c64d241 │
├───────────┼────────────────────────────────────────────────────────────────────┤
│ orderHash │ 0xebe528b56a30ef519c7d7693ed3a89965db403aa3cc682d514cab8948f658ab0 │
├───────────┼────────────────────────────────────────────────────────────────────┤
│ gasUsed   │ 126812                                                             │
├───────────┼────────────────────────────────────────────────────────────────────┤
│ status    │ Success                                                            │
└───────────┴────────────────────────────────────────────────────────────────────┘

Logs
Fill
contract                0x48bacb9266a570d521063ef5dd96e61686dbe788
makerAddress            0x5409ed021d9299bf6814279a6a1411a7e866a631
feeRecipientAddress     0x0000000000000000000000000000000000000000
takerAddress            0x6ecbe1db9ef729cbe972c83fb886247691fb6beb
senderAddress           0x6ecbe1db9ef729cbe972c83fb886247691fb6beb
makerAssetFilledAmount  5000000000000000000
takerAssetFilledAmount  100000000000000000
makerFeePaid            0
takerFeePaid            0
orderHash               0xebe528b56a30ef519c7d7693ed3a89965db403aa3cc682d514cab8948f658ab0
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.7                    2.8
ZRX    999994875              5124.999999999999996999
ETH    99.962788239975432942  94.35920784

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 している

次回

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