Skip to content

Commit

Permalink
working blobert attributes
Browse files Browse the repository at this point in the history
  • Loading branch information
RedBeardEth committed Feb 22, 2024
1 parent 52bdedd commit 9d7379b
Show file tree
Hide file tree
Showing 10 changed files with 1,159 additions and 64 deletions.
1 change: 1 addition & 0 deletions apps/nextjs/public/collections/blobert.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1,046 changes: 1,046 additions & 0 deletions apps/nextjs/src/abi/L2/Blobert.json

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions apps/nextjs/src/app/collection/CollectionsList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ export default async function CollectionsList() {
link: "goldentoken",
image: "/collections/goldentoken.svg",
},
{
name: "Blobert",
link: "blobert",
image: "/collections/blobert.svg",
},
];

return (
Expand Down
124 changes: 81 additions & 43 deletions apps/nextjs/src/inngest/fetch_metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,20 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import { NextResponse } from "next/server";
import { SUPPORTED_L2_CHAIN_ID } from "@/constants/env";
import { hash, shortString, uint256 } from "starknet";
import {
constants,
Contract,
hash,
RpcProvider,
shortString,
uint256,
} from "starknet";

import type { SQL } from "@realms-world/db";
import { Collections, getCollectionAddresses } from "@realms-world/constants";
import { and, db, eq, inArray, schema, sql } from "@realms-world/db";

import blobertABI from "../abi/L2/Blobert.json";
//import { Client } from "https://esm.sh/ts-postgres";

import { inngest } from "./client";
Expand All @@ -24,37 +32,26 @@ function eventKey(name: string) {
export const tokenURI = eventKey("tokenURI");
export const token_uri = eventKey("token_uri");
export const svg_image = eventKey("svg_image");

export const fetchMetadata = inngest.createFunction(
{
name: "fetchMetadata",
id: "fetchMeta",
concurrency: {
limit: 3,
},
retries: 1,
},
{ event: "nft/mint" },
async ({ event, step }) => {
const metadata = await step.run("Fetch metadata", async () => {
const tokenId = uint256.bnToUint256(
BigInt(event.data.tokenId.toString()),
);
const fetchUrl = `https://starknet-${!process.env.NEXT_PUBLIC_IS_TESTNET || process.env.NEXT_PUBLIC_IS_TESTNET == "false" ? "mainnet" : "sepolia"}.blastapi.io/${process.env.NEXT_PUBLIC_BLAST_API}`;
const providerUrl = /*`https://starknet-${!process.env.NEXT_PUBLIC_IS_TESTNET || process.env.NEXT_PUBLIC_IS_TESTNET == "false" ? "mainnet" : "sepolia"}.blastapi.io/${process.env.NEXT_PUBLIC_BLAST_API}`;*/ `https://starknet-mainnet.blastapi.io/${process.env.NEXT_PUBLIC_BLAST_API}`;
const provider = new RpcProvider({
nodeUrl: providerUrl,
});
const tokenId = uint256.bnToUint256(BigInt(event.data.tokenId.toString()));

let entryPointSelector: string;
switch (event.data.contract_address) {
case getCollectionAddresses(Collections.BEASTS)[SUPPORTED_L2_CHAIN_ID]!:
entryPointSelector = tokenURI;
break;
case getCollectionAddresses(Collections.BLOBERT)[
SUPPORTED_L2_CHAIN_ID
]!:
entryPointSelector = svg_image;
break;
default:
entryPointSelector = token_uri;
break;
}
const response = await fetch(fetchUrl, {
const metadata = await step.run("Fetch metadata", async () => {
const response = await fetch(providerUrl, {
method: "POST",
headers: {
"Content-Type": "application/json",
Expand All @@ -64,37 +61,83 @@ export const fetchMetadata = inngest.createFunction(
method: "starknet_call",
params: [
{
contract_address: event.data.contract_address,
entry_point_selector: entryPointSelector, // Token URI
contract_address:
/*"0x00539f522b29ae9251dbf7443c7a950cf260372e69efab3710a11bf17a9599f1",*/ event
.data.contract_address,
entry_point_selector: getCollectionAddresses(Collections.BEASTS)[
SUPPORTED_L2_CHAIN_ID
]!
? tokenURI
: token_uri, // Token URI
calldata: [tokenId.low, tokenId.high],
},
"pending",
],
id: 0,
}),
});
const responseJson = await response.json();
return responseJson;
return await response.json();
});

if (metadata.error) {
console.log(metadata.error);
await step.sleep("fetch sleep", "20s");
throw new Error("Failed to fetch item from Blast API");
}

let value: any = [];
const value: any = [];
let jsonString: string;
let parsedJson: any = {};
const flattenedAttributes: Record<string, string> = {};

if (
event.data.contract_address ==
getCollectionAddresses(Collections.BLOBERT)[SUPPORTED_L2_CHAIN_ID]!
) {
for (const metaResult of metadata.result.length) {
const result = shortString.decodeShortString(metaResult);
value.push(result);
metadata.result.forEach((result: any) => {
value.push(shortString.decodeShortString(result));
});
value.push(metadata.result.pending_word);
jsonString = atob(value.join("").substring(29));
parsedJson = JSON.parse(jsonString);
parsedJson.attributes = parsedJson.attributes.map((attribute: any) => {
if (attribute.trait) {
return {
trait_type: attribute.trait,
value: attribute.value,
};
}
});
if (parsedJson.attributes[0] == undefined) {
parsedJson.attributes = [
{ trait_type: "Honorary", value: parsedJson.name },
];
}
value = ['"image":"', ...value];
jsonString = value.join("");
//console.log(flattenedAttributes);

/*const blobertContract = new Contract(
blobertABI,
"0x00539f522b29ae9251dbf7443c7a950cf260372e69efab3710a11bf17a9599f1", //event.data.contract_address,
provider,
);
const traitsResponse = await blobertContract.traits(tokenId);
console.log(traitsResponse);
if (traitsResponse.variant.Custom != undefined) {
parsedJson.attributes.push({
trait_type: "Honorary",
value: traitsResponse.variant.Custom,
});
} else {
for (const [key, value] of Object.entries(
traitsResponse.variant.Regular,
)) {
parsedJson.attributes.push({
trait_type: Object.keys(value)[0],
value: value[Object.keys(value)[0]],
});
}
}*/
} else {
for (let i = 2; i < metadata.result.length; i++) {
const result = shortString.decodeShortString(metadata.result[i]);
Expand All @@ -110,15 +153,12 @@ export const fetchMetadata = inngest.createFunction(
(match: any, name: any) => `"name":"${name.replaceAll('"', '\\"')}",`,
)
.replace(regex, "");
}

const parsedJson = JSON.parse(jsonString);

const flattenedAttributes: Record<string, string> = {};

if (parsedJson.attributes) {
for (const attribute of parsedJson.attributes) {
flattenedAttributes[attribute.trait_type] = attribute.value;
//}
parsedJson = JSON.parse(jsonString);
if (parsedJson.attributes) {
for (const attribute of parsedJson.attributes) {
flattenedAttributes[attribute.trait_type] = attribute.value;
}
}
}

Expand Down Expand Up @@ -258,8 +298,6 @@ export const fetchMetadata = inngest.createFunction(
});
}
}
console.log(addedTokenAttributes);
console.log(attributesCountMap);

tokenAttributeResult = await db
.insert(schema.erc721TokenAttributes)
Expand Down
7 changes: 4 additions & 3 deletions packages/apibara/local.env
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@ STREAM_URL='https://sepolia.starknet.a5a.ch'
BRIDGE_STARTING_BLOCK=88589
BRIDGE_CONTRACT='0x7c76a71952ce3acd1f953fd2a3fda8564408b821ff367041c89f44526076633'

ERC721_STARTING_BLOCK=36804
ERC721_STARTING_BLOCK=37300
BEASTS_CONTRACT='0x0158160018d590d93528995b340260e65aedd76d28a686e9daa5c4e8fad0c5dd'
GOLDEN_TOKEN_CONTRACT='0x04f5e296c805126637552cf3930e857f380e7c078e8f00696de4fc8545356b1d'
BLOBERT_CONTRACT='0x069d6a10a83f2f84b37aa1ab140d610845c6e02c255d87ba0a5f7175a98ffcfe'
BLOBERT_CONTRACT='0x007075083c7f643a2009cf1dfa28dfec9366f7d374743c2e378e03c01e16c3af'

MARKET_CONTRACT=0x07bb44fd93f79c3529acc8b03fdd749f60e8ed4e0e57364eef6a971550cccae4
MARKET_STARTING_BLOCK=506960

INNGEST_EVENT_KEY='Zr3NCNM9fqzCgAO1Cf_BnQhoBKaf20wYYqfssY-_Zl7DzkSUACjYUJAt-nthVsgB7qmw1iiJcvBKm9ARMlPxVg'
POSTGRES_CONNECTION_STRING="postgres://RedBeardEth:[email protected]/production?sslmode=require"
POSTGRES_CONNECTION_STRING="postgres://RedBeardEth:[email protected]/sepolia?sslmode=require"
INNGEST_ENV='testnet'
5 changes: 3 additions & 2 deletions packages/apibara/mainnet.env
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ BRIDGE_STARTING_BLOCK=88589
BRIDGE_CONTRACT='0x7c76a71952ce3acd1f953fd2a3fda8564408b821ff367041c89f44526076633'

ERC721_STARTING_BLOCK=366310

BEASTS_CONTRACT='0x0158160018d590d93528995b340260e65aedd76d28a686e9daa5c4e8fad0c5dd'
GOLDEN_TOKEN_CONTRACT='0x04f5e296c805126637552cf3930e857f380e7c078e8f00696de4fc8545356b1d'
BLOBERT_CONTRACT=''
BLOBERT_CONTRACT='0x00539f522b29ae9251dbf7443c7a950cf260372e69efab3710a11bf17a9599f1'

MARKET_CONTRACT=0x07bb44fd93f79c3529acc8b03fdd749f60e8ed4e0e57364eef6a971550cccae4
MARKET_STARTING_BLOCK=506960

INNGEST_EVENT_KEY='Zr3NCNM9fqzCgAO1Cf_BnQhoBKaf20wYYqfssY-_Zl7DzkSUACjYUJAt-nthVsgB7qmw1iiJcvBKm9ARMlPxVg'
INNGEST_EVENT_KEY='Zr3NCNM9fqzCgAO1Cf_BnQhoBKaf20wYYqfssY-_Zl7DzkSUACjYUJAt-nthVsgB7qmw1iiJcvBKm9ARMlPxVg'
2 changes: 1 addition & 1 deletion packages/apibara/sepolia.env
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ BRIDGE_CONTRACT='0x024f21982680442892d2f7ac4cee98c7d62708b04fdf9f8a0453415baca4b
ERC721_STARTING_BLOCK=17282
BEASTS_CONTRACT='0x03065c1db93be057c40fe92c9cba7f898de8d3622693d128e4e97fdc957808a3'
GOLDEN_TOKEN_CONTRACT='0x024f21982680442892d2f7ac4cee98c7d62708b04fdf9f8a0453415baca4b16f'
BLOBERT_CONTRACT='0x069d6a10a83f2f84b37aa1ab140d610845c6e02c255d87ba0a5f7175a98ffcfe'
BLOBERT_CONTRACT='0x007075083c7f643a2009cf1dfa28dfec9366f7d374743c2e378e03c01e16c3af'

MARKET_CONTRACT=0x0297e088cd7777bebda7024e2dde81e9b745f41e5de0589c91de5caa885d9c32
MARKET_STARTING_BLOCK=17287
Expand Down
16 changes: 9 additions & 7 deletions packages/apibara/src/erc721_metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,13 @@ export default function transform({ header, events }: Block) {
}

function transferToTask(_header: BlockHeader, { event }: EventWithTransaction) {
if (event.keys.length) {
const from = BigInt(event.keys[1]);
if (event.data) {
const from = BigInt(event.data[0]);
if (from !== 0n) {
return [];
}
const tokenId = uint256
.uint256ToBN({ low: event.keys[3], high: event.keys[4] })
.uint256ToBN({ low: event.data[2], high: event.data[3] })
.toString();
return [
{
Expand All @@ -55,15 +55,16 @@ function transferToTask(_header: BlockHeader, { event }: EventWithTransaction) {
},
},
];
}
if (event.data?.[0]) {
const from = BigInt(event.data[0]);
} else if (event.keys?.length) {
const from = BigInt(event.keys[1]);
if (from !== 0n) {
return [];
}
const tokenId = uint256
.uint256ToBN({ low: event.data[2], high: event.data[3] })
.uint256ToBN({ low: event.keys[3], high: event.keys[4] })
.toString();

//if (tokenId == 6) {
return [
{
name: "nft/mint",
Expand All @@ -73,5 +74,6 @@ function transferToTask(_header: BlockHeader, { event }: EventWithTransaction) {
},
},
];
//}
}
}
12 changes: 6 additions & 6 deletions packages/apibara/src/erc721_tokens.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,19 +45,19 @@ export default function transform({ header, events }: Block) {
function transferToTask(_header: BlockHeader, { event }: EventWithTransaction) {
const isMainnet =
Deno.env.get("STREAM_URL") == "https://mainnet.starknet.a5a.ch";

switch (event.keys[0]) {
const isData = event.data != undefined;
switch (event.keys?.[0]) {
case TRANSFER_EVENT: {
const from = BigInt(isMainnet ? event.data[0] : event.keys[1]);
const from = BigInt(isData ? event.data[0] : event.keys[1]);
const token_id = parseInt(
uint256
.uint256ToBN({
low: isMainnet ? event.data[2] : event.keys[3],
high: isMainnet ? event.data[3] : event.keys[4],
low: isData ? event.data[2] : event.keys[3],
high: isData ? event.data[3] : event.keys[4],
})
.toString(),
);
const owner = isMainnet ? event.data[1] : event.keys[2];
const owner = isData ? event.data[1] : event.keys[2];

if (from == 0n) {
return {
Expand Down
5 changes: 3 additions & 2 deletions packages/constants/src/Collections.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@ export const CollectionAddresses: {
"0x024f21982680442892d2f7ac4cee98c7d62708b04fdf9f8a0453415baca4b16f",
},
[Collections.BLOBERT]: {
[ChainId.SN_MAIN]: "",
[ChainId.SN_MAIN]:
"0x00539f522b29ae9251dbf7443c7a950cf260372e69efab3710a11bf17a9599f1",
[ChainId.SN_SEPOLIA]:
"0x069d6a10a83f2f84b37aa1ab140d610845c6e02c255d87ba0a5f7175a98ffcfe",
"0x007075083c7f643a2009cf1dfa28dfec9366f7d374743c2e378e03c01e16c3af",
},
};
export const CollectionRoyalties: {
Expand Down

0 comments on commit 9d7379b

Please sign in to comment.