From b7fd8887d372a9fb2b05059a6af513782c1cbf84 Mon Sep 17 00:00:00 2001 From: NeoDashboard Date: Fri, 3 Feb 2023 14:51:32 +0100 Subject: [PATCH 1/6] Add GhostMarket adapter --- src/adapters/ghostmarket-avalanche/abi.json | 980 ++++++++++++++++++++ src/adapters/ghostmarket-avalanche/index.ts | 101 ++ src/adapters/ghostmarket-bsc/abi.json | 980 ++++++++++++++++++++ src/adapters/ghostmarket-bsc/index.ts | 102 ++ src/adapters/ghostmarket-ethereum/abi.json | 980 ++++++++++++++++++++ src/adapters/ghostmarket-ethereum/index.ts | 102 ++ src/adapters/ghostmarket-polygon/abi.json | 980 ++++++++++++++++++++ src/adapters/ghostmarket-polygon/index.ts | 102 ++ 8 files changed, 4327 insertions(+) create mode 100644 src/adapters/ghostmarket-avalanche/abi.json create mode 100644 src/adapters/ghostmarket-avalanche/index.ts create mode 100644 src/adapters/ghostmarket-bsc/abi.json create mode 100644 src/adapters/ghostmarket-bsc/index.ts create mode 100644 src/adapters/ghostmarket-ethereum/abi.json create mode 100644 src/adapters/ghostmarket-ethereum/index.ts create mode 100644 src/adapters/ghostmarket-polygon/abi.json create mode 100644 src/adapters/ghostmarket-polygon/index.ts diff --git a/src/adapters/ghostmarket-avalanche/abi.json b/src/adapters/ghostmarket-avalanche/abi.json new file mode 100644 index 0000000..c15e75e --- /dev/null +++ b/src/adapters/ghostmarket-avalanche/abi.json @@ -0,0 +1,980 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "indexed": false, + "internalType": "address", + "name": "matcher", + "type": "address" + } + ], + "name": "MatcherChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "makeAssetType", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "takeAssetType", + "type": "tuple" + } + ], + "name": "OrderCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "leftHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "rightHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "leftMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "rightMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newLeftFill", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newRightFill", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "leftAsset", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "rightAsset", + "type": "tuple" + } + ], + "name": "OrderFilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "indexed": false, + "internalType": "address", + "name": "proxy", + "type": "address" + } + ], + "name": "ProxyChange", + "type": "event" + }, + { + "inputs": [], + "name": "EMPTY", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_transferProxy", + "type": "address" + }, + { + "internalType": "address", + "name": "_erc20TransferProxy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "newProtocolFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "newDefaultFeeReceiver", + "type": "address" + }, + { + "internalType": "contract IRoyaltiesProvider", + "name": "newRoyaltiesProvider", + "type": "address" + } + ], + "name": "__ExchangeV2_init", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order[]", + "name": "orders", + "type": "tuple[]" + } + ], + "name": "bulkCancelOrders", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order", + "name": "order", + "type": "tuple" + } + ], + "name": "cancel", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "bidMaker", + "type": "address" + }, + { + "internalType": "uint256", + "name": "bidNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "nftAssetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "nftData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "bidPaymentAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "paymentToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "bidSalt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bidStart", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bidEnd", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "bidDataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "bidData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "bidSignature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "sellOrderPaymentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sellOrderNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "sellOrderData", + "type": "bytes" + } + ], + "internalType": "struct LibDirectTransfer.AcceptBid", + "name": "direct", + "type": "tuple" + } + ], + "name": "directAcceptBid", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "sellOrderMaker", + "type": "address" + }, + { + "internalType": "uint256", + "name": "sellOrderNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "nftAssetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "nftData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "sellOrderPaymentAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "paymentToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "sellOrderSalt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sellOrderStart", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sellOrderEnd", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "sellOrderDataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "sellOrderData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "sellOrderSignature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "buyOrderPaymentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "buyOrderNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "buyOrderData", + "type": "bytes" + } + ], + "internalType": "struct LibDirectTransfer.Purchase", + "name": "direct", + "type": "tuple" + } + ], + "name": "directPurchase", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "fills", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order", + "name": "orderLeft", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "signatureLeft", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order", + "name": "orderRight", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "signatureRight", + "type": "bytes" + } + ], + "name": "matchOrders", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "royaltiesRegistry", + "outputs": [ + { + "internalType": "contract IRoyaltiesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "internalType": "address", + "name": "matcher", + "type": "address" + } + ], + "name": "setAssetMatcher", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRoyaltiesProvider", + "name": "newRoyaltiesRegistry", + "type": "address" + } + ], + "name": "setRoyaltiesRegistry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "internalType": "address", + "name": "proxy", + "type": "address" + } + ], + "name": "setTransferProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] \ No newline at end of file diff --git a/src/adapters/ghostmarket-avalanche/index.ts b/src/adapters/ghostmarket-avalanche/index.ts new file mode 100644 index 0000000..5e82072 --- /dev/null +++ b/src/adapters/ghostmarket-avalanche/index.ts @@ -0,0 +1,101 @@ +import * as dotenv from "dotenv"; + +dotenv.config(); + +import BigNumber from "bignumber.js"; +import moment from "moment"; +import { EventData } from "web3-eth-contract"; +import path from "path"; +import priceSdk from "../../sdk/price"; +import Avalanche from "../../sdk/avalanche"; +import symbolSdk from "../../sdk/symbol"; +import { ISaleEntity, ISymbolAPIResponse } from "../../sdk/Interfaces"; + +class Element { + name: string; + token: string; + protocol: string; + block: number; + deprecatedAtBlock: number; + contract: string; + events: string[]; + pathToAbi: string; + range: number; + chunkSize: number; + sdk: any; + + constructor() { + this.name = "ghostmarket-avalanche"; + this.protocol = "avalanche"; + this.block = 15385077; + this.contract = "0xeb4aba7aeba732fc2fc92a673585d950ccfc1de0"; + this.events = ["OrderFilled"]; + this.pathToAbi = path.join(__dirname, "./abi.json"); + this.range = 500; + this.chunkSize = 6; + } + + run = async (): Promise => { + this.sdk = await this.loadSdk(); + + await this.sdk.run(); + }; + + loadSdk = (): any => { + return new Avalanche(this); + }; + + stop = async (): Promise => { + this.sdk.stop(); + }; + + _getToken = (event: EventData): string => { + let token = "avax"; + if (event.returnValues["rightAsset"]["data"] != "0x") { + token = event.returnValues["rightAsset"]["data"][0].toLowerCase(); + } + + return token; + }; + + process = async (event: EventData): Promise => { + const block = await this.sdk.getBlock(event.blockNumber); + const timestamp = moment.unix(block.timestamp).utc(); + const token = this._getToken(event); + const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); + const po = await priceSdk.get(token, this.protocol, block.timestamp); + const price = event.returnValues["newLeftFill"]; + const nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + const seller = event.returnValues["leftMaker"]; + const buyer = event.returnValues["rightMaker"]; + const nftContract = event.returnValues["leftAsset"]["data"][0]; + const tokenId = event.returnValues["leftAsset"]["data"][1]; + + const entity = { + providerName: this.name, + providerContract: this.contract, + protocol: this.protocol, + nftContract: nftContract.toLowerCase(), + nftId: tokenId, + token: token.toLowerCase(), + tokenSymbol: symbol?.symbol || "", + amount: 1, + price: nativePrice.toNumber(), + priceUsd: !symbol?.decimals ? null : nativePrice.multipliedBy(po.price).toNumber(), + seller: seller.toLowerCase(), + buyer: buyer.toLowerCase(), + soldAt: timestamp.format("YYYY-MM-DD HH:mm:ss"), + blockNumber: event.blockNumber, + transactionHash: event.transactionHash, + }; + + await this.addToDatabase(entity); + }; + + addToDatabase = async (entity: ISaleEntity): Promise => { + console.log(`creating sale for ${entity.nftContract} with id ${entity.nftId}`); + return entity; + }; +} + +export default Element; diff --git a/src/adapters/ghostmarket-bsc/abi.json b/src/adapters/ghostmarket-bsc/abi.json new file mode 100644 index 0000000..c15e75e --- /dev/null +++ b/src/adapters/ghostmarket-bsc/abi.json @@ -0,0 +1,980 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "indexed": false, + "internalType": "address", + "name": "matcher", + "type": "address" + } + ], + "name": "MatcherChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "makeAssetType", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "takeAssetType", + "type": "tuple" + } + ], + "name": "OrderCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "leftHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "rightHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "leftMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "rightMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newLeftFill", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newRightFill", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "leftAsset", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "rightAsset", + "type": "tuple" + } + ], + "name": "OrderFilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "indexed": false, + "internalType": "address", + "name": "proxy", + "type": "address" + } + ], + "name": "ProxyChange", + "type": "event" + }, + { + "inputs": [], + "name": "EMPTY", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_transferProxy", + "type": "address" + }, + { + "internalType": "address", + "name": "_erc20TransferProxy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "newProtocolFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "newDefaultFeeReceiver", + "type": "address" + }, + { + "internalType": "contract IRoyaltiesProvider", + "name": "newRoyaltiesProvider", + "type": "address" + } + ], + "name": "__ExchangeV2_init", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order[]", + "name": "orders", + "type": "tuple[]" + } + ], + "name": "bulkCancelOrders", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order", + "name": "order", + "type": "tuple" + } + ], + "name": "cancel", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "bidMaker", + "type": "address" + }, + { + "internalType": "uint256", + "name": "bidNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "nftAssetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "nftData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "bidPaymentAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "paymentToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "bidSalt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bidStart", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bidEnd", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "bidDataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "bidData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "bidSignature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "sellOrderPaymentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sellOrderNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "sellOrderData", + "type": "bytes" + } + ], + "internalType": "struct LibDirectTransfer.AcceptBid", + "name": "direct", + "type": "tuple" + } + ], + "name": "directAcceptBid", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "sellOrderMaker", + "type": "address" + }, + { + "internalType": "uint256", + "name": "sellOrderNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "nftAssetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "nftData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "sellOrderPaymentAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "paymentToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "sellOrderSalt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sellOrderStart", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sellOrderEnd", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "sellOrderDataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "sellOrderData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "sellOrderSignature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "buyOrderPaymentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "buyOrderNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "buyOrderData", + "type": "bytes" + } + ], + "internalType": "struct LibDirectTransfer.Purchase", + "name": "direct", + "type": "tuple" + } + ], + "name": "directPurchase", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "fills", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order", + "name": "orderLeft", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "signatureLeft", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order", + "name": "orderRight", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "signatureRight", + "type": "bytes" + } + ], + "name": "matchOrders", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "royaltiesRegistry", + "outputs": [ + { + "internalType": "contract IRoyaltiesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "internalType": "address", + "name": "matcher", + "type": "address" + } + ], + "name": "setAssetMatcher", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRoyaltiesProvider", + "name": "newRoyaltiesRegistry", + "type": "address" + } + ], + "name": "setRoyaltiesRegistry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "internalType": "address", + "name": "proxy", + "type": "address" + } + ], + "name": "setTransferProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] \ No newline at end of file diff --git a/src/adapters/ghostmarket-bsc/index.ts b/src/adapters/ghostmarket-bsc/index.ts new file mode 100644 index 0000000..1ba64e6 --- /dev/null +++ b/src/adapters/ghostmarket-bsc/index.ts @@ -0,0 +1,102 @@ +import * as dotenv from "dotenv"; + +dotenv.config(); + +import BigNumber from "bignumber.js"; +import moment from "moment"; +import { EventData } from "web3-eth-contract"; +import path from "path"; +import priceSdk from "../../sdk/price"; +import Binance from "../../sdk/binance"; +import symbolSdk from "../../sdk/symbol"; +import { ISaleEntity, ISymbolAPIResponse } from "../../sdk/Interfaces"; + +class Element { + name: string; + token: string; + protocol: string; + block: number; + deprecatedAtBlock: number; + contract: string; + events: string[]; + pathToAbi: string; + range: number; + chunkSize: number; + sdk: any; + + constructor() { + this.name = "ghostmarket-bsc"; + this.protocol = "binance-smart-chain"; + this.block = 18259152; + this.contract = "0x388171f81fc91efc7338e07e52555a90c7d87972"; + this.events = ["OrderFilled"]; + this.pathToAbi = path.join(__dirname, "./abi.json"); + this.range = 500; + this.chunkSize = 6; + } + + run = async (): Promise => { + this.sdk = await this.loadSdk(); + + await this.sdk.run(); + }; + + loadSdk = (): any => { + return new Binance(this); + }; + + stop = async (): Promise => { + this.sdk.stop(); + }; + + _getToken = (event: EventData): string => { + let token = "bnb"; + if (event.returnValues["rightAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); + } + + return token; + }; + + process = async (event: EventData): Promise => { + const block = await this.sdk.getBlock(event.blockNumber); + const timestamp = moment.unix(block.timestamp).utc(); + const token = this._getToken(event); + const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); + const po = await priceSdk.get(token, this.protocol, block.timestamp); + const price = event.returnValues["newLeftFill"]; + const nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + const seller = event.returnValues["leftMaker"]; + const buyer = event.returnValues["rightMaker"]; + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); + let nftContract = params[0]; + let tokenId = params[1]; + + const entity = { + providerName: this.name, + providerContract: this.contract, + protocol: this.protocol, + nftContract: nftContract.toLowerCase(), + nftId: tokenId, + token: token.toLowerCase(), + tokenSymbol: symbol?.symbol || "", + amount: 1, + price: nativePrice.toNumber(), + priceUsd: !symbol?.decimals ? null : nativePrice.multipliedBy(po.price).toNumber(), + seller: seller.toLowerCase(), + buyer: buyer.toLowerCase(), + soldAt: timestamp.format("YYYY-MM-DD HH:mm:ss"), + blockNumber: event.blockNumber, + transactionHash: event.transactionHash, + }; + + await this.addToDatabase(entity); + }; + + addToDatabase = async (entity: ISaleEntity): Promise => { + console.log(`creating sale for ${entity.nftContract} with id ${entity.nftId}`); + return entity; + }; +} + +export default Element; diff --git a/src/adapters/ghostmarket-ethereum/abi.json b/src/adapters/ghostmarket-ethereum/abi.json new file mode 100644 index 0000000..c15e75e --- /dev/null +++ b/src/adapters/ghostmarket-ethereum/abi.json @@ -0,0 +1,980 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "indexed": false, + "internalType": "address", + "name": "matcher", + "type": "address" + } + ], + "name": "MatcherChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "makeAssetType", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "takeAssetType", + "type": "tuple" + } + ], + "name": "OrderCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "leftHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "rightHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "leftMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "rightMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newLeftFill", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newRightFill", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "leftAsset", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "rightAsset", + "type": "tuple" + } + ], + "name": "OrderFilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "indexed": false, + "internalType": "address", + "name": "proxy", + "type": "address" + } + ], + "name": "ProxyChange", + "type": "event" + }, + { + "inputs": [], + "name": "EMPTY", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_transferProxy", + "type": "address" + }, + { + "internalType": "address", + "name": "_erc20TransferProxy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "newProtocolFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "newDefaultFeeReceiver", + "type": "address" + }, + { + "internalType": "contract IRoyaltiesProvider", + "name": "newRoyaltiesProvider", + "type": "address" + } + ], + "name": "__ExchangeV2_init", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order[]", + "name": "orders", + "type": "tuple[]" + } + ], + "name": "bulkCancelOrders", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order", + "name": "order", + "type": "tuple" + } + ], + "name": "cancel", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "bidMaker", + "type": "address" + }, + { + "internalType": "uint256", + "name": "bidNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "nftAssetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "nftData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "bidPaymentAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "paymentToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "bidSalt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bidStart", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bidEnd", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "bidDataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "bidData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "bidSignature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "sellOrderPaymentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sellOrderNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "sellOrderData", + "type": "bytes" + } + ], + "internalType": "struct LibDirectTransfer.AcceptBid", + "name": "direct", + "type": "tuple" + } + ], + "name": "directAcceptBid", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "sellOrderMaker", + "type": "address" + }, + { + "internalType": "uint256", + "name": "sellOrderNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "nftAssetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "nftData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "sellOrderPaymentAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "paymentToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "sellOrderSalt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sellOrderStart", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sellOrderEnd", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "sellOrderDataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "sellOrderData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "sellOrderSignature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "buyOrderPaymentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "buyOrderNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "buyOrderData", + "type": "bytes" + } + ], + "internalType": "struct LibDirectTransfer.Purchase", + "name": "direct", + "type": "tuple" + } + ], + "name": "directPurchase", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "fills", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order", + "name": "orderLeft", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "signatureLeft", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order", + "name": "orderRight", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "signatureRight", + "type": "bytes" + } + ], + "name": "matchOrders", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "royaltiesRegistry", + "outputs": [ + { + "internalType": "contract IRoyaltiesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "internalType": "address", + "name": "matcher", + "type": "address" + } + ], + "name": "setAssetMatcher", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRoyaltiesProvider", + "name": "newRoyaltiesRegistry", + "type": "address" + } + ], + "name": "setRoyaltiesRegistry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "internalType": "address", + "name": "proxy", + "type": "address" + } + ], + "name": "setTransferProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] \ No newline at end of file diff --git a/src/adapters/ghostmarket-ethereum/index.ts b/src/adapters/ghostmarket-ethereum/index.ts new file mode 100644 index 0000000..af92f59 --- /dev/null +++ b/src/adapters/ghostmarket-ethereum/index.ts @@ -0,0 +1,102 @@ +import * as dotenv from "dotenv"; + +dotenv.config(); + +import BigNumber from "bignumber.js"; +import moment from "moment"; +import { EventData } from "web3-eth-contract"; +import path from "path"; +import priceSdk from "../../sdk/price"; +import Ethereum from "../../sdk/EVMC"; +import symbolSdk from "../../sdk/symbol"; +import { ISaleEntity, ISymbolAPIResponse } from "../../sdk/Interfaces"; + +class Element { + name: string; + token: string; + protocol: string; + block: number; + deprecatedAtBlock: number; + contract: string; + events: string[]; + pathToAbi: string; + range: number; + chunkSize: number; + sdk: any; + + constructor() { + this.name = "ghostmarket-ethereum"; + this.protocol = "ethereum"; + this.block = 15080677; + this.contract = "0xfb2f452639cbb0850b46b20d24de7b0a9ccb665f"; + this.events = ["OrderFilled"]; + this.pathToAbi = path.join(__dirname, "./abi.json"); + this.range = 500; + this.chunkSize = 6; + } + + run = async (): Promise => { + this.sdk = await this.loadSdk(); + + await this.sdk.run(); + }; + + loadSdk = (): any => { + return new Ethereum(this); + }; + + stop = async (): Promise => { + this.sdk.stop(); + }; + + _getToken = (event: EventData): string => { + let token = "0x0000000000000000000000000000000000000000"; + if (event.returnValues["rightAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); + } + + return token; + }; + + process = async (event: EventData): Promise => { + const block = await this.sdk.getBlock(event.blockNumber); + const timestamp = moment.unix(block.timestamp).utc(); + const token = this._getToken(event); + const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); + const po = await priceSdk.get(token, this.protocol, block.timestamp); + const price = event.returnValues["newLeftFill"]; + const nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + const seller = event.returnValues["leftMaker"]; + const buyer = event.returnValues["rightMaker"]; + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); + let nftContract = params[0]; + let tokenId = params[1]; + + const entity = { + providerName: this.name, + providerContract: this.contract, + protocol: this.protocol, + nftContract: nftContract.toLowerCase(), + nftId: tokenId, + token: token.toLowerCase(), + tokenSymbol: symbol?.symbol || "", + amount: 1, + price: nativePrice.toNumber(), + priceUsd: !symbol?.decimals ? null : nativePrice.multipliedBy(po.price).toNumber(), + seller: seller.toLowerCase(), + buyer: buyer.toLowerCase(), + soldAt: timestamp.format("YYYY-MM-DD HH:mm:ss"), + blockNumber: event.blockNumber, + transactionHash: event.transactionHash, + }; + + await this.addToDatabase(entity); + }; + + addToDatabase = async (entity: ISaleEntity): Promise => { + console.log(`creating sale for ${entity.nftContract} with id ${entity.nftId}`); + return entity; + }; +} + +export default Element; diff --git a/src/adapters/ghostmarket-polygon/abi.json b/src/adapters/ghostmarket-polygon/abi.json new file mode 100644 index 0000000..c15e75e --- /dev/null +++ b/src/adapters/ghostmarket-polygon/abi.json @@ -0,0 +1,980 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "indexed": false, + "internalType": "address", + "name": "matcher", + "type": "address" + } + ], + "name": "MatcherChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "makeAssetType", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "takeAssetType", + "type": "tuple" + } + ], + "name": "OrderCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "leftHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "rightHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "leftMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "rightMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newLeftFill", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newRightFill", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "leftAsset", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "rightAsset", + "type": "tuple" + } + ], + "name": "OrderFilled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "indexed": false, + "internalType": "address", + "name": "proxy", + "type": "address" + } + ], + "name": "ProxyChange", + "type": "event" + }, + { + "inputs": [], + "name": "EMPTY", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_transferProxy", + "type": "address" + }, + { + "internalType": "address", + "name": "_erc20TransferProxy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "newProtocolFee", + "type": "uint256" + }, + { + "internalType": "address", + "name": "newDefaultFeeReceiver", + "type": "address" + }, + { + "internalType": "contract IRoyaltiesProvider", + "name": "newRoyaltiesProvider", + "type": "address" + } + ], + "name": "__ExchangeV2_init", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order[]", + "name": "orders", + "type": "tuple[]" + } + ], + "name": "bulkCancelOrders", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order", + "name": "order", + "type": "tuple" + } + ], + "name": "cancel", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "bidMaker", + "type": "address" + }, + { + "internalType": "uint256", + "name": "bidNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "nftAssetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "nftData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "bidPaymentAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "paymentToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "bidSalt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bidStart", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bidEnd", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "bidDataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "bidData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "bidSignature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "sellOrderPaymentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sellOrderNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "sellOrderData", + "type": "bytes" + } + ], + "internalType": "struct LibDirectTransfer.AcceptBid", + "name": "direct", + "type": "tuple" + } + ], + "name": "directAcceptBid", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "sellOrderMaker", + "type": "address" + }, + { + "internalType": "uint256", + "name": "sellOrderNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "nftAssetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "nftData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "sellOrderPaymentAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "paymentToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "sellOrderSalt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sellOrderStart", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sellOrderEnd", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "sellOrderDataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "sellOrderData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "sellOrderSignature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "buyOrderPaymentAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "buyOrderNftAmount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "buyOrderData", + "type": "bytes" + } + ], + "internalType": "struct LibDirectTransfer.Purchase", + "name": "direct", + "type": "tuple" + } + ], + "name": "directPurchase", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "fills", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order", + "name": "orderLeft", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "signatureLeft", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "address", + "name": "maker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "makeAsset", + "type": "tuple" + }, + { + "internalType": "address", + "name": "taker", + "type": "address" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibAsset.AssetType", + "name": "assetType", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct LibAsset.Asset", + "name": "takeAsset", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "bytes4", + "name": "dataType", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct LibOrder.Order", + "name": "orderRight", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "signatureRight", + "type": "bytes" + } + ], + "name": "matchOrders", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "royaltiesRegistry", + "outputs": [ + { + "internalType": "contract IRoyaltiesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "internalType": "address", + "name": "matcher", + "type": "address" + } + ], + "name": "setAssetMatcher", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRoyaltiesProvider", + "name": "newRoyaltiesRegistry", + "type": "address" + } + ], + "name": "setRoyaltiesRegistry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "assetType", + "type": "bytes4" + }, + { + "internalType": "address", + "name": "proxy", + "type": "address" + } + ], + "name": "setTransferProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] \ No newline at end of file diff --git a/src/adapters/ghostmarket-polygon/index.ts b/src/adapters/ghostmarket-polygon/index.ts new file mode 100644 index 0000000..4d22149 --- /dev/null +++ b/src/adapters/ghostmarket-polygon/index.ts @@ -0,0 +1,102 @@ +import * as dotenv from "dotenv"; + +dotenv.config(); + +import BigNumber from "bignumber.js"; +import moment from "moment"; +import { EventData } from "web3-eth-contract"; +import path from "path"; +import priceSdk from "../../sdk/price"; +import Matic from "../../sdk/matic"; +import symbolSdk from "../../sdk/symbol"; +import { ISaleEntity, ISymbolAPIResponse } from "../../sdk/Interfaces"; + +class Element { + name: string; + token: string; + protocol: string; + block: number; + deprecatedAtBlock: number; + contract: string; + events: string[]; + pathToAbi: string; + range: number; + chunkSize: number; + sdk: any; + + constructor() { + this.name = "ghostmarket-polygon"; + this.protocol = "matic"; + this.block = 28962851; + this.contract = "0x3b48563237c32a1f886fd19db6f5affd23855e2a"; + this.events = ["OrderFilled"]; + this.pathToAbi = path.join(__dirname, "./abi.json"); + this.range = 500; + this.chunkSize = 6; + } + + run = async (): Promise => { + this.sdk = await this.loadSdk(); + + await this.sdk.run(); + }; + + loadSdk = (): any => { + return new Matic(this); + }; + + stop = async (): Promise => { + this.sdk.stop(); + }; + + _getToken = (event: EventData): string => { + let token = "matic"; + if (event.returnValues["rightAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); + } + + return token; + }; + + process = async (event: EventData): Promise => { + const block = await this.sdk.getBlock(event.blockNumber); + const timestamp = moment.unix(block.timestamp).utc(); + const token = this._getToken(event); + const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); + const po = await priceSdk.get(token, this.protocol, block.timestamp); + const price = event.returnValues["newLeftFill"]; + const nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + const seller = event.returnValues["leftMaker"]; + const buyer = event.returnValues["rightMaker"]; + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); + let nftContract = params[0]; + let tokenId = params[1]; + + const entity = { + providerName: this.name, + providerContract: this.contract, + protocol: this.protocol, + nftContract: nftContract.toLowerCase(), + nftId: tokenId, + token: token.toLowerCase(), + tokenSymbol: symbol?.symbol || "", + amount: 1, + price: nativePrice.toNumber(), + priceUsd: !symbol?.decimals ? null : nativePrice.multipliedBy(po.price).toNumber(), + seller: seller.toLowerCase(), + buyer: buyer.toLowerCase(), + soldAt: timestamp.format("YYYY-MM-DD HH:mm:ss"), + blockNumber: event.blockNumber, + transactionHash: event.transactionHash, + }; + + await this.addToDatabase(entity); + }; + + addToDatabase = async (entity: ISaleEntity): Promise => { + console.log(`creating sale for ${entity.nftContract} with id ${entity.nftId}`); + return entity; + }; +} + +export default Element; From 3425c4baba3b7c24fe7203740bb4785e87d5cddc Mon Sep 17 00:00:00 2001 From: NeoDashboard Date: Fri, 10 Feb 2023 10:41:22 +0100 Subject: [PATCH 2/6] Fix naming convention + avalanche bug + add ETH proxy contract --- .../abi.json | 0 .../index.ts | 5 +-- .../abi.json | 0 .../index.ts | 0 .../abi.json | 0 .../index.ts | 36 ++++++++++++++----- .../abi.json | 0 .../index.ts | 0 8 files changed, 30 insertions(+), 11 deletions(-) rename src/adapters/{ghostmarket-avalanche => ghostmarket-avalanche-1}/abi.json (100%) rename src/adapters/{ghostmarket-avalanche => ghostmarket-avalanche-1}/index.ts (94%) rename src/adapters/{ghostmarket-bsc => ghostmarket-bsc-1}/abi.json (100%) rename src/adapters/{ghostmarket-bsc => ghostmarket-bsc-1}/index.ts (100%) rename src/adapters/{ghostmarket-ethereum => ghostmarket-ethereum-1}/abi.json (100%) rename src/adapters/{ghostmarket-ethereum => ghostmarket-ethereum-1}/index.ts (64%) rename src/adapters/{ghostmarket-polygon => ghostmarket-polygon-1}/abi.json (100%) rename src/adapters/{ghostmarket-polygon => ghostmarket-polygon-1}/index.ts (100%) diff --git a/src/adapters/ghostmarket-avalanche/abi.json b/src/adapters/ghostmarket-avalanche-1/abi.json similarity index 100% rename from src/adapters/ghostmarket-avalanche/abi.json rename to src/adapters/ghostmarket-avalanche-1/abi.json diff --git a/src/adapters/ghostmarket-avalanche/index.ts b/src/adapters/ghostmarket-avalanche-1/index.ts similarity index 94% rename from src/adapters/ghostmarket-avalanche/index.ts rename to src/adapters/ghostmarket-avalanche-1/index.ts index 5e82072..f3a03a3 100644 --- a/src/adapters/ghostmarket-avalanche/index.ts +++ b/src/adapters/ghostmarket-avalanche-1/index.ts @@ -68,8 +68,9 @@ class Element { const nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); const seller = event.returnValues["leftMaker"]; const buyer = event.returnValues["rightMaker"]; - const nftContract = event.returnValues["leftAsset"]["data"][0]; - const tokenId = event.returnValues["leftAsset"]["data"][1]; + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); + let nftContract = params[0]; + let tokenId = params[1]; const entity = { providerName: this.name, diff --git a/src/adapters/ghostmarket-bsc/abi.json b/src/adapters/ghostmarket-bsc-1/abi.json similarity index 100% rename from src/adapters/ghostmarket-bsc/abi.json rename to src/adapters/ghostmarket-bsc-1/abi.json diff --git a/src/adapters/ghostmarket-bsc/index.ts b/src/adapters/ghostmarket-bsc-1/index.ts similarity index 100% rename from src/adapters/ghostmarket-bsc/index.ts rename to src/adapters/ghostmarket-bsc-1/index.ts diff --git a/src/adapters/ghostmarket-ethereum/abi.json b/src/adapters/ghostmarket-ethereum-1/abi.json similarity index 100% rename from src/adapters/ghostmarket-ethereum/abi.json rename to src/adapters/ghostmarket-ethereum-1/abi.json diff --git a/src/adapters/ghostmarket-ethereum/index.ts b/src/adapters/ghostmarket-ethereum-1/index.ts similarity index 64% rename from src/adapters/ghostmarket-ethereum/index.ts rename to src/adapters/ghostmarket-ethereum-1/index.ts index af92f59..6681670 100644 --- a/src/adapters/ghostmarket-ethereum/index.ts +++ b/src/adapters/ghostmarket-ethereum-1/index.ts @@ -27,7 +27,8 @@ class Element { constructor() { this.name = "ghostmarket-ethereum"; this.protocol = "ethereum"; - this.block = 15080677; + //this.block = 15080677; + this.block = 15543441; this.contract = "0xfb2f452639cbb0850b46b20d24de7b0a9ccb665f"; this.events = ["OrderFilled"]; this.pathToAbi = path.join(__dirname, "./abi.json"); @@ -51,8 +52,14 @@ class Element { _getToken = (event: EventData): string => { let token = "0x0000000000000000000000000000000000000000"; - if (event.returnValues["rightAsset"]["data"] != "0x") { - token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); + if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["rightAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); + } + } else { + if (event.returnValues["leftAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["leftAsset"]["data"]).toLowerCase(); + } } return token; @@ -64,13 +71,24 @@ class Element { const token = this._getToken(event); const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); const po = await priceSdk.get(token, this.protocol, block.timestamp); - const price = event.returnValues["newLeftFill"]; - const nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - const seller = event.returnValues["leftMaker"]; - const buyer = event.returnValues["rightMaker"]; + let price = event.returnValues["newLeftFill"]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues["leftMaker"].toLowerCase(); + let buyer = event.returnValues["rightMaker"].toLowerCase(); let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); + if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { + price = event.returnValues["newRightFill"]; + nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + seller = event.returnValues["rightMaker"]; + buyer = event.returnValues["leftMaker"]; + params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + } let nftContract = params[0]; let tokenId = params[1]; + if (buyer == "0x2debb6ced142197bec08d76d3ecce828b3b261ee") { + const txInfo = await this.sdk.getTransactionReceipt(event.transactionHash); + buyer = txInfo.from.toLowerCase(); + } const entity = { providerName: this.name, @@ -83,8 +101,8 @@ class Element { amount: 1, price: nativePrice.toNumber(), priceUsd: !symbol?.decimals ? null : nativePrice.multipliedBy(po.price).toNumber(), - seller: seller.toLowerCase(), - buyer: buyer.toLowerCase(), + seller: seller, + buyer: buyer, soldAt: timestamp.format("YYYY-MM-DD HH:mm:ss"), blockNumber: event.blockNumber, transactionHash: event.transactionHash, diff --git a/src/adapters/ghostmarket-polygon/abi.json b/src/adapters/ghostmarket-polygon-1/abi.json similarity index 100% rename from src/adapters/ghostmarket-polygon/abi.json rename to src/adapters/ghostmarket-polygon-1/abi.json diff --git a/src/adapters/ghostmarket-polygon/index.ts b/src/adapters/ghostmarket-polygon-1/index.ts similarity index 100% rename from src/adapters/ghostmarket-polygon/index.ts rename to src/adapters/ghostmarket-polygon-1/index.ts From fae9e534be5a580c68ba7a593eb45f1e526d05b8 Mon Sep 17 00:00:00 2001 From: NeoDashboard Date: Fri, 10 Feb 2023 12:12:14 +0100 Subject: [PATCH 3/6] Add new ABI support after wrapper realease --- src/adapters/ghostmarket-avalanche-1/index.ts | 34 +++-- src/adapters/ghostmarket-avalanche-2/abi.json | 81 ++++++++++++ src/adapters/ghostmarket-avalanche-2/index.ts | 119 ++++++++++++++++++ src/adapters/ghostmarket-bsc-1/index.ts | 34 +++-- src/adapters/ghostmarket-bsc-2/abi.json | 81 ++++++++++++ src/adapters/ghostmarket-bsc-2/index.ts | 119 ++++++++++++++++++ src/adapters/ghostmarket-ethereum-1/index.ts | 4 +- src/adapters/ghostmarket-ethereum-2/abi.json | 81 ++++++++++++ src/adapters/ghostmarket-ethereum-2/index.ts | 119 ++++++++++++++++++ src/adapters/ghostmarket-polygon-1/index.ts | 34 +++-- src/adapters/ghostmarket-polygon-2/abi.json | 81 ++++++++++++ src/adapters/ghostmarket-polygon-2/index.ts | 119 ++++++++++++++++++ 12 files changed, 880 insertions(+), 26 deletions(-) create mode 100644 src/adapters/ghostmarket-avalanche-2/abi.json create mode 100644 src/adapters/ghostmarket-avalanche-2/index.ts create mode 100644 src/adapters/ghostmarket-bsc-2/abi.json create mode 100644 src/adapters/ghostmarket-bsc-2/index.ts create mode 100644 src/adapters/ghostmarket-ethereum-2/abi.json create mode 100644 src/adapters/ghostmarket-ethereum-2/index.ts create mode 100644 src/adapters/ghostmarket-polygon-2/abi.json create mode 100644 src/adapters/ghostmarket-polygon-2/index.ts diff --git a/src/adapters/ghostmarket-avalanche-1/index.ts b/src/adapters/ghostmarket-avalanche-1/index.ts index f3a03a3..0e61dc8 100644 --- a/src/adapters/ghostmarket-avalanche-1/index.ts +++ b/src/adapters/ghostmarket-avalanche-1/index.ts @@ -28,6 +28,7 @@ class Element { this.name = "ghostmarket-avalanche"; this.protocol = "avalanche"; this.block = 15385077; + this.deprecatedAtBlock = 25967158; this.contract = "0xeb4aba7aeba732fc2fc92a673585d950ccfc1de0"; this.events = ["OrderFilled"]; this.pathToAbi = path.join(__dirname, "./abi.json"); @@ -51,8 +52,14 @@ class Element { _getToken = (event: EventData): string => { let token = "avax"; - if (event.returnValues["rightAsset"]["data"] != "0x") { - token = event.returnValues["rightAsset"]["data"][0].toLowerCase(); + if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["rightAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); + } + } else { + if (event.returnValues["leftAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["leftAsset"]["data"]).toLowerCase(); + } } return token; @@ -64,13 +71,24 @@ class Element { const token = this._getToken(event); const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); const po = await priceSdk.get(token, this.protocol, block.timestamp); - const price = event.returnValues["newLeftFill"]; - const nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - const seller = event.returnValues["leftMaker"]; - const buyer = event.returnValues["rightMaker"]; + let price = event.returnValues["newLeftFill"]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues["leftMaker"].toLowerCase(); + let buyer = event.returnValues["rightMaker"].toLowerCase(); let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); + if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { + price = event.returnValues["newRightFill"]; + nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + seller = event.returnValues["rightMaker"]; + buyer = event.returnValues["leftMaker"]; + params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + } let nftContract = params[0]; let tokenId = params[1]; + if (buyer == "0x0c823cd09642864f495f0a474e1d26dea9a516f9") { + const txInfo = await this.sdk.getTransactionReceipt(event.transactionHash); + buyer = txInfo.from.toLowerCase(); + } const entity = { providerName: this.name, @@ -83,8 +101,8 @@ class Element { amount: 1, price: nativePrice.toNumber(), priceUsd: !symbol?.decimals ? null : nativePrice.multipliedBy(po.price).toNumber(), - seller: seller.toLowerCase(), - buyer: buyer.toLowerCase(), + seller: seller, + buyer: buyer, soldAt: timestamp.format("YYYY-MM-DD HH:mm:ss"), blockNumber: event.blockNumber, transactionHash: event.transactionHash, diff --git a/src/adapters/ghostmarket-avalanche-2/abi.json b/src/adapters/ghostmarket-avalanche-2/abi.json new file mode 100644 index 0000000..fc5c127 --- /dev/null +++ b/src/adapters/ghostmarket-avalanche-2/abi.json @@ -0,0 +1,81 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "leftHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "rightHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "leftMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "rightMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newLeftFill", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newRightFill", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "leftAsset", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "rightAsset", + "type": "tuple" + } + ], + "name": "OrderFilled", + "type": "event" + } +] \ No newline at end of file diff --git a/src/adapters/ghostmarket-avalanche-2/index.ts b/src/adapters/ghostmarket-avalanche-2/index.ts new file mode 100644 index 0000000..14a366a --- /dev/null +++ b/src/adapters/ghostmarket-avalanche-2/index.ts @@ -0,0 +1,119 @@ +import * as dotenv from "dotenv"; + +dotenv.config(); + +import BigNumber from "bignumber.js"; +import moment from "moment"; +import { EventData } from "web3-eth-contract"; +import path from "path"; +import priceSdk from "../../sdk/price"; +import Avalanche from "../../sdk/avalanche"; +import symbolSdk from "../../sdk/symbol"; +import { ISaleEntity, ISymbolAPIResponse } from "../../sdk/Interfaces"; + +class Element { + name: string; + token: string; + protocol: string; + block: number; + deprecatedAtBlock: number; + contract: string; + events: string[]; + pathToAbi: string; + range: number; + chunkSize: number; + sdk: any; + + constructor() { + this.name = "ghostmarket-avalanche"; + this.protocol = "avalanche"; + this.block = 25967159; + this.contract = "0xeb4aba7aeba732fc2fc92a673585d950ccfc1de0"; + this.events = ["OrderFilled"]; + this.pathToAbi = path.join(__dirname, "./abi.json"); + this.range = 500; + this.chunkSize = 6; + } + + run = async (): Promise => { + this.sdk = await this.loadSdk(); + + await this.sdk.run(); + }; + + loadSdk = (): any => { + return new Avalanche(this); + }; + + stop = async (): Promise => { + this.sdk.stop(); + }; + + _getToken = (event: EventData): string => { + let token = "avax"; + if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["rightAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); + } + } else { + if (event.returnValues["leftAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["leftAsset"]["data"]).toLowerCase(); + } + } + + return token; + }; + + process = async (event: EventData): Promise => { + const block = await this.sdk.getBlock(event.blockNumber); + const timestamp = moment.unix(block.timestamp).utc(); + const token = this._getToken(event); + const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); + const po = await priceSdk.get(token, this.protocol, block.timestamp); + let price = event.returnValues["newLeftFill"]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues["leftMaker"].toLowerCase(); + let buyer = event.returnValues["rightMaker"].toLowerCase(); + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); + if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { + price = event.returnValues["newRightFill"]; + nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + seller = event.returnValues["rightMaker"]; + buyer = event.returnValues["leftMaker"]; + params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + } + let nftContract = params[0]; + let tokenId = params[1]; + if (buyer == "0x0c823cd09642864f495f0a474e1d26dea9a516f9") { + const txInfo = await this.sdk.getTransactionReceipt(event.transactionHash); + buyer = txInfo.from.toLowerCase(); + } + + const entity = { + providerName: this.name, + providerContract: this.contract, + protocol: this.protocol, + nftContract: nftContract.toLowerCase(), + nftId: tokenId, + token: token.toLowerCase(), + tokenSymbol: symbol?.symbol || "", + amount: 1, + price: nativePrice.toNumber(), + priceUsd: !symbol?.decimals ? null : nativePrice.multipliedBy(po.price).toNumber(), + seller: seller, + buyer: buyer, + soldAt: timestamp.format("YYYY-MM-DD HH:mm:ss"), + blockNumber: event.blockNumber, + transactionHash: event.transactionHash, + }; + + await this.addToDatabase(entity); + }; + + addToDatabase = async (entity: ISaleEntity): Promise => { + console.log(`creating sale for ${entity.nftContract} with id ${entity.nftId}`); + return entity; + }; +} + +export default Element; diff --git a/src/adapters/ghostmarket-bsc-1/index.ts b/src/adapters/ghostmarket-bsc-1/index.ts index 1ba64e6..139e31a 100644 --- a/src/adapters/ghostmarket-bsc-1/index.ts +++ b/src/adapters/ghostmarket-bsc-1/index.ts @@ -28,6 +28,7 @@ class Element { this.name = "ghostmarket-bsc"; this.protocol = "binance-smart-chain"; this.block = 18259152; + this.deprecatedAtBlock = 25471223; this.contract = "0x388171f81fc91efc7338e07e52555a90c7d87972"; this.events = ["OrderFilled"]; this.pathToAbi = path.join(__dirname, "./abi.json"); @@ -51,8 +52,14 @@ class Element { _getToken = (event: EventData): string => { let token = "bnb"; - if (event.returnValues["rightAsset"]["data"] != "0x") { - token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); + if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["rightAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); + } + } else { + if (event.returnValues["leftAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["leftAsset"]["data"]).toLowerCase(); + } } return token; @@ -64,13 +71,24 @@ class Element { const token = this._getToken(event); const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); const po = await priceSdk.get(token, this.protocol, block.timestamp); - const price = event.returnValues["newLeftFill"]; - const nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - const seller = event.returnValues["leftMaker"]; - const buyer = event.returnValues["rightMaker"]; + let price = event.returnValues["newLeftFill"]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues["leftMaker"].toLowerCase(); + let buyer = event.returnValues["rightMaker"].toLowerCase(); let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); + if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { + price = event.returnValues["newRightFill"]; + nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + seller = event.returnValues["rightMaker"]; + buyer = event.returnValues["leftMaker"]; + params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + } let nftContract = params[0]; let tokenId = params[1]; + if (buyer == "0x32e0c20421c96ca4b423a7806e151e953c647c48") { + const txInfo = await this.sdk.getTransactionReceipt(event.transactionHash); + buyer = txInfo.from.toLowerCase(); + } const entity = { providerName: this.name, @@ -83,8 +101,8 @@ class Element { amount: 1, price: nativePrice.toNumber(), priceUsd: !symbol?.decimals ? null : nativePrice.multipliedBy(po.price).toNumber(), - seller: seller.toLowerCase(), - buyer: buyer.toLowerCase(), + seller: seller, + buyer: buyer, soldAt: timestamp.format("YYYY-MM-DD HH:mm:ss"), blockNumber: event.blockNumber, transactionHash: event.transactionHash, diff --git a/src/adapters/ghostmarket-bsc-2/abi.json b/src/adapters/ghostmarket-bsc-2/abi.json new file mode 100644 index 0000000..fc5c127 --- /dev/null +++ b/src/adapters/ghostmarket-bsc-2/abi.json @@ -0,0 +1,81 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "leftHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "rightHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "leftMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "rightMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newLeftFill", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newRightFill", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "leftAsset", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "rightAsset", + "type": "tuple" + } + ], + "name": "OrderFilled", + "type": "event" + } +] \ No newline at end of file diff --git a/src/adapters/ghostmarket-bsc-2/index.ts b/src/adapters/ghostmarket-bsc-2/index.ts new file mode 100644 index 0000000..323eaf7 --- /dev/null +++ b/src/adapters/ghostmarket-bsc-2/index.ts @@ -0,0 +1,119 @@ +import * as dotenv from "dotenv"; + +dotenv.config(); + +import BigNumber from "bignumber.js"; +import moment from "moment"; +import { EventData } from "web3-eth-contract"; +import path from "path"; +import priceSdk from "../../sdk/price"; +import Binance from "../../sdk/binance"; +import symbolSdk from "../../sdk/symbol"; +import { ISaleEntity, ISymbolAPIResponse } from "../../sdk/Interfaces"; + +class Element { + name: string; + token: string; + protocol: string; + block: number; + deprecatedAtBlock: number; + contract: string; + events: string[]; + pathToAbi: string; + range: number; + chunkSize: number; + sdk: any; + + constructor() { + this.name = "ghostmarket-bsc"; + this.protocol = "binance-smart-chain"; + this.block = 25471224; + this.contract = "0x388171f81fc91efc7338e07e52555a90c7d87972"; + this.events = ["OrderFilled"]; + this.pathToAbi = path.join(__dirname, "./abi.json"); + this.range = 500; + this.chunkSize = 6; + } + + run = async (): Promise => { + this.sdk = await this.loadSdk(); + + await this.sdk.run(); + }; + + loadSdk = (): any => { + return new Binance(this); + }; + + stop = async (): Promise => { + this.sdk.stop(); + }; + + _getToken = (event: EventData): string => { + let token = "bnb"; + if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["rightAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); + } + } else { + if (event.returnValues["leftAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["leftAsset"]["data"]).toLowerCase(); + } + } + + return token; + }; + + process = async (event: EventData): Promise => { + const block = await this.sdk.getBlock(event.blockNumber); + const timestamp = moment.unix(block.timestamp).utc(); + const token = this._getToken(event); + const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); + const po = await priceSdk.get(token, this.protocol, block.timestamp); + let price = event.returnValues["newLeftFill"]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues["leftMaker"].toLowerCase(); + let buyer = event.returnValues["rightMaker"].toLowerCase(); + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); + if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { + price = event.returnValues["newRightFill"]; + nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + seller = event.returnValues["rightMaker"]; + buyer = event.returnValues["leftMaker"]; + params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + } + let nftContract = params[0]; + let tokenId = params[1]; + if (buyer == "0x32e0c20421c96ca4b423a7806e151e953c647c48") { + const txInfo = await this.sdk.getTransactionReceipt(event.transactionHash); + buyer = txInfo.from.toLowerCase(); + } + + const entity = { + providerName: this.name, + providerContract: this.contract, + protocol: this.protocol, + nftContract: nftContract.toLowerCase(), + nftId: tokenId, + token: token.toLowerCase(), + tokenSymbol: symbol?.symbol || "", + amount: 1, + price: nativePrice.toNumber(), + priceUsd: !symbol?.decimals ? null : nativePrice.multipliedBy(po.price).toNumber(), + seller: seller, + buyer: buyer, + soldAt: timestamp.format("YYYY-MM-DD HH:mm:ss"), + blockNumber: event.blockNumber, + transactionHash: event.transactionHash, + }; + + await this.addToDatabase(entity); + }; + + addToDatabase = async (entity: ISaleEntity): Promise => { + console.log(`creating sale for ${entity.nftContract} with id ${entity.nftId}`); + return entity; + }; +} + +export default Element; diff --git a/src/adapters/ghostmarket-ethereum-1/index.ts b/src/adapters/ghostmarket-ethereum-1/index.ts index 6681670..e4190d4 100644 --- a/src/adapters/ghostmarket-ethereum-1/index.ts +++ b/src/adapters/ghostmarket-ethereum-1/index.ts @@ -27,8 +27,8 @@ class Element { constructor() { this.name = "ghostmarket-ethereum"; this.protocol = "ethereum"; - //this.block = 15080677; - this.block = 15543441; + this.block = 15080677; + this.deprecatedAtBlock = 16579833; this.contract = "0xfb2f452639cbb0850b46b20d24de7b0a9ccb665f"; this.events = ["OrderFilled"]; this.pathToAbi = path.join(__dirname, "./abi.json"); diff --git a/src/adapters/ghostmarket-ethereum-2/abi.json b/src/adapters/ghostmarket-ethereum-2/abi.json new file mode 100644 index 0000000..fc5c127 --- /dev/null +++ b/src/adapters/ghostmarket-ethereum-2/abi.json @@ -0,0 +1,81 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "leftHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "rightHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "leftMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "rightMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newLeftFill", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newRightFill", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "leftAsset", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "rightAsset", + "type": "tuple" + } + ], + "name": "OrderFilled", + "type": "event" + } +] \ No newline at end of file diff --git a/src/adapters/ghostmarket-ethereum-2/index.ts b/src/adapters/ghostmarket-ethereum-2/index.ts new file mode 100644 index 0000000..f7f7799 --- /dev/null +++ b/src/adapters/ghostmarket-ethereum-2/index.ts @@ -0,0 +1,119 @@ +import * as dotenv from "dotenv"; + +dotenv.config(); + +import BigNumber from "bignumber.js"; +import moment from "moment"; +import { EventData } from "web3-eth-contract"; +import path from "path"; +import priceSdk from "../../sdk/price"; +import Ethereum from "../../sdk/EVMC"; +import symbolSdk from "../../sdk/symbol"; +import { ISaleEntity, ISymbolAPIResponse } from "../../sdk/Interfaces"; + +class Element { + name: string; + token: string; + protocol: string; + block: number; + deprecatedAtBlock: number; + contract: string; + events: string[]; + pathToAbi: string; + range: number; + chunkSize: number; + sdk: any; + + constructor() { + this.name = "ghostmarket-ethereum"; + this.protocol = "ethereum"; + this.block = 16579834; + this.contract = "0xfb2f452639cbb0850b46b20d24de7b0a9ccb665f"; + this.events = ["OrderFilled"]; + this.pathToAbi = path.join(__dirname, "./abi.json"); + this.range = 500; + this.chunkSize = 6; + } + + run = async (): Promise => { + this.sdk = await this.loadSdk(); + + await this.sdk.run(); + }; + + loadSdk = (): any => { + return new Ethereum(this); + }; + + stop = async (): Promise => { + this.sdk.stop(); + }; + + _getToken = (event: EventData): string => { + let token = "0x0000000000000000000000000000000000000000"; + if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["rightAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); + } + } else { + if (event.returnValues["leftAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["leftAsset"]["data"]).toLowerCase(); + } + } + + return token; + }; + + process = async (event: EventData): Promise => { + const block = await this.sdk.getBlock(event.blockNumber); + const timestamp = moment.unix(block.timestamp).utc(); + const token = this._getToken(event); + const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); + const po = await priceSdk.get(token, this.protocol, block.timestamp); + let price = event.returnValues["newLeftFill"]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues["leftMaker"].toLowerCase(); + let buyer = event.returnValues["rightMaker"].toLowerCase(); + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); + if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { + price = event.returnValues["newRightFill"]; + nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + seller = event.returnValues["rightMaker"]; + buyer = event.returnValues["leftMaker"]; + params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + } + let nftContract = params[0]; + let tokenId = params[1]; + if (buyer == "0x2debb6ced142197bec08d76d3ecce828b3b261ee") { + const txInfo = await this.sdk.getTransactionReceipt(event.transactionHash); + buyer = txInfo.from.toLowerCase(); + } + + const entity = { + providerName: this.name, + providerContract: this.contract, + protocol: this.protocol, + nftContract: nftContract.toLowerCase(), + nftId: tokenId, + token: token.toLowerCase(), + tokenSymbol: symbol?.symbol || "", + amount: 1, + price: nativePrice.toNumber(), + priceUsd: !symbol?.decimals ? null : nativePrice.multipliedBy(po.price).toNumber(), + seller: seller, + buyer: buyer, + soldAt: timestamp.format("YYYY-MM-DD HH:mm:ss"), + blockNumber: event.blockNumber, + transactionHash: event.transactionHash, + }; + + await this.addToDatabase(entity); + }; + + addToDatabase = async (entity: ISaleEntity): Promise => { + console.log(`creating sale for ${entity.nftContract} with id ${entity.nftId}`); + return entity; + }; +} + +export default Element; diff --git a/src/adapters/ghostmarket-polygon-1/index.ts b/src/adapters/ghostmarket-polygon-1/index.ts index 4d22149..fd5a2a2 100644 --- a/src/adapters/ghostmarket-polygon-1/index.ts +++ b/src/adapters/ghostmarket-polygon-1/index.ts @@ -28,6 +28,7 @@ class Element { this.name = "ghostmarket-polygon"; this.protocol = "matic"; this.block = 28962851; + this.deprecatedAtBlock = 39033113; this.contract = "0x3b48563237c32a1f886fd19db6f5affd23855e2a"; this.events = ["OrderFilled"]; this.pathToAbi = path.join(__dirname, "./abi.json"); @@ -51,8 +52,14 @@ class Element { _getToken = (event: EventData): string => { let token = "matic"; - if (event.returnValues["rightAsset"]["data"] != "0x") { - token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); + if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["rightAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); + } + } else { + if (event.returnValues["leftAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["leftAsset"]["data"]).toLowerCase(); + } } return token; @@ -64,13 +71,24 @@ class Element { const token = this._getToken(event); const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); const po = await priceSdk.get(token, this.protocol, block.timestamp); - const price = event.returnValues["newLeftFill"]; - const nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - const seller = event.returnValues["leftMaker"]; - const buyer = event.returnValues["rightMaker"]; + let price = event.returnValues["newLeftFill"]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues["leftMaker"].toLowerCase(); + let buyer = event.returnValues["rightMaker"].toLowerCase(); let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); + if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { + price = event.returnValues["newRightFill"]; + nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + seller = event.returnValues["rightMaker"]; + buyer = event.returnValues["leftMaker"]; + params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + } let nftContract = params[0]; let tokenId = params[1]; + if (buyer == "0x09236d6b740ac67dca842d9db6fa4d067a684e76") { + const txInfo = await this.sdk.getTransactionReceipt(event.transactionHash); + buyer = txInfo.from.toLowerCase(); + } const entity = { providerName: this.name, @@ -83,8 +101,8 @@ class Element { amount: 1, price: nativePrice.toNumber(), priceUsd: !symbol?.decimals ? null : nativePrice.multipliedBy(po.price).toNumber(), - seller: seller.toLowerCase(), - buyer: buyer.toLowerCase(), + seller: seller, + buyer: buyer, soldAt: timestamp.format("YYYY-MM-DD HH:mm:ss"), blockNumber: event.blockNumber, transactionHash: event.transactionHash, diff --git a/src/adapters/ghostmarket-polygon-2/abi.json b/src/adapters/ghostmarket-polygon-2/abi.json new file mode 100644 index 0000000..fc5c127 --- /dev/null +++ b/src/adapters/ghostmarket-polygon-2/abi.json @@ -0,0 +1,81 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "leftHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "rightHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "leftMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "rightMaker", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newLeftFill", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newRightFill", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "leftAsset", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes4", + "name": "assetClass", + "type": "bytes4" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "indexed": false, + "internalType": "struct LibAsset.AssetType", + "name": "rightAsset", + "type": "tuple" + } + ], + "name": "OrderFilled", + "type": "event" + } +] \ No newline at end of file diff --git a/src/adapters/ghostmarket-polygon-2/index.ts b/src/adapters/ghostmarket-polygon-2/index.ts new file mode 100644 index 0000000..ba0608b --- /dev/null +++ b/src/adapters/ghostmarket-polygon-2/index.ts @@ -0,0 +1,119 @@ +import * as dotenv from "dotenv"; + +dotenv.config(); + +import BigNumber from "bignumber.js"; +import moment from "moment"; +import { EventData } from "web3-eth-contract"; +import path from "path"; +import priceSdk from "../../sdk/price"; +import Matic from "../../sdk/matic"; +import symbolSdk from "../../sdk/symbol"; +import { ISaleEntity, ISymbolAPIResponse } from "../../sdk/Interfaces"; + +class Element { + name: string; + token: string; + protocol: string; + block: number; + deprecatedAtBlock: number; + contract: string; + events: string[]; + pathToAbi: string; + range: number; + chunkSize: number; + sdk: any; + + constructor() { + this.name = "ghostmarket-polygon"; + this.protocol = "matic"; + this.block = 39033114; + this.contract = "0x3b48563237c32a1f886fd19db6f5affd23855e2a"; + this.events = ["OrderFilled"]; + this.pathToAbi = path.join(__dirname, "./abi.json"); + this.range = 500; + this.chunkSize = 6; + } + + run = async (): Promise => { + this.sdk = await this.loadSdk(); + + await this.sdk.run(); + }; + + loadSdk = (): any => { + return new Matic(this); + }; + + stop = async (): Promise => { + this.sdk.stop(); + }; + + _getToken = (event: EventData): string => { + let token = "matic"; + if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["rightAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); + } + } else { + if (event.returnValues["leftAsset"]["data"] != "0x") { + token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["leftAsset"]["data"]).toLowerCase(); + } + } + + return token; + }; + + process = async (event: EventData): Promise => { + const block = await this.sdk.getBlock(event.blockNumber); + const timestamp = moment.unix(block.timestamp).utc(); + const token = this._getToken(event); + const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); + const po = await priceSdk.get(token, this.protocol, block.timestamp); + let price = event.returnValues["newLeftFill"]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues["leftMaker"].toLowerCase(); + let buyer = event.returnValues["rightMaker"].toLowerCase(); + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); + if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { + price = event.returnValues["newRightFill"]; + nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + seller = event.returnValues["rightMaker"]; + buyer = event.returnValues["leftMaker"]; + params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + } + let nftContract = params[0]; + let tokenId = params[1]; + if (buyer == "0x09236d6b740ac67dca842d9db6fa4d067a684e76") { + const txInfo = await this.sdk.getTransactionReceipt(event.transactionHash); + buyer = txInfo.from.toLowerCase(); + } + + const entity = { + providerName: this.name, + providerContract: this.contract, + protocol: this.protocol, + nftContract: nftContract.toLowerCase(), + nftId: tokenId, + token: token.toLowerCase(), + tokenSymbol: symbol?.symbol || "", + amount: 1, + price: nativePrice.toNumber(), + priceUsd: !symbol?.decimals ? null : nativePrice.multipliedBy(po.price).toNumber(), + seller: seller, + buyer: buyer, + soldAt: timestamp.format("YYYY-MM-DD HH:mm:ss"), + blockNumber: event.blockNumber, + transactionHash: event.transactionHash, + }; + + await this.addToDatabase(entity); + }; + + addToDatabase = async (entity: ISaleEntity): Promise => { + console.log(`creating sale for ${entity.nftContract} with id ${entity.nftId}`); + return entity; + }; +} + +export default Element; From 0af4cf479619cac0a731ba4d19c84e34c49b3fd4 Mon Sep 17 00:00:00 2001 From: NeoDashboard Date: Mon, 13 Feb 2023 16:47:44 +0100 Subject: [PATCH 4/6] Fix naming convention --- src/adapters/ghostmarket-avalanche-1/index.ts | 2 +- src/adapters/ghostmarket-avalanche-2/index.ts | 2 +- src/adapters/ghostmarket-bsc-1/index.ts | 2 +- src/adapters/ghostmarket-bsc-2/index.ts | 2 +- src/adapters/ghostmarket-ethereum-1/index.ts | 2 +- src/adapters/ghostmarket-ethereum-2/index.ts | 2 +- src/adapters/ghostmarket-polygon-1/index.ts | 2 +- src/adapters/ghostmarket-polygon-2/index.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/adapters/ghostmarket-avalanche-1/index.ts b/src/adapters/ghostmarket-avalanche-1/index.ts index 0e61dc8..5888b34 100644 --- a/src/adapters/ghostmarket-avalanche-1/index.ts +++ b/src/adapters/ghostmarket-avalanche-1/index.ts @@ -25,7 +25,7 @@ class Element { sdk: any; constructor() { - this.name = "ghostmarket-avalanche"; + this.name = "ghostmarket-avalanche-1"; this.protocol = "avalanche"; this.block = 15385077; this.deprecatedAtBlock = 25967158; diff --git a/src/adapters/ghostmarket-avalanche-2/index.ts b/src/adapters/ghostmarket-avalanche-2/index.ts index 14a366a..df50cea 100644 --- a/src/adapters/ghostmarket-avalanche-2/index.ts +++ b/src/adapters/ghostmarket-avalanche-2/index.ts @@ -25,7 +25,7 @@ class Element { sdk: any; constructor() { - this.name = "ghostmarket-avalanche"; + this.name = "ghostmarket-avalanche-2"; this.protocol = "avalanche"; this.block = 25967159; this.contract = "0xeb4aba7aeba732fc2fc92a673585d950ccfc1de0"; diff --git a/src/adapters/ghostmarket-bsc-1/index.ts b/src/adapters/ghostmarket-bsc-1/index.ts index 139e31a..33ea000 100644 --- a/src/adapters/ghostmarket-bsc-1/index.ts +++ b/src/adapters/ghostmarket-bsc-1/index.ts @@ -25,7 +25,7 @@ class Element { sdk: any; constructor() { - this.name = "ghostmarket-bsc"; + this.name = "ghostmarket-bsc-1"; this.protocol = "binance-smart-chain"; this.block = 18259152; this.deprecatedAtBlock = 25471223; diff --git a/src/adapters/ghostmarket-bsc-2/index.ts b/src/adapters/ghostmarket-bsc-2/index.ts index 323eaf7..037172e 100644 --- a/src/adapters/ghostmarket-bsc-2/index.ts +++ b/src/adapters/ghostmarket-bsc-2/index.ts @@ -25,7 +25,7 @@ class Element { sdk: any; constructor() { - this.name = "ghostmarket-bsc"; + this.name = "ghostmarket-bsc-2"; this.protocol = "binance-smart-chain"; this.block = 25471224; this.contract = "0x388171f81fc91efc7338e07e52555a90c7d87972"; diff --git a/src/adapters/ghostmarket-ethereum-1/index.ts b/src/adapters/ghostmarket-ethereum-1/index.ts index e4190d4..52666c6 100644 --- a/src/adapters/ghostmarket-ethereum-1/index.ts +++ b/src/adapters/ghostmarket-ethereum-1/index.ts @@ -25,7 +25,7 @@ class Element { sdk: any; constructor() { - this.name = "ghostmarket-ethereum"; + this.name = "ghostmarket-ethereum-1"; this.protocol = "ethereum"; this.block = 15080677; this.deprecatedAtBlock = 16579833; diff --git a/src/adapters/ghostmarket-ethereum-2/index.ts b/src/adapters/ghostmarket-ethereum-2/index.ts index f7f7799..5cfe06a 100644 --- a/src/adapters/ghostmarket-ethereum-2/index.ts +++ b/src/adapters/ghostmarket-ethereum-2/index.ts @@ -25,7 +25,7 @@ class Element { sdk: any; constructor() { - this.name = "ghostmarket-ethereum"; + this.name = "ghostmarket-ethereum-2"; this.protocol = "ethereum"; this.block = 16579834; this.contract = "0xfb2f452639cbb0850b46b20d24de7b0a9ccb665f"; diff --git a/src/adapters/ghostmarket-polygon-1/index.ts b/src/adapters/ghostmarket-polygon-1/index.ts index fd5a2a2..c99e345 100644 --- a/src/adapters/ghostmarket-polygon-1/index.ts +++ b/src/adapters/ghostmarket-polygon-1/index.ts @@ -25,7 +25,7 @@ class Element { sdk: any; constructor() { - this.name = "ghostmarket-polygon"; + this.name = "ghostmarket-polygon-1"; this.protocol = "matic"; this.block = 28962851; this.deprecatedAtBlock = 39033113; diff --git a/src/adapters/ghostmarket-polygon-2/index.ts b/src/adapters/ghostmarket-polygon-2/index.ts index ba0608b..20341fe 100644 --- a/src/adapters/ghostmarket-polygon-2/index.ts +++ b/src/adapters/ghostmarket-polygon-2/index.ts @@ -25,7 +25,7 @@ class Element { sdk: any; constructor() { - this.name = "ghostmarket-polygon"; + this.name = "ghostmarket-polygon-2"; this.protocol = "matic"; this.block = 39033114; this.contract = "0x3b48563237c32a1f886fd19db6f5affd23855e2a"; From a2cac269da0f30fa106f6d83673ea8458de8d878 Mon Sep 17 00:00:00 2001 From: NeoDashboard Date: Fri, 3 Mar 2023 15:28:08 +0100 Subject: [PATCH 5/6] Fix bug GM adapter --- src/adapters/ghostmarket-avalanche-1/index.ts | 25 +++++++++++-------- src/adapters/ghostmarket-avalanche-2/index.ts | 25 +++++++++++-------- src/adapters/ghostmarket-bsc-1/index.ts | 25 +++++++++++-------- src/adapters/ghostmarket-bsc-2/index.ts | 25 +++++++++++-------- src/adapters/ghostmarket-ethereum-1/index.ts | 25 +++++++++++-------- src/adapters/ghostmarket-ethereum-2/index.ts | 25 +++++++++++-------- src/adapters/ghostmarket-polygon-1/index.ts | 25 +++++++++++-------- src/adapters/ghostmarket-polygon-2/index.ts | 25 +++++++++++-------- 8 files changed, 112 insertions(+), 88 deletions(-) diff --git a/src/adapters/ghostmarket-avalanche-1/index.ts b/src/adapters/ghostmarket-avalanche-1/index.ts index 5888b34..19e4689 100644 --- a/src/adapters/ghostmarket-avalanche-1/index.ts +++ b/src/adapters/ghostmarket-avalanche-1/index.ts @@ -71,18 +71,21 @@ class Element { const token = this._getToken(event); const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); const po = await priceSdk.get(token, this.protocol, block.timestamp); - let price = event.returnValues["newLeftFill"]; - let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - let seller = event.returnValues["leftMaker"].toLowerCase(); - let buyer = event.returnValues["rightMaker"].toLowerCase(); - let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); - if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { - price = event.returnValues["newRightFill"]; - nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - seller = event.returnValues["rightMaker"]; - buyer = event.returnValues["leftMaker"]; - params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + let nftSide = "leftMaker" + let moneySide = "rightMaker" + let priceField = "newLeftFill" + let nftData = "leftAsset" + if (event.returnValues["leftAsset"]['assetClass'] == '0xaaaebeba') { // != 0x73ad2146 or != 0x973bb640 + nftSide = "rightMaker" + moneySide = "leftMaker" + priceField = "newRightFill" + nftData = "rightAsset" } + let price = event.returnValues[priceField]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues[nftSide].toLowerCase(); + let buyer = event.returnValues[moneySide].toLowerCase(); + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues[nftData]["data"]); let nftContract = params[0]; let tokenId = params[1]; if (buyer == "0x0c823cd09642864f495f0a474e1d26dea9a516f9") { diff --git a/src/adapters/ghostmarket-avalanche-2/index.ts b/src/adapters/ghostmarket-avalanche-2/index.ts index df50cea..0070e95 100644 --- a/src/adapters/ghostmarket-avalanche-2/index.ts +++ b/src/adapters/ghostmarket-avalanche-2/index.ts @@ -70,18 +70,21 @@ class Element { const token = this._getToken(event); const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); const po = await priceSdk.get(token, this.protocol, block.timestamp); - let price = event.returnValues["newLeftFill"]; - let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - let seller = event.returnValues["leftMaker"].toLowerCase(); - let buyer = event.returnValues["rightMaker"].toLowerCase(); - let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); - if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { - price = event.returnValues["newRightFill"]; - nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - seller = event.returnValues["rightMaker"]; - buyer = event.returnValues["leftMaker"]; - params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + let nftSide = "leftMaker" + let moneySide = "rightMaker" + let priceField = "newLeftFill" + let nftData = "leftAsset" + if (event.returnValues["leftAsset"]['assetClass'] == '0xaaaebeba') { // != 0x73ad2146 or != 0x973bb640 + nftSide = "rightMaker" + moneySide = "leftMaker" + priceField = "newRightFill" + nftData = "rightAsset" } + let price = event.returnValues[priceField]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues[nftSide].toLowerCase(); + let buyer = event.returnValues[moneySide].toLowerCase(); + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues[nftData]["data"]); let nftContract = params[0]; let tokenId = params[1]; if (buyer == "0x0c823cd09642864f495f0a474e1d26dea9a516f9") { diff --git a/src/adapters/ghostmarket-bsc-1/index.ts b/src/adapters/ghostmarket-bsc-1/index.ts index 33ea000..19900a4 100644 --- a/src/adapters/ghostmarket-bsc-1/index.ts +++ b/src/adapters/ghostmarket-bsc-1/index.ts @@ -71,18 +71,21 @@ class Element { const token = this._getToken(event); const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); const po = await priceSdk.get(token, this.protocol, block.timestamp); - let price = event.returnValues["newLeftFill"]; - let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - let seller = event.returnValues["leftMaker"].toLowerCase(); - let buyer = event.returnValues["rightMaker"].toLowerCase(); - let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); - if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { - price = event.returnValues["newRightFill"]; - nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - seller = event.returnValues["rightMaker"]; - buyer = event.returnValues["leftMaker"]; - params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + let nftSide = "leftMaker" + let moneySide = "rightMaker" + let priceField = "newLeftFill" + let nftData = "leftAsset" + if (event.returnValues["leftAsset"]['assetClass'] == '0xaaaebeba') { // != 0x73ad2146 or != 0x973bb640 + nftSide = "rightMaker" + moneySide = "leftMaker" + priceField = "newRightFill" + nftData = "rightAsset" } + let price = event.returnValues[priceField]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues[nftSide].toLowerCase(); + let buyer = event.returnValues[moneySide].toLowerCase(); + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues[nftData]["data"]); let nftContract = params[0]; let tokenId = params[1]; if (buyer == "0x32e0c20421c96ca4b423a7806e151e953c647c48") { diff --git a/src/adapters/ghostmarket-bsc-2/index.ts b/src/adapters/ghostmarket-bsc-2/index.ts index 037172e..c638a94 100644 --- a/src/adapters/ghostmarket-bsc-2/index.ts +++ b/src/adapters/ghostmarket-bsc-2/index.ts @@ -70,18 +70,21 @@ class Element { const token = this._getToken(event); const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); const po = await priceSdk.get(token, this.protocol, block.timestamp); - let price = event.returnValues["newLeftFill"]; - let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - let seller = event.returnValues["leftMaker"].toLowerCase(); - let buyer = event.returnValues["rightMaker"].toLowerCase(); - let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); - if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { - price = event.returnValues["newRightFill"]; - nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - seller = event.returnValues["rightMaker"]; - buyer = event.returnValues["leftMaker"]; - params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + let nftSide = "leftMaker" + let moneySide = "rightMaker" + let priceField = "newLeftFill" + let nftData = "leftAsset" + if (event.returnValues["leftAsset"]['assetClass'] == '0xaaaebeba') { // != 0x73ad2146 + nftSide = "rightMaker" + moneySide = "leftMaker" + priceField = "newRightFill" + nftData = "rightAsset" } + let price = event.returnValues[priceField]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues[nftSide].toLowerCase(); + let buyer = event.returnValues[moneySide].toLowerCase(); + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues[nftData]["data"]); let nftContract = params[0]; let tokenId = params[1]; if (buyer == "0x32e0c20421c96ca4b423a7806e151e953c647c48") { diff --git a/src/adapters/ghostmarket-ethereum-1/index.ts b/src/adapters/ghostmarket-ethereum-1/index.ts index 52666c6..6353aba 100644 --- a/src/adapters/ghostmarket-ethereum-1/index.ts +++ b/src/adapters/ghostmarket-ethereum-1/index.ts @@ -71,18 +71,21 @@ class Element { const token = this._getToken(event); const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); const po = await priceSdk.get(token, this.protocol, block.timestamp); - let price = event.returnValues["newLeftFill"]; - let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - let seller = event.returnValues["leftMaker"].toLowerCase(); - let buyer = event.returnValues["rightMaker"].toLowerCase(); - let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); - if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { - price = event.returnValues["newRightFill"]; - nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - seller = event.returnValues["rightMaker"]; - buyer = event.returnValues["leftMaker"]; - params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + let nftSide = "leftMaker" + let moneySide = "rightMaker" + let priceField = "newLeftFill" + let nftData = "leftAsset" + if (event.returnValues["leftAsset"]['assetClass'] == '0xaaaebeba') { // != 0x73ad2146 or != 0x973bb640 + nftSide = "rightMaker" + moneySide = "leftMaker" + priceField = "newRightFill" + nftData = "rightAsset" } + let price = event.returnValues[priceField]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues[nftSide].toLowerCase(); + let buyer = event.returnValues[moneySide].toLowerCase(); + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues[nftData]["data"]); let nftContract = params[0]; let tokenId = params[1]; if (buyer == "0x2debb6ced142197bec08d76d3ecce828b3b261ee") { diff --git a/src/adapters/ghostmarket-ethereum-2/index.ts b/src/adapters/ghostmarket-ethereum-2/index.ts index 5cfe06a..fd177ea 100644 --- a/src/adapters/ghostmarket-ethereum-2/index.ts +++ b/src/adapters/ghostmarket-ethereum-2/index.ts @@ -70,18 +70,21 @@ class Element { const token = this._getToken(event); const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); const po = await priceSdk.get(token, this.protocol, block.timestamp); - let price = event.returnValues["newLeftFill"]; - let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - let seller = event.returnValues["leftMaker"].toLowerCase(); - let buyer = event.returnValues["rightMaker"].toLowerCase(); - let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); - if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { - price = event.returnValues["newRightFill"]; - nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - seller = event.returnValues["rightMaker"]; - buyer = event.returnValues["leftMaker"]; - params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + let nftSide = "leftMaker" + let moneySide = "rightMaker" + let priceField = "newLeftFill" + let nftData = "leftAsset" + if (event.returnValues["leftAsset"]['assetClass'] == '0xaaaebeba') { // != 0x73ad2146 or != 0x973bb640 + nftSide = "rightMaker" + moneySide = "leftMaker" + priceField = "newRightFill" + nftData = "rightAsset" } + let price = event.returnValues[priceField]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues[nftSide].toLowerCase(); + let buyer = event.returnValues[moneySide].toLowerCase(); + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues[nftData]["data"]); let nftContract = params[0]; let tokenId = params[1]; if (buyer == "0x2debb6ced142197bec08d76d3ecce828b3b261ee") { diff --git a/src/adapters/ghostmarket-polygon-1/index.ts b/src/adapters/ghostmarket-polygon-1/index.ts index c99e345..7e9a083 100644 --- a/src/adapters/ghostmarket-polygon-1/index.ts +++ b/src/adapters/ghostmarket-polygon-1/index.ts @@ -71,18 +71,21 @@ class Element { const token = this._getToken(event); const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); const po = await priceSdk.get(token, this.protocol, block.timestamp); - let price = event.returnValues["newLeftFill"]; - let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - let seller = event.returnValues["leftMaker"].toLowerCase(); - let buyer = event.returnValues["rightMaker"].toLowerCase(); - let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); - if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { - price = event.returnValues["newRightFill"]; - nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - seller = event.returnValues["rightMaker"]; - buyer = event.returnValues["leftMaker"]; - params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + let nftSide = "leftMaker" + let moneySide = "rightMaker" + let priceField = "newLeftFill" + let nftData = "leftAsset" + if (event.returnValues["leftAsset"]['assetClass'] == '0xaaaebeba') { // != 0x73ad2146 or != 0x973bb640 + nftSide = "rightMaker" + moneySide = "leftMaker" + priceField = "newRightFill" + nftData = "rightAsset" } + let price = event.returnValues[priceField]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues[nftSide].toLowerCase(); + let buyer = event.returnValues[moneySide].toLowerCase(); + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues[nftData]["data"]); let nftContract = params[0]; let tokenId = params[1]; if (buyer == "0x09236d6b740ac67dca842d9db6fa4d067a684e76") { diff --git a/src/adapters/ghostmarket-polygon-2/index.ts b/src/adapters/ghostmarket-polygon-2/index.ts index 20341fe..f95c7d7 100644 --- a/src/adapters/ghostmarket-polygon-2/index.ts +++ b/src/adapters/ghostmarket-polygon-2/index.ts @@ -70,18 +70,21 @@ class Element { const token = this._getToken(event); const symbol: ISymbolAPIResponse = await symbolSdk.get(token, this.protocol); const po = await priceSdk.get(token, this.protocol, block.timestamp); - let price = event.returnValues["newLeftFill"]; - let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - let seller = event.returnValues["leftMaker"].toLowerCase(); - let buyer = event.returnValues["rightMaker"].toLowerCase(); - let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["leftAsset"]["data"]); - if (event.returnValues["leftAsset"]['assetClass'] != '0x73ad2146') { - price = event.returnValues["newRightFill"]; - nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); - seller = event.returnValues["rightMaker"]; - buyer = event.returnValues["leftMaker"]; - params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues["rightAsset"]["data"]); + let nftSide = "leftMaker" + let moneySide = "rightMaker" + let priceField = "newLeftFill" + let nftData = "leftAsset" + if (event.returnValues["leftAsset"]['assetClass'] == '0xaaaebeba') { // != 0x73ad2146 or != 0x973bb640 + nftSide = "rightMaker" + moneySide = "leftMaker" + priceField = "newRightFill" + nftData = "rightAsset" } + let price = event.returnValues[priceField]; + let nativePrice = new BigNumber(price).dividedBy(10 ** (symbol?.decimals || 0)); + let seller = event.returnValues[nftSide].toLowerCase(); + let buyer = event.returnValues[moneySide].toLowerCase(); + let params = this.sdk.web3.eth.abi.decodeParameters(['address', 'uint256'], event.returnValues[nftData]["data"]); let nftContract = params[0]; let tokenId = params[1]; if (buyer == "0x09236d6b740ac67dca842d9db6fa4d067a684e76") { From 17f7e3101c5209fd3cf11ecf3191feeac5f2a1b7 Mon Sep 17 00:00:00 2001 From: NeoDashboard Date: Fri, 3 Mar 2023 16:09:29 +0100 Subject: [PATCH 6/6] Fix get token issue --- src/adapters/ghostmarket-avalanche-1/index.ts | 2 +- src/adapters/ghostmarket-avalanche-2/index.ts | 2 +- src/adapters/ghostmarket-bsc-1/index.ts | 2 +- src/adapters/ghostmarket-bsc-2/index.ts | 2 +- src/adapters/ghostmarket-ethereum-1/index.ts | 2 +- src/adapters/ghostmarket-ethereum-2/index.ts | 2 +- src/adapters/ghostmarket-polygon-1/index.ts | 2 +- src/adapters/ghostmarket-polygon-2/index.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/adapters/ghostmarket-avalanche-1/index.ts b/src/adapters/ghostmarket-avalanche-1/index.ts index 19e4689..fbe536c 100644 --- a/src/adapters/ghostmarket-avalanche-1/index.ts +++ b/src/adapters/ghostmarket-avalanche-1/index.ts @@ -52,7 +52,7 @@ class Element { _getToken = (event: EventData): string => { let token = "avax"; - if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["leftAsset"]['assetClass'] != '0xaaaebeba') { if (event.returnValues["rightAsset"]["data"] != "0x") { token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); } diff --git a/src/adapters/ghostmarket-avalanche-2/index.ts b/src/adapters/ghostmarket-avalanche-2/index.ts index 0070e95..4193e34 100644 --- a/src/adapters/ghostmarket-avalanche-2/index.ts +++ b/src/adapters/ghostmarket-avalanche-2/index.ts @@ -51,7 +51,7 @@ class Element { _getToken = (event: EventData): string => { let token = "avax"; - if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["leftAsset"]['assetClass'] != '0xaaaebeba') { if (event.returnValues["rightAsset"]["data"] != "0x") { token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); } diff --git a/src/adapters/ghostmarket-bsc-1/index.ts b/src/adapters/ghostmarket-bsc-1/index.ts index 19900a4..a8b81ee 100644 --- a/src/adapters/ghostmarket-bsc-1/index.ts +++ b/src/adapters/ghostmarket-bsc-1/index.ts @@ -52,7 +52,7 @@ class Element { _getToken = (event: EventData): string => { let token = "bnb"; - if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["leftAsset"]['assetClass'] != '0xaaaebeba') { if (event.returnValues["rightAsset"]["data"] != "0x") { token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); } diff --git a/src/adapters/ghostmarket-bsc-2/index.ts b/src/adapters/ghostmarket-bsc-2/index.ts index c638a94..2f04db1 100644 --- a/src/adapters/ghostmarket-bsc-2/index.ts +++ b/src/adapters/ghostmarket-bsc-2/index.ts @@ -51,7 +51,7 @@ class Element { _getToken = (event: EventData): string => { let token = "bnb"; - if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["leftAsset"]['assetClass'] != '0xaaaebeba') { if (event.returnValues["rightAsset"]["data"] != "0x") { token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); } diff --git a/src/adapters/ghostmarket-ethereum-1/index.ts b/src/adapters/ghostmarket-ethereum-1/index.ts index 6353aba..4d1ddea 100644 --- a/src/adapters/ghostmarket-ethereum-1/index.ts +++ b/src/adapters/ghostmarket-ethereum-1/index.ts @@ -52,7 +52,7 @@ class Element { _getToken = (event: EventData): string => { let token = "0x0000000000000000000000000000000000000000"; - if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["leftAsset"]['assetClass'] != '0xaaaebeba') { if (event.returnValues["rightAsset"]["data"] != "0x") { token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); } diff --git a/src/adapters/ghostmarket-ethereum-2/index.ts b/src/adapters/ghostmarket-ethereum-2/index.ts index fd177ea..1a66e73 100644 --- a/src/adapters/ghostmarket-ethereum-2/index.ts +++ b/src/adapters/ghostmarket-ethereum-2/index.ts @@ -51,7 +51,7 @@ class Element { _getToken = (event: EventData): string => { let token = "0x0000000000000000000000000000000000000000"; - if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["leftAsset"]['assetClass'] != '0xaaaebeba') { if (event.returnValues["rightAsset"]["data"] != "0x") { token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); } diff --git a/src/adapters/ghostmarket-polygon-1/index.ts b/src/adapters/ghostmarket-polygon-1/index.ts index 7e9a083..b5d2e6f 100644 --- a/src/adapters/ghostmarket-polygon-1/index.ts +++ b/src/adapters/ghostmarket-polygon-1/index.ts @@ -52,7 +52,7 @@ class Element { _getToken = (event: EventData): string => { let token = "matic"; - if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["leftAsset"]['assetClass'] != '0xaaaebeba') { if (event.returnValues["rightAsset"]["data"] != "0x") { token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); } diff --git a/src/adapters/ghostmarket-polygon-2/index.ts b/src/adapters/ghostmarket-polygon-2/index.ts index f95c7d7..9524e68 100644 --- a/src/adapters/ghostmarket-polygon-2/index.ts +++ b/src/adapters/ghostmarket-polygon-2/index.ts @@ -51,7 +51,7 @@ class Element { _getToken = (event: EventData): string => { let token = "matic"; - if (event.returnValues["leftAsset"]['assetClass'] == '0x73ad2146') { + if (event.returnValues["leftAsset"]['assetClass'] != '0xaaaebeba') { if (event.returnValues["rightAsset"]["data"] != "0x") { token = this.sdk.web3.eth.abi.decodeParameter('address', event.returnValues["rightAsset"]["data"]).toLowerCase(); }