diff --git a/src/Classes/ProjectBot.ts b/src/Classes/ProjectBot.ts index a62c4d6..bac280c 100644 --- a/src/Classes/ProjectBot.ts +++ b/src/Classes/ProjectBot.ts @@ -19,7 +19,6 @@ import { import { ensOrAddress, replaceVideoWithGIF } from './APIBots/utils' import { - getProjectFloor, getProjectInvocations, getRandomOobForProject, getToken, @@ -36,6 +35,9 @@ const ONE_MILLION = 1e6 type ReservoirTokenResponse = paths['/tokens/v7']['get']['responses']['200']['schema'] +type ReservoirCollectionResponse = + paths['/collections/v5']['get']['responses']['200']['schema'] + /** * Bot for handling projects */ @@ -152,12 +154,36 @@ export class ProjectBot { } if (content.toLowerCase().includes('#floor')) { - const floorToken = await getProjectFloor(this.id) - if (floorToken && floorToken.list_eth_price) { - content = `#${floorToken.invocation}` - } else { + try { + // Reservoir API collections are indexed like: 78000000:78999999 + const floorResponse = await axios.request({ + method: 'GET', + url: `https://api.reservoir.tools/collections/v5?useNonFlaggedFloorAsk=true&id=${ + this.coreContract + }%3A${this.projectNumber * ONE_MILLION}%3A${ + (this.projectNumber + 1) * ONE_MILLION - 1 + }`, + headers: { + accept: '*/*', + 'x-api-key': process.env.RESERVOIR_API_KEY, + }, + timeout: 3000, + }) + const floorToken = + floorResponse.data.collections?.[0]?.floorAsk?.token?.tokenId ?? '' + + if (floorToken) { + content = `#${parseInt(floorToken) % ONE_MILLION}` + } else { + msg.channel.send( + `Sorry, looks like no ${this.projectName} tokens are for sale!` + ) + return + } + } catch (e) { + console.error('Error getting floor token for:', this.projectName, e) msg.channel.send( - `Sorry, looks like no ${this.projectName} tokens are for sale!` + `Sorry, looks like there was an error retrieving the floor token for ${this.projectName}. Try again in a bit!` ) return } diff --git a/src/Data/graphql/artbot-hasura-queries.graphql b/src/Data/graphql/artbot-hasura-queries.graphql index dc2e3db..caeb5ac 100644 --- a/src/Data/graphql/artbot-hasura-queries.graphql +++ b/src/Data/graphql/artbot-hasura-queries.graphql @@ -150,16 +150,6 @@ query getProjectInvocations($id: String!) { } } -query getProjectFloor($id: String!) { - projects_metadata(where: { id: { _eq: $id } }) { - tokens(limit: 3, order_by: { list_eth_price: asc }) { - invocation - list_eth_price - is_flagged - } - } -} - query getAllContracts { contracts_metadata { ...ContractDetail diff --git a/src/Data/queryGraphQL.ts b/src/Data/queryGraphQL.ts index 9681332..503ff3f 100644 --- a/src/Data/queryGraphQL.ts +++ b/src/Data/queryGraphQL.ts @@ -10,7 +10,6 @@ import { GetContractProjectsDocument, GetProjectInvocationsDocument, GetProjectInContractsDocument, - GetProjectFloorDocument, TokenDetailFragment, ProjectTokenDetailFragment, GetMostRecentMintedTokenByContractDocument, @@ -417,25 +416,6 @@ export async function getProjectInvocations(projectId: string) { } } -export async function getProjectFloor(projectId: string) { - const hasuraClient = getClientForContract(projectId.split('-')[0]) - try { - const { data } = await hasuraClient - .query(GetProjectFloorDocument, { - id: projectId, - }) - .toPromise() - - if (!data) { - throw Error('No data returned from getProjectFloor Hasura query') - } - return data.projects_metadata[0].tokens.find((token) => !token.is_flagged) - } catch (err) { - console.error(err) - return undefined - } -} - export async function getToken(tokenId: string): Promise { const hasuraClient = getClientForContract(tokenId.split('-')[0])