• This repository has been archived on 15/Sep/2022
  • Stars
    star
    1,175
  • Rank 38,486 (Top 0.8 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created about 6 years ago
  • Updated almost 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Example non-fungible collectible, to demonstrate OpenSea integration

OpenSea Creatures - Starter ERC721, ERC1155, and factory contracts

What's included:

Sample ERC721/ERC1155 Contracts

This includes a very simple sample ERC721 / ERC1155 for the purposes of demonstrating integration with the OpenSea marketplace. We include a script for minting the items.

Additionally, this contract whitelists the proxy accounts of OpenSea users so that they are automatically able to trade the ERC721 item on OpenSea (without having to pay gas for an additional approval). On OpenSea, each user has a "proxy" account that they control, and is ultimately called by the exchange contracts to trade their items. (Note that this addition does not mean that OpenSea itself has access to the items, simply that the users can list them more easily if they wish to do so)

Factory Contracts

In addition to these template 721/1155 contracts, we provide sample factory contracts for running gas-free presales of items that haven't been minted yet. See https://docs.opensea.io/docs/opensea-initial-item-sale-tutorial for more info.

Requirements

Node version

Either make sure you're running a version of node compliant with the engines requirement in package.json, or install Node Version Manager nvm and run nvm use to use the correct version of node.

Installation

Run

yarn

If you run into an error while building the dependencies and you're on a Mac, run the code below, remove your node_modules folder, and do a fresh yarn install:

xcode-select --install # Install Command Line Tools if you haven't already.
sudo xcode-select --switch /Library/Developer/CommandLineTools # Enable command line tools
sudo npm explore npm -g -- npm install node-gyp@latest # Update node-gyp

Deploying

Deploying to the Rinkeby network.

  1. Add test fundings to your Rinkeby testnet node on https://faucet.rinkeby.io
  2. To access a Rinkeby testnet node, you'll need to sign up for Alchemy and get a free API key. Click "View Key" and then copy the part of the URL after v2/. a. You can use Infura if you want as well. Just change ALCHEMY_KEY below to INFURA_KEY.
  3. Using your API key and the mnemonic for your Metamask wallet (make sure you're using a Metamask seed phrase that you're comfortable using for testing purposes), run:
export ALCHEMY_KEY="<your_alchemy_project_id>"
export MNEMONIC="<metmask_mnemonic>"
export DEPLOY_CREATURES_SALE=0 
yarn truffle deploy --network rinkeby

Minting tokens.

After deploying to the Rinkeby network, there will be a contract on Rinkeby that will be viewable on Rinkeby Etherscan. For example, here is a recently deployed contract. You should set this contract address and the address of your Metamask account as environment variables when running the minting script. If a CreatureFactory was deployed, which the sample deploy steps above do, you'll need to specify its address below as it will be the owner on the NFT contract, and only it will have mint permissions. In that case, you won't need NFT_CONTRACT_ADDRESS, as all we need is the contract with mint permissions here.

export OWNER_ADDRESS="<my_address>"
export NFT_CONTRACT_ADDRESS="<deployed_contract_address>"
export FACTORY_CONTRACT_ADDRESS="<deployed_factory_contract_address>"
export NETWORK="rinkeby"
node scripts/mint.js

Diagnosing Common Issues

If you're running a modified version of sell.js and not getting expected behavior, check the following:

  • Is the expirationTime in future? If no, change it to a time in the future.

  • Is the expirationTime a fractional second? If yes, round the listing time to the nearest second.

  • Are the input addresses all strings? If no, convert them to strings.

  • Are the input addresses checksummed? You might need to use the checksummed version of the address.

  • Is your computer's internal clock accurate? If no, try enabling automatic clock adjustment locally or following this tutorial to update an Amazon EC2 instance.

  • Do you have any conflicts that result from globally installed node packages? If yes, try yarn remove -g truffle; yarn

  • Are you running a version of node compliant with the engines requirement in package.json? If no, try nvm use; rm -rf node_modules; yarn

About OpenSea Creature Accessories

This is a sample ERC-1155 contract for the purposes of demonstrating integration with the OpenSea marketplace for crypto collectibles. We also include:

  • A factory contract for making sell orders for unminted items (allowing for gas-free and mint-free presales).
  • A configurable lootbox contract for selling randomized collections of ERC-1155 items.

On top of the features from the OpenSea ERC721 sample contracts above, ERC1155

  • supports multiple creators per contract, where only the creator is able to mint more copies
  • supports pre-minted items for the lootbox to choose from

Configuring the Lootbox

Open CreatureAccessoryLootbox.sol

  1. Change Class to reflect your rarity levels.
  2. Change NUM_CLASSES to reflect how many classes you have (this gets used for sizing fixed-length arrays in Solidity)
  3. In constructor, set the OptionSettings for each of your classes. To do this, as in the example, call setOptionSettings with
    1. Your option id,
    2. The number of items to issue when the box is opened,
    3. An array of probabilities (basis points, so integers out of 10,000) of receiving each class. Should add up to 10k and be descending in value.
  4. Then follow the instructions below to deploy it! Purchases will auto-open the box. If you'd like to make lootboxes tradable by users (without a purchase auto-opening it), contact us at [email protected].

Why are some standard methods overridden?

This contract overrides the isApprovedForAll method in order to whitelist the proxy accounts of OpenSea users. This means that they are automatically able to trade your ERC-1155 items on OpenSea (without having to pay gas for an additional approval). On OpenSea, each user has a "proxy" account that they control, and is ultimately called by the exchange contracts to trade their items.

Note that this addition does not mean that OpenSea itself has access to the items, simply that the users can list them more easily if they wish to do so!

Requirements

Node version

Either make sure you're running a version of node compliant with the engines requirement in package.json, or install Node Version Manager nvm and run nvm use to use the correct version of node.

Installation

Run

yarn

Deploying

Deploying to the Rinkeby network.

  1. Follow the steps above to get a Rinkeby node API key
  2. Using your API key and the mnemonic for your MetaMask wallet (make sure you're using a MetaMask seed phrase that you're comfortable using for testing purposes), run:
export ALCHEMY_KEY="<alchemy_project_id>" # or you can use INFURA_KEY
export MNEMONIC="<metmask_mnemonic>"
DEPLOY_ACCESSORIES_SALE=1 yarn truffle migrate --network rinkeby

Deploying to the mainnet Ethereum network.

Make sure your wallet has at least a few dollars worth of ETH in it. Then run:

yarn truffle migrate --network live

Look for your newly deployed contract address in the logs! 🥳

Viewing your items on OpenSea

OpenSea will automatically pick up transfers on your contract. You can visit an asset by going to https://opensea.io/assets/CONTRACT_ADDRESS/TOKEN_ID.

To load all your metadata on your items at once, visit https://opensea.io/get-listed and enter your address to load the metadata into OpenSea! You can even do this for the Rinkeby test network if you deployed there, by going to https://rinkeby.opensea.io/get-listed.

Troubleshooting

It doesn't compile!

Install truffle locally: yarn add truffle. Then run yarn truffle migrate ....

You can also debug just the compile step by running yarn truffle compile.

It doesn't deploy anything!

This is often due to the truffle-hdwallet provider not being able to connect. Go to your Alchemy Dashboard (or infura.io) and create a new project. Use your "project ID" as your new ALCHEMY_KEY and make sure you export that command-line variable above.

ERC1155 Implementation

To implement the ERC1155 standard, these contracts use the Multi Token Standard by Horizon Games, available on npm and GitHub and also under the MIT License.

Running Local Tests

In one terminal window, run:

yarn run ganache-cli

Once Ganache has started, run the following in another terminal window:

yarn run test

More Repositories

1

opensea-js

TypeScript SDK for the OpenSea marketplace
TypeScript
2,265
star
2

seaport

Seaport is a marketplace protocol for safely and efficiently buying and selling NFTs.
Solidity
2,100
star
3

opensea-erc1155

Example semi-fungible collectible, to demonstrate OpenSea integration for an ERC-1155 contract
JavaScript
604
star
4

embeddable-nfts

Easily embed OpenSea listings in your website!
TypeScript
332
star
5

operator-filter-registry

Solidity
313
star
6

seadrop

Smart contracts for primary drops on EVM chains
Solidity
281
star
7

seaport-js

A TypeScript library to interface with the Seaport marketplace.
TypeScript
247
star
8

opensea-whitelabel

Easily whitelabel an OpenSea marketplace for your own website
TypeScript
226
star
9

metadata-api-nodejs

Sample metadata API for crypto collectibles, written in Node.js
JavaScript
193
star
10

stream-js

A TypeScript SDK to receive pushed updates from OpenSea over websocket.
TypeScript
166
star
11

seaport-gossip

A peer-to-peer network for sharing Seaport orders.
TypeScript
125
star
12

metadata-api-python

Simple API for serving ERC721 metadata
Python
116
star
13

nft-tutorial

A very basic NFT tutorial repository for absolute beginners in the world of Web3 and smart contracts
JavaScript
96
star
14

marketplace-benchmarks

A comparison supported features and respective gas overhead for NFT marketplaces
Solidity
70
star
15

meta-transactions

Solidity
49
star
16

seaport-order-validator

Seaport Order Validator provides a simple method for validating and diagnosing Seaport orders
Solidity
48
star
17

shipyard-core

Solidity
41
star
18

seaport-core

Core Seaport smart contracts
Solidity
39
star
19

SIPs

The Seaport Improvement Proposal repository
31
star
20

ethmoji-contracts

Ethmoji smart contracts
JavaScript
22
star
21

seaport.py

Python
21
star
22

ships-log

An example dapp listing recent auctions and bids on OpenSea, with the ability to buy items or accept offers right from the page.
JavaScript
20
star
23

seaport-sol

Solidity helpers for working with Seaport on and off-chain using Forge scripts
Solidity
20
star
24

ethmoji-js

SDK for Ethmoji blockchain avatars
JavaScript
19
star
25

seaport-1.6

A unified repo containing the core Seaport contracts, types, tools, and tests to facilitate Seaport 1.6 development
Solidity
19
star
26

opensea-stream-discord-webhook

A sample repo showing how a developer using the OpenSea Stream API might be able to connect a Discord webhook to send messages whenever new events occur for a collection
TypeScript
18
star
27

0x-fee-wrapper

Solidity
16
star
28

seaport-types

Standalone structs and interfaces related to Seaport
Solidity
12
star
29

redeemables

EVM smart contracts for redeemables and dynamic traits
Solidity
11
star
30

ethdenver-workshop

Devcon 5 workshop
JavaScript
10
star
31

shipyard

Template Repo for OpenSea smart contract development
Solidity
10
star
32

seaport-generic-adapter

A proof of concept Seaport app that enables fulfilling non-Seaport listings through Seaport.
Solidity
9
star
33

tstorish

Use TSTORE in contracts deployed to multiple chains with varying opcode support
Solidity
9
star
34

seaport-deploy

A utility for deploying Seaport to local chains for use in testing.
Solidity
8
star
35

ethmoji-js-demo

JavaScript
5
star
36

jellyfish

Build UIs as state machines using Compose.
Kotlin
4
star
37

seaport-hooks

A collection of various Seaport Hooks (zone hooks, contract hooks, and item hooks): https://docs.opensea.io/docs/seaport-hooks
1
star
38

vercel-repros

TypeScript
1
star