Skip to content

Commit

Permalink
Switched to ethers.js
Browse files Browse the repository at this point in the history
  • Loading branch information
kenerwin88 committed Oct 31, 2021
1 parent 9bbc021 commit 6b25e43
Show file tree
Hide file tree
Showing 5 changed files with 857 additions and 3,806 deletions.
31 changes: 22 additions & 9 deletions backend/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
# Builder Image
FROM node:16 AS build-env
FROM node:17-alpine AS build-env
COPY package.json /app/package.json
COPY /utils /app/utils
COPY /abi /app/abi

WORKDIR /app
RUN yarn install --frozen-lockfile

FROM node:slim

# Variables
ARG WEB3_URL
ARG CONTRACT_ADDRESS
Expand All @@ -17,9 +12,27 @@ ENV WEB3_URL ${WEB3_URL}}
ENV CONTRACT_ADDRESS ${CONTRACT_ADDRESS}}
ENV CONTRACT_WRAPPER_ADDRESS ${CONTRACT_WRAPPER_ADDRESS}}

COPY --from=build-env /app /app
COPY server.js /app/server.js
RUN mkdir -p /app/cache
# add libraries needed to build canvas
RUN apk add --no-cache \
build-base \
g++ \
libpng \
libpng-dev \
jpeg-dev \
pango-dev \
cairo-dev \
giflib-dev \
python3

WORKDIR /app
RUN mkdir -p /app/cache
RUN npm install canvas
RUN yarn install --frozen-lockfile

COPY server.js /app/server.js

EXPOSE 3001
CMD ["server.js"]



10 changes: 5 additions & 5 deletions backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"version": "1.0.0",
"description": "",
"main": "server.js",
"type": "module",
"scripts": {
"start": "node server.js",
"prod": "NODE_ENV=production node server.js",
Expand All @@ -12,20 +13,19 @@
"author": "",
"license": "ISC",
"dependencies": {
"api": "^3.3.1",
"aws-sdk": "^2.993.0",
"aws-sdk": "^2.1018.0",
"bignumber.js": "^9.0.1",
"canvas": "^2.8.0",
"compression": "^1.7.4",
"cors": "^2.8.5",
"dotenv": "^10.0.0",
"ethers": "^5.5.1",
"express": "^4.17.1",
"graceful-fs": "^4.2.8",
"jimp": "^0.16.1",
"joi": "^17.4.2",
"node-base91": "^0.3.4",
"node-fetch": "^2.6.1",
"pako": "^2.0.4",
"web3": "^1.6.0"
"node-fetch": "^3.0.0",
"pako": "^2.0.4"
}
}
135 changes: 55 additions & 80 deletions backend/server.js
Original file line number Diff line number Diff line change
@@ -1,24 +1,26 @@
const express = require('express');
const Web3 = require('web3');
const cors = require('cors');
const compression = require('compression');
const fetch = require('node-fetch');
const fs = require('graceful-fs');
const path = require('path');
const cache = require("./utils/cache");
const Jimp = require('jimp');
const BigNumber = require('bignumber.js');
const AWS = require('aws-sdk');
const { createCanvas } = require('canvas')
const base91 = require('node-base91');
const pako = require('pako');

import express from 'express';
import ethers from 'ethers';
import cors from 'cors';
import compression from 'compression';
import fetch from 'node-fetch';
import fs from 'graceful-fs';
import path from 'path';
import Jimp from 'jimp';
import BigNumber from 'bignumber.js';
import AWS from 'aws-sdk';
import pkg from 'canvas';
const { createCanvas, loadImage } = pkg;
import base91 from 'node-base91';
import pako from 'pako';
import joi from "joi";
import * as cache from "./utils/cache.js";

const __dirname = path.resolve();
const app = express()
const port = 3001

