12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

自作のERC721TokenをOpenSeaに対応させる

Last updated at Posted at 2018-12-19

#はじめに
自作のアイテムを市場でトレードしたい場合、いわゆる「板」と言われる売買機能を作る必要がありますが、
サービス自体のアプリケーションを作ることに加えて、取引の機能をつくるのはとても大変です。
また他のゲームなどと交換やトレードを行うためには、加えて、他のゲームのアイテム情報などを取り込む必要があります。
OpenSeaを使うと、自作のERC721トークンを売買することができるようになります。今回は自作のアイテムをOpenSeaで取り扱い始めるまでの覚え書きです。

#ドキュメント
基本的な使い方は下記のドキュメントを参照してください。
https://docs.opensea.io/docs/1-structuring-your-smart-contract

#手順

##1.token用のjsonのendpointを用意します.
下記のような形でjsonを用意します。
attributesなどの項目は、OpenSea上に表示するパラメーターで、
表示方法はdisplay_typeなどで変えることができます。
(
この辺りのお作法は本家の開発ガイドを参照ください
https://docs.opensea.io/docs/2-adding-metadata
)

app.get('/opensea/tokens/:id', function (req, res) {
    res.json(
{
    "attributes": [{
        "trait_type": "base",
        "value": "A"
    }, {
        "trait_type": "rarity",
        "value": 5
    }, {
        "display_type": "resouce_number",
        "value": 10
    }, {
        "display_type": "resouce_percentage",
        "value": 5
    }, {
        "display_type": "number",
        "trait_type": "generation",
        "value": 1
    }],
    "description": "find new planet",
    "external_url": "http://planettravelers.net/planets/1",
    "image": "http://planettravelers.net/planet_img_001.png",
    "name": "CAB3X"
}
);
});

##2.ERC721のコントラクトを用意し、baseTokenURI()で1のendpointを返すように設定します。

pragma solidity ^0.4.24;

//import 'openzeppelin-solidity/contracts/token/ERC721/ERC721Token.sol';
//import 'openzeppelin-solidity/contracts/ownership/Ownable.sol';

import "./ERC721Token.sol";
import "./Ownable.sol";
import "./Strings.sol";

/**
 * @title Creature
 * OpenSea Creature - a contract for a non-fungible creature.
 */
contract PlanetToken is ERC721Token, Ownable {
  address proxyRegistryAddress;

  constructor(address _proxyRegistryAddress) ERC721Token("PlanetToken", "PLT") public {
    proxyRegistryAddress = _proxyRegistryAddress;
  }

  function mint(address _to, uint256 _tokenId) public {
    super._mint(_to, _tokenId);
  }

  /**
   * @dev Returns an URI for a given token ID
   */
  function tokenURI(uint256 _tokenId) public view returns (string) {
    return Strings.strConcat(
        baseTokenURI(),
        Strings.uint2str(_tokenId)
    );
  }
  
  function baseTokenURI() public view returns (string) {
    return "http://planettravelers.net/opensea/tokens/";
  }

  /**
   * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
   */
  function isApprovedForAll(
    address owner,
    address operator
  )
    public
    view
    returns (bool)
  {
    // Whitelist OpenSea proxy contract for easy trading.
    ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
    if (proxyRegistry.proxies(owner) == operator) {
        return true;
    }

    return super.isApprovedForAll(owner, operator);
  }
}

contract OwnableDelegateProxy { }

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

##2-2proxyRegistryAddressとは

https://docs.opensea.io/discuss/5d4a942564beec007431f1af
引用:

It depends on the network you're deploying to. It's 0xf57b2c51ded3a29e6891aba85459d600256cf317 on Rinkeby and 0xa5409ec958c83c3f309868babaca7c86dcb077c1 on mainnet. See https://github.com/ProjectOpenSea/opensea-creatures/blob/master/migrations/2_deploy_contracts.js#L7-L12 for an example of conditionally setting the proxy registry address.

#3.mintしてコインを作成します。
スクリーンショット 2018-12-17 18.49.17.png

#4.アクセスする

https://rinkeby.opensea.io/assets/contract_address/token_id
(例)https://rinkeby.opensea.io/assets/0x9368672605133f7841024defa8c67295b236b62b/3
cacheを消す場合は、?force_update=trueをつける
他のsample https://docs.opensea.io/reference#retrieving-bundles

スクリーンショット 2018-12-17 18.36.05.png スクリーンショット 2018-12-17 18.36.16.png

#5.売買を試してみる

FixedPrice,Auction,Bundleの中から販売方法を選択することができます。

スクリーンショット 2018-12-17 18.41.59.png

#6.storeのtopを作成する
アイテムが属するサービスのtop画面を用意することができます。
作成方法は、tokenが管理されているcontractを入力し、topに表示される画像を設定するだけで作成できます。

Create画面
https://rinkeby.opensea.io/get-listed/step-two

説明
https://docs.opensea.io/docs/4-backfilling-items

#7.雛形を使ってとりあえず試したい場合の最短手順..

//nodeのversionを決める
$ nodebrew use v9.11.1
$ git clone https://github.com/ProjectOpenSea/opensea-creatures 
$ cd opensea-creatures 

//open-zippelinをinstallする
$ npm install

//remixdを立ち上げ
$ remixd -s ./ --remix-ide https://remix.ethereum.org

//deployとmintを行う。
//mint時のproxyRegistoryAddressはこちらを参照(networkによって異なる)
//https://docs.opensea.io/discuss/5d4a942564beec007431f1af
deploy.TradeableERC721Token
"AAA","AAA","0xf57b2c51ded3a29e6891aba85459d600256cf317"

//openseaを開く
https://rinkeby.opensea.io/assets/コントラクトのアドレス/1?force_update=true

12
10
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?