Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 1x 1x 1x 1x 1x 1x 1x 47x 47x 45x 47x 43x 92x 1671x 18x 21x 14x 3x 3x 15x 6x 6x 9x 9x 9x 9x 2x 11x 7x 7x 4x 7x 7x 1671x | import { AbiCoder, Log, TransactionResponse, ethers } from "ethers";
import { LogParser } from "./parser.definition";
import { config } from "../config";
import openseaSeaportABI from '../abi/seaportABI.json';
import { createLogger } from "../logging.utils";
const seaportInterface = new ethers.Interface(openseaSeaportABI)
const logger = createLogger('openseaseaport.parser')
export class OpenSeaSeaportParser implements LogParser {
platform: string = 'opensea';
parseLogs(transaction:TransactionResponse, logs: Log[], tokenId: string): number {
let result = this.decode(transaction, logs, tokenId, false)
if (result.length === 0)
result = this.decode(transaction, logs, tokenId, true)
if (result.length) return parseFloat(result.reduce((previous,current) => previous + current, BigInt(0)).toString())/1000;
return undefined
}
decode(transaction:TransactionResponse, logs: Log[], tokenId: string, allowUnknownOfferer:boolean) {
return logs.map((log: any) => {
if (log.topics[0].toLowerCase() === '0x9d9af8e38d66c62e2c12f0225249fd9d721c54b83f48d9352c97c6cacdcb6f31') {
const logDescription = seaportInterface.parseLog(log);
if (logDescription.args.offer.filter( o => o.identifier.toString() !== '0').length &&
logDescription.args.consideration.filter( o => o.identifier.toString() !== '0').length) {
// complex opensea trade detected, ignore
logger.info(`complex opensea trade detected for ${transaction.hash} log ${log.index}, ignoring...`)
return
}
if (!allowUnknownOfferer && transaction.from !== logDescription.args.offerer) {
logger.info(`offerer is not the transaction emitter, ${transaction.hash} log ${log.index}, ignoring...`)
return
}
const matchingOffers = logDescription.args.offer.filter(
o => o.identifier.toString() === tokenId ||
o.identifier.toString() === '0');
const tokenCount = logDescription.args.offer.length;
if (matchingOffers.length === 0) {
return
}
let amounts = logDescription.args.consideration.map(c => BigInt(c.amount))
// add weth
const wethOffers = matchingOffers.map(o => o.token === '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2' && o.amount > 0 ? BigInt(o.amount) : BigInt(0));
if (wethOffers.length > 0 && wethOffers[0] != BigInt(0)) {
amounts = wethOffers
}
const amount = amounts.reduce((previous,current) => previous + current, BigInt(0))
return amount / BigInt('1000000000000000') / BigInt(tokenCount)
}
}).filter(n => n !== undefined)
}
} |