// Environment Variable validation
require('dotenv').config();
const joi = require("joi");
import { config } from 'dotenv';
const envVarsSchema = joi
.object()
.keys({
Expand All @@ -43,14 +45,21 @@ if (error) {
app.use(cors());
app.use(compression());

let abi = require("./abi/pixelabi.json");
let abi_wrapper = require("./abi/wrapperpixelabi.json");
const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS;
const CONTRACT_WRAPPER_ADDRESS = process.env.CONTRACT_WRAPPER_ADDRESS;

let web3 = new Web3(envVars.WEB3_URL);
let contract = new web3.eth.Contract(abi, CONTRACT_ADDRESS);
let contract_wrapper = new web3.eth.Contract(abi_wrapper, CONTRACT_WRAPPER_ADDRESS);
import { readFile } from 'fs/promises';
const abi = JSON.parse(
await readFile(
new URL('./abi/pixelabi.json', import.meta.url)
)
);
const abi_wrapper = JSON.parse(
await readFile(
new URL('./abi/wrapperpixelabi.json', import.meta.url)
)
);

const provider = new ethers.providers.WebSocketProvider(envVars.WEB3_URL, "mainnet");
const contract = new ethers.Contract(envVars.CONTRACT_ADDRESS, abi, provider);
const contract_wrapper = new ethers.Contract(envVars.CONTRACT_WRAPPER_ADDRESS, abi_wrapper, provider);

// AWS
const BUCKET_NAME = process.env.AWS_BUCKET_NAME
Expand All @@ -75,7 +84,7 @@ let openseaPriceInterval;


app.get("/openseafloor", async(req, res) => {
fetch(`https://api.opensea.io/api/v1/events?asset_contract_address=${CONTRACT_WRAPPER_ADDRESS}&event_type=successful&only_opensea=false&offset=0&limit=20`).then(res => res.json())
fetch(`https://api.opensea.io/api/v1/events?asset_contract_address=${envVars.CONTRACT_WRAPPER_ADDRESS}&event_type=successful&only_opensea=false&offset=0&limit=20`).then(res => res.json())
.then((json) => {
// do something with JSON

Expand Down Expand Up @@ -152,22 +161,27 @@ app.get('/tilemap', (req, res) => {
});

async function tileProcessor( tile, index ) {
let owner = tile[0].toLowerCase();
let image = tile[1];
let url = tile[2];
let price = tile[3];
let owner = tile.owner.toLowerCase();
let image = tile.image;
let url = tile.url;
let price = ethers.utils.formatEther(tile.price);
let wrapped = false;


await updateTileMetaAndImage(tile,index)

let wrapper_tile;
if (owner === CONTRACT_WRAPPER_ADDRESS) {
if (owner === envVars.CONTRACT_WRAPPER_ADDRESS) {
wrapped = true;
wrapper_tile = await contract_wrapper.methods.ownerOf(index).call();
wrapper_tile = await contract_wrapper.ownerOf(index);
owner = wrapper_tile
}

let ensName = await provider.lookupAddress(owner);
if (ensName != null) {
owner = ensName
}

price = new BigNumber(price);
price = price.toFixed(0); //remove decimals and exp notation

Expand Down Expand Up @@ -200,7 +214,7 @@ async function getOpenseaPrices() {
console.log(`Opensea update offset: ${id}`);

let params = {
"asset_contract_address": CONTRACT_WRAPPER_ADDRESS,
"asset_contract_address": envVars.CONTRACT_WRAPPER_ADDRESS,
"side": 1, //sell side
"include_bundled": false,
"include_invalid": false,
Expand Down Expand Up @@ -241,61 +255,22 @@ async function getOpenseaPrices() {
}
}

contract.events.TileUpdated(async (x,y) => {
console.log("Received Updated Tile!")
if(y.returnValues && y.returnValues[0]) {
let tileId = parseInt(y.returnValues["location"]);

await contract.methods.getTile(tileId).call().then(async (tile) => {
await tileProcessor(tile, tileId);
cache.updateCache(tiles);
})
}
});

contract_wrapper.events.Transfer(async (x,y) => {
console.log("Tile Transferred!")
if(y.returnValues && y.returnValues[0]) {

let tileId = parseInt(y.returnValues["tokenId"]);

await contract.methods.getTile(tileId).call().then(async (tile) => {

// Change owner because of wrapper
tile[0] = y.returnValues["to"];

await tileProcessor(tile, tileId);
cache.updateCache(tiles);
})
}
});

async function updateData(){
if( runningContractUpdate === true ) return;
let tenMinutesAgo = Date.now() - (10 * 60000)
runningContractUpdate = true;

for(let i = 0; i <= 3969; i++){
if (tiles[i].lastUpdated !== "" && tiles[i].lastUpdated >= tenMinutesAgo) {
console.log("Tile: " + i + " was updated in the last 10 minutes, skipping!")
}
else {
try {
let tile = await contract.methods.getTile(i).call();
console.log('Progress: .' + i + '.\r');

await tileProcessor(tile, i);
cache.updateCache(tiles);
try {
let tile = await contract.tiles(i);
console.log('Progress: .' + i + '.\r');

} catch (e) {
console.log(e);
//console.log("ERR")
await tileProcessor(tile, i);
cache.updateCache(tiles);

web3 = new Web3(envVars.WEB3_URL);
contract = new web3.eth.Contract(abi, CONTRACT_ADDRESS);
contract_wrapper = new web3.eth.Contract(abi_wrapper, CONTRACT_WRAPPER_ADDRESS);
i--;
}
} catch (e) {
console.log(e);
i--;
}
}

Expand Down
12 changes: 5 additions & 7 deletions backend/utils/cache.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
const fs = require('graceful-fs');
import fs from 'graceful-fs';
const cache_path = './cache/tiles.json';

//Cache preparation
function loadCache() {
export function loadCache() {
let results = [];

try {
Expand All @@ -23,7 +23,7 @@ function loadCache() {
return results;
}

function resetCache() {
export function resetCache() {
let data = [];

for( let i = 0; i <= 3969; i++ ) {
Expand All @@ -50,7 +50,7 @@ function resetCache() {
return data;
}

function updateCache(tiles) {
export function updateCache(tiles) {
let parsed = JSON.stringify(tiles, null, 2);

try {
Expand All @@ -60,8 +60,6 @@ function updateCache(tiles) {
}
}

function cachePath() {
export function cachePath() {
return cache_path;
}

module.exports = { loadCache, resetCache, updateCache, cachePath };
Loading

0 comments on commit 6b25e43

Please sign in to comment.