diff --git a/indexer/.env.example b/indexer/.env.example index ee452f2..92446f6 100644 --- a/indexer/.env.example +++ b/indexer/.env.example @@ -1,4 +1,5 @@ -DATABASE_URL="file:./dev.db" +# DATABASE_URL="file:./dev.db" +DATABASE_URL="postgresql://postgres:cWiSgoSVm8I6tkkEqfbh@containers-us-west-48.railway.app:5958/railway" NODE_ENV="development" MUMBAI_RPC_PROVIDER="https://polygon-mumbai.g.alchemy.com/v2/nwCEWjd7yikmP8BLQGEv7J89qEj2FnIg" API_ENDPOINT="http://localhost:3000/api/webhooks/indexerWebhooks/" diff --git a/indexer/src/client/generate/index.js b/indexer/src/client/generate/index.js index 4279106..84b10d2 100644 --- a/indexer/src/client/generate/index.js +++ b/indexer/src/client/generate/index.js @@ -126,7 +126,7 @@ const config = { "value": "prisma-client-js" }, "output": { - "value": "/Users/alex/Desktop/disrup3/fromme/indexer/src/client/generate", + "value": "C:\\Users\\Fuet\\OneDrive\\Desktop\\disrup3_repo\\sprint2\\fromme\\indexer\\src\\client\\generate", "fromEnvVar": null }, "config": { @@ -135,7 +135,7 @@ const config = { "binaryTargets": [ { "fromEnvVar": null, - "value": "darwin-arm64", + "value": "windows", "native": true } ], @@ -183,7 +183,7 @@ const PrismaClient = getPrismaClient(config) exports.PrismaClient = PrismaClient Object.assign(exports, Prisma) -path.join(__dirname, "libquery_engine-darwin-arm64.dylib.node"); -path.join(process.cwd(), "src/client/generate/libquery_engine-darwin-arm64.dylib.node") +path.join(__dirname, "query_engine-windows.dll.node"); +path.join(process.cwd(), "src/client/generate/query_engine-windows.dll.node") path.join(__dirname, "schema.prisma"); path.join(process.cwd(), "src/client/generate/schema.prisma") diff --git a/indexer/src/index.ts b/indexer/src/index.ts index 9d419f1..66a152d 100644 --- a/indexer/src/index.ts +++ b/indexer/src/index.ts @@ -24,8 +24,8 @@ const connect = async () => { const trackContractCallback = async () => { const lastBlocks = await prisma.tracker_State.findMany(); - await processFactoryTrackerEvents(lastBlocks[0].lastBlockProcessed, prisma); - await processNftMarketplaceEvents(lastBlocks[0].lastBlockProcessed, prisma); + // await processFactoryTrackerEvents(lastBlocks[0].lastBlockProcessed, prisma); + // await processNftMarketplaceEvents(lastBlocks[0].lastBlockProcessed, prisma); await processDeadEvents(); setTimeout(() => trackContractCallback(), 2000); // Recursividad de trackeo }; @@ -34,7 +34,10 @@ const connect = async () => { const processDeadEvents = async () => { // checkear si hay eventos muertos - const deadEvents = await prisma.dead_events_queue.findMany(); + const deadEventsOriginal = await prisma.dead_events_queue.findMany(); + + const deadEvents = deadEventsOriginal.slice(7,8) + console.log(deadEvents) if(!deadEvents.length) return console.log("No hay que recuperar"); // de ser asi, llamar a callApi con esos datos diff --git a/indexer/src/utils/apiUtils.ts b/indexer/src/utils/apiUtils.ts index f9af924..a7086e5 100644 --- a/indexer/src/utils/apiUtils.ts +++ b/indexer/src/utils/apiUtils.ts @@ -3,9 +3,9 @@ import axios from "axios"; export const callApi = async (endpoint: string, data: any, isDead = false) => { try { - console.log("endpoint:", endpoint); - const x =await axios.post(`${process.env.API_ENDPOINT}${endpoint}`, data); - console.log(x.data) + console.log("endpoint:", endpoint, ' : ', `${process.env.API_ENDPOINT}${endpoint}`); + const x = await axios.post(`${process.env.API_ENDPOINT}${endpoint}`, data); + console.log('DATA :: ', x.data) console.log("callapi success"); return true } catch (error) { diff --git a/t3/.env.example b/t3/.env.example index dccd45d..bb0162d 100644 --- a/t3/.env.example +++ b/t3/.env.example @@ -25,7 +25,6 @@ DISCORD_CLIENT_ID="" DISCORD_CLIENT_SECRET="" # Contract address -NFT_FACTORY = "0xBB645BdAFD93Ca5D91B457709e55C0318a6f5449" # No need to delete from .env.example NEXT_PUBLIC_NFT_STORAGE_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkaWQ6ZXRocjoweDY4ZGUxM2E5OUE0YTkyRDdEMTFDNDMxQ0IzNDc2NDZBOWJCZkRCMzQiLCJpc3MiOiJuZnQtc3RvcmFnZSIsImlhdCI6MTY4Njc3MjAwNjM4OCwibmFtZSI6ImZyb21tZS1kZXYifQ.C-6OrEBBh64q1IowVo_bfRphCq5qo388DMwEcoyfyjg # URL Provider @@ -33,3 +32,5 @@ NEXT_PUBLIC_URL_MUMBAI="" # Private keys NEXT_PUBLIC_PRIVATE_KEY="" + +NEXTAUTH_SECRET='Required' \ No newline at end of file diff --git a/t3/next.config.mjs b/t3/next.config.mjs index 547157e..7fc3084 100644 --- a/t3/next.config.mjs +++ b/t3/next.config.mjs @@ -7,7 +7,7 @@ await import("./src/env.mjs"); /** @type {import("next").NextConfig} */ const config = { images: { - domains: ["ipfs.io"], + domains: ["ipfs.io", "encrypted-tbn0.gstatic.com"], }, reactStrictMode: true, webpack: (config) => { diff --git a/t3/package-lock.json b/t3/package-lock.json index 118acd2..6119b9d 100644 --- a/t3/package-lock.json +++ b/t3/package-lock.json @@ -24,7 +24,7 @@ "axios": "^1.4.0", "dotenv": "^16.3.1", "ethers": "^5.7.2", - "next": "^13.4.2", + "next": "^13.4.10", "next-auth": ">=4.10.2 <=4.20.1", "nft.storage": "^7.1.0", "react": "18.2.0", @@ -3519,9 +3519,9 @@ } }, "node_modules/@next/env": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.4.tgz", - "integrity": "sha512-q/y7VZj/9YpgzDe64Zi6rY1xPizx80JjlU2BTevlajtaE3w1LqweH1gGgxou2N7hdFosXHjGrI4OUvtFXXhGLg==" + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.10.tgz", + "integrity": "sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ==" }, "node_modules/@next/eslint-plugin-next": { "version": "13.4.4", @@ -3533,9 +3533,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.4.tgz", - "integrity": "sha512-xfjgXvp4KalNUKZMHmsFxr1Ug+aGmmO6NWP0uoh4G3WFqP/mJ1xxfww0gMOeMeSq/Jyr5k7DvoZ2Pv+XOITTtw==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.10.tgz", + "integrity": "sha512-4bsdfKmmg7mgFGph0UorD1xWfZ5jZEw4kKRHYEeTK9bT1QnMbPVPlVXQRIiFPrhoDQnZUoa6duuPUJIEGLV1Jg==", "cpu": [ "arm64" ], @@ -3548,9 +3548,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.4.tgz", - "integrity": "sha512-ZY9Ti1hkIwJsxGus3nlubIkvYyB0gNOYxKrfsOrLEqD0I2iCX8D7w8v6QQZ2H+dDl6UT29oeEUdDUNGk4UEpfg==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.10.tgz", + "integrity": "sha512-ngXhUBbcZIWZWqNbQSNxQrB9T1V+wgfCzAor2olYuo/YpaL6mUYNUEgeBMhr8qwV0ARSgKaOp35lRvB7EmCRBg==", "cpu": [ "x64" ], @@ -3563,9 +3563,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.4.tgz", - "integrity": "sha512-+KZnDeMShYkpkqAvGCEDeqYTRADJXc6SY1jWXz+Uo6qWQO/Jd9CoyhTJwRSxvQA16MoYzvILkGaDqirkRNctyA==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.10.tgz", + "integrity": "sha512-SjCZZCOmHD4uyM75MVArSAmF5Y+IJSGroPRj2v9/jnBT36SYFTORN8Ag/lhw81W9EeexKY/CUg2e9mdebZOwsg==", "cpu": [ "arm64" ], @@ -3578,9 +3578,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.4.tgz", - "integrity": "sha512-evC1twrny2XDT4uOftoubZvW3EG0zs0ZxMwEtu/dDGVRO5n5pT48S8qqEIBGBUZYu/Xx4zzpOkIxx1vpWdE+9A==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.10.tgz", + "integrity": "sha512-F+VlcWijX5qteoYIOxNiBbNE8ruaWuRlcYyIRK10CugqI/BIeCDzEDyrHIHY8AWwbkTwe6GRHabMdE688Rqq4Q==", "cpu": [ "arm64" ], @@ -3593,9 +3593,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.4.tgz", - "integrity": "sha512-PX706XcCHr2FfkyhP2lpf+pX/tUvq6/ke7JYnnr0ykNdEMo+sb7cC/o91gnURh4sPYSiZJhsF2gbIqg9rciOHQ==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.10.tgz", + "integrity": "sha512-WDv1YtAV07nhfy3i1visr5p/tjiH6CeXp4wX78lzP1jI07t4PnHHG1WEDFOduXh3WT4hG6yN82EQBQHDi7hBrQ==", "cpu": [ "x64" ], @@ -3608,9 +3608,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.4.tgz", - "integrity": "sha512-TKUUx3Ftd95JlHV6XagEnqpT204Y+IsEa3awaYIjayn0MOGjgKZMZibqarK3B1FsMSPaieJf2FEAcu9z0yT5aA==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.10.tgz", + "integrity": "sha512-zFkzqc737xr6qoBgDa3AwC7jPQzGLjDlkNmt/ljvQJ/Veri5ECdHjZCUuiTUfVjshNIIpki6FuP0RaQYK9iCRg==", "cpu": [ "x64" ], @@ -3623,9 +3623,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.4.tgz", - "integrity": "sha512-FP8AadgSq4+HPtim7WBkCMGbhr5vh9FePXiWx9+YOdjwdQocwoCK5ZVC3OW8oh3TWth6iJ0AXJ/yQ1q1cwSZ3A==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.10.tgz", + "integrity": "sha512-IboRS8IWz5mWfnjAdCekkl8s0B7ijpWeDwK2O8CdgZkoCDY0ZQHBSGiJ2KViAG6+BJVfLvcP+a2fh6cdyBr9QQ==", "cpu": [ "arm64" ], @@ -3638,9 +3638,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.4.tgz", - "integrity": "sha512-3WekVmtuA2MCdcAOrgrI+PuFiFURtSyyrN1I3UPtS0ckR2HtLqyqmS334Eulf15g1/bdwMteePdK363X/Y9JMg==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.10.tgz", + "integrity": "sha512-bSA+4j8jY4EEiwD/M2bol4uVEu1lBlgsGdvM+mmBm/BbqofNBfaZ2qwSbwE2OwbAmzNdVJRFRXQZ0dkjopTRaQ==", "cpu": [ "ia32" ], @@ -3653,9 +3653,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.4.tgz", - "integrity": "sha512-AHRITu/CrlQ+qzoqQtEMfaTu7GHaQ6bziQln/pVWpOYC1wU+Mq6VQQFlsDtMCnDztPZtppAXdvvbNS7pcfRzlw==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.10.tgz", + "integrity": "sha512-g2+tU63yTWmcVQKDGY0MV1PjjqgZtwM4rB1oVVi/v0brdZAcrcTV+04agKzWtvWroyFz6IqtT0MoZJA7PNyLVw==", "cpu": [ "x64" ], @@ -10634,6 +10634,11 @@ "node": ">=10.13.0" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, "node_modules/globals": { "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", @@ -13995,16 +14000,17 @@ "peer": true }, "node_modules/next": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.4.tgz", - "integrity": "sha512-C5S0ysM0Ily9McL4Jb48nOQHT1BukOWI59uC3X/xCMlYIh9rJZCv7nzG92J6e1cOBqQbKovlpgvHWFmz4eKKEA==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.10.tgz", + "integrity": "sha512-4ep6aKxVTQ7rkUW2fBLhpBr/5oceCuf4KmlUpvG/aXuDTIf9mexNSpabUD6RWPspu6wiJJvozZREhXhueYO36A==", "dependencies": { - "@next/env": "13.4.4", + "@next/env": "13.4.10", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", "postcss": "8.4.14", "styled-jsx": "5.1.1", + "watchpack": "2.4.0", "zod": "3.21.4" }, "bin": { @@ -14014,15 +14020,15 @@ "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.4", - "@next/swc-darwin-x64": "13.4.4", - "@next/swc-linux-arm64-gnu": "13.4.4", - "@next/swc-linux-arm64-musl": "13.4.4", - "@next/swc-linux-x64-gnu": "13.4.4", - "@next/swc-linux-x64-musl": "13.4.4", - "@next/swc-win32-arm64-msvc": "13.4.4", - "@next/swc-win32-ia32-msvc": "13.4.4", - "@next/swc-win32-x64-msvc": "13.4.4" + "@next/swc-darwin-arm64": "13.4.10", + "@next/swc-darwin-x64": "13.4.10", + "@next/swc-linux-arm64-gnu": "13.4.10", + "@next/swc-linux-arm64-musl": "13.4.10", + "@next/swc-linux-x64-gnu": "13.4.10", + "@next/swc-linux-x64-musl": "13.4.10", + "@next/swc-win32-arm64-msvc": "13.4.10", + "@next/swc-win32-ia32-msvc": "13.4.10", + "@next/swc-win32-x64-msvc": "13.4.10" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -18789,6 +18795,18 @@ "makeerror": "1.0.12" } }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -21507,9 +21525,9 @@ "requires": {} }, "@next/env": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.4.tgz", - "integrity": "sha512-q/y7VZj/9YpgzDe64Zi6rY1xPizx80JjlU2BTevlajtaE3w1LqweH1gGgxou2N7hdFosXHjGrI4OUvtFXXhGLg==" + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.10.tgz", + "integrity": "sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ==" }, "@next/eslint-plugin-next": { "version": "13.4.4", @@ -21521,57 +21539,57 @@ } }, "@next/swc-darwin-arm64": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.4.tgz", - "integrity": "sha512-xfjgXvp4KalNUKZMHmsFxr1Ug+aGmmO6NWP0uoh4G3WFqP/mJ1xxfww0gMOeMeSq/Jyr5k7DvoZ2Pv+XOITTtw==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.10.tgz", + "integrity": "sha512-4bsdfKmmg7mgFGph0UorD1xWfZ5jZEw4kKRHYEeTK9bT1QnMbPVPlVXQRIiFPrhoDQnZUoa6duuPUJIEGLV1Jg==", "optional": true }, "@next/swc-darwin-x64": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.4.tgz", - "integrity": "sha512-ZY9Ti1hkIwJsxGus3nlubIkvYyB0gNOYxKrfsOrLEqD0I2iCX8D7w8v6QQZ2H+dDl6UT29oeEUdDUNGk4UEpfg==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.10.tgz", + "integrity": "sha512-ngXhUBbcZIWZWqNbQSNxQrB9T1V+wgfCzAor2olYuo/YpaL6mUYNUEgeBMhr8qwV0ARSgKaOp35lRvB7EmCRBg==", "optional": true }, "@next/swc-linux-arm64-gnu": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.4.tgz", - "integrity": "sha512-+KZnDeMShYkpkqAvGCEDeqYTRADJXc6SY1jWXz+Uo6qWQO/Jd9CoyhTJwRSxvQA16MoYzvILkGaDqirkRNctyA==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.10.tgz", + "integrity": "sha512-SjCZZCOmHD4uyM75MVArSAmF5Y+IJSGroPRj2v9/jnBT36SYFTORN8Ag/lhw81W9EeexKY/CUg2e9mdebZOwsg==", "optional": true }, "@next/swc-linux-arm64-musl": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.4.tgz", - "integrity": "sha512-evC1twrny2XDT4uOftoubZvW3EG0zs0ZxMwEtu/dDGVRO5n5pT48S8qqEIBGBUZYu/Xx4zzpOkIxx1vpWdE+9A==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.10.tgz", + "integrity": "sha512-F+VlcWijX5qteoYIOxNiBbNE8ruaWuRlcYyIRK10CugqI/BIeCDzEDyrHIHY8AWwbkTwe6GRHabMdE688Rqq4Q==", "optional": true }, "@next/swc-linux-x64-gnu": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.4.tgz", - "integrity": "sha512-PX706XcCHr2FfkyhP2lpf+pX/tUvq6/ke7JYnnr0ykNdEMo+sb7cC/o91gnURh4sPYSiZJhsF2gbIqg9rciOHQ==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.10.tgz", + "integrity": "sha512-WDv1YtAV07nhfy3i1visr5p/tjiH6CeXp4wX78lzP1jI07t4PnHHG1WEDFOduXh3WT4hG6yN82EQBQHDi7hBrQ==", "optional": true }, "@next/swc-linux-x64-musl": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.4.tgz", - "integrity": "sha512-TKUUx3Ftd95JlHV6XagEnqpT204Y+IsEa3awaYIjayn0MOGjgKZMZibqarK3B1FsMSPaieJf2FEAcu9z0yT5aA==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.10.tgz", + "integrity": "sha512-zFkzqc737xr6qoBgDa3AwC7jPQzGLjDlkNmt/ljvQJ/Veri5ECdHjZCUuiTUfVjshNIIpki6FuP0RaQYK9iCRg==", "optional": true }, "@next/swc-win32-arm64-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.4.tgz", - "integrity": "sha512-FP8AadgSq4+HPtim7WBkCMGbhr5vh9FePXiWx9+YOdjwdQocwoCK5ZVC3OW8oh3TWth6iJ0AXJ/yQ1q1cwSZ3A==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.10.tgz", + "integrity": "sha512-IboRS8IWz5mWfnjAdCekkl8s0B7ijpWeDwK2O8CdgZkoCDY0ZQHBSGiJ2KViAG6+BJVfLvcP+a2fh6cdyBr9QQ==", "optional": true }, "@next/swc-win32-ia32-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.4.tgz", - "integrity": "sha512-3WekVmtuA2MCdcAOrgrI+PuFiFURtSyyrN1I3UPtS0ckR2HtLqyqmS334Eulf15g1/bdwMteePdK363X/Y9JMg==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.10.tgz", + "integrity": "sha512-bSA+4j8jY4EEiwD/M2bol4uVEu1lBlgsGdvM+mmBm/BbqofNBfaZ2qwSbwE2OwbAmzNdVJRFRXQZ0dkjopTRaQ==", "optional": true }, "@next/swc-win32-x64-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.4.tgz", - "integrity": "sha512-AHRITu/CrlQ+qzoqQtEMfaTu7GHaQ6bziQln/pVWpOYC1wU+Mq6VQQFlsDtMCnDztPZtppAXdvvbNS7pcfRzlw==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.10.tgz", + "integrity": "sha512-g2+tU63yTWmcVQKDGY0MV1PjjqgZtwM4rB1oVVi/v0brdZAcrcTV+04agKzWtvWroyFz6IqtT0MoZJA7PNyLVw==", "optional": true }, "@noble/curves": { @@ -27022,6 +27040,11 @@ "is-glob": "^4.0.3" } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, "globals": { "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", @@ -29659,25 +29682,26 @@ "peer": true }, "next": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.4.tgz", - "integrity": "sha512-C5S0ysM0Ily9McL4Jb48nOQHT1BukOWI59uC3X/xCMlYIh9rJZCv7nzG92J6e1cOBqQbKovlpgvHWFmz4eKKEA==", - "requires": { - "@next/env": "13.4.4", - "@next/swc-darwin-arm64": "13.4.4", - "@next/swc-darwin-x64": "13.4.4", - "@next/swc-linux-arm64-gnu": "13.4.4", - "@next/swc-linux-arm64-musl": "13.4.4", - "@next/swc-linux-x64-gnu": "13.4.4", - "@next/swc-linux-x64-musl": "13.4.4", - "@next/swc-win32-arm64-msvc": "13.4.4", - "@next/swc-win32-ia32-msvc": "13.4.4", - "@next/swc-win32-x64-msvc": "13.4.4", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.10.tgz", + "integrity": "sha512-4ep6aKxVTQ7rkUW2fBLhpBr/5oceCuf4KmlUpvG/aXuDTIf9mexNSpabUD6RWPspu6wiJJvozZREhXhueYO36A==", + "requires": { + "@next/env": "13.4.10", + "@next/swc-darwin-arm64": "13.4.10", + "@next/swc-darwin-x64": "13.4.10", + "@next/swc-linux-arm64-gnu": "13.4.10", + "@next/swc-linux-arm64-musl": "13.4.10", + "@next/swc-linux-x64-gnu": "13.4.10", + "@next/swc-linux-x64-musl": "13.4.10", + "@next/swc-win32-arm64-msvc": "13.4.10", + "@next/swc-win32-ia32-msvc": "13.4.10", + "@next/swc-win32-x64-msvc": "13.4.10", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", "postcss": "8.4.14", "styled-jsx": "5.1.1", + "watchpack": "2.4.0", "zod": "3.21.4" }, "dependencies": { @@ -33165,6 +33189,15 @@ "makeerror": "1.0.12" } }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", diff --git a/t3/package.json b/t3/package.json index 38cab3b..8224024 100644 --- a/t3/package.json +++ b/t3/package.json @@ -26,7 +26,7 @@ "axios": "^1.4.0", "dotenv": "^16.3.1", "ethers": "^5.7.2", - "next": "^13.4.2", + "next": "^13.4.10", "next-auth": ">=4.10.2 <=4.20.1", "nft.storage": "^7.1.0", "react": "18.2.0", diff --git a/t3/prisma/schema.prisma b/t3/prisma/schema.prisma index 72e5c03..d1194fe 100644 --- a/t3/prisma/schema.prisma +++ b/t3/prisma/schema.prisma @@ -104,11 +104,13 @@ model Auction { } model Offer { - nft Nft @relation(fields: [tokenId], references: [tokenId], onDelete: Cascade) - tokenId Int - buyer String - amount BigInt - isCancelled Boolean @default(false) + tokenId Int + buyer String + amount BigInt + startingTime Int + isCancelled Boolean @default(false) - @@unique([tokenId, buyer]) + nft Nft @relation(fields: [tokenId], references: [tokenId], onDelete: Cascade) + + @@unique([tokenId, startingTime]) } diff --git a/t3/src/components/ui/NFTcard.tsx b/t3/src/components/ui/NFTcard.tsx index aecf1c8..bac03d2 100644 --- a/t3/src/components/ui/NFTcard.tsx +++ b/t3/src/components/ui/NFTcard.tsx @@ -9,7 +9,7 @@ const NFTcard = ({ item }: { item: ExploreItem }) => { const [tokenId, setTokenId] = useState(); const [tokenUri, setTokenUri] = useState(); const [tokenName, setTokenName] = useState(); - const [tokenDescription, setTokenDescription] = useState(); + // const [tokenDescription, setTokenDescription] = useState(); useEffect(() => { const getIPFSMetadata = async () => { @@ -24,9 +24,11 @@ const NFTcard = ({ item }: { item: ExploreItem }) => { description: string; }>(_formattedTokenUri); - setTokenUri(metadataIPFS.data.image); + console.log('metadataIPFS :: ', metadataIPFS) + + setTokenUri(formatTokenUri(metadataIPFS.data.image)); setTokenName(metadataIPFS.data.name); - setTokenDescription(metadataIPFS.data.description); + // setTokenDescription(metadataIPFS.data.description); } catch { console.log("Invalid IPFS metadata"); } @@ -37,19 +39,10 @@ const NFTcard = ({ item }: { item: ExploreItem }) => { }, []); function formatTokenUri(_tokenUri: string) { - const formattedTokenUri = `https://ipfs.io/ipfs/${_tokenUri?.substring( - 7, - 200 - )}`; + const formattedTokenUri = `https://ipfs.io/ipfs/${_tokenUri?.substring(7,200)}`; return formattedTokenUri; } - const formattedTokenUri = `https://ipfs.io/ipfs/${tokenUri!.substring( - 7, - 200 - )}`; - const formattedTokenName = String(tokenName); - const formattedTokenDescription = String(tokenDescription); return (
{/* DIV PARA EL INFO EN HOVER */} @@ -74,15 +67,15 @@ const NFTcard = ({ item }: { item: ExploreItem }) => {
{formattedTokenName}
-

{formattedTokenName}

+

{tokenName}

{ +const checkOfferExists = async (tokenId: number, buyer: string, amount: number, startingTime: number) => { const row = await prisma.offer.findUnique({ where: { - tokenId_buyer: { - tokenId, buyer, + tokenId_startingTime: { + tokenId, startingTime, } } }); + if(row) { await prisma.offer.update({ where: { - tokenId_buyer: { - tokenId, buyer, + tokenId_startingTime: { + tokenId, startingTime, } }, data: { @@ -52,6 +55,7 @@ const checkOfferExists = async (tokenId: number, buyer: string, amount: number) tokenId, buyer, amount, + startingTime, isCancelled: false, } }); diff --git a/t3/src/pages/explore.tsx b/t3/src/pages/explore.tsx index 294e753..a1877de 100644 --- a/t3/src/pages/explore.tsx +++ b/t3/src/pages/explore.tsx @@ -5,6 +5,7 @@ import { prisma } from "~/server/db"; import { Nft } from "@prisma/client"; const Explore = ({ items }: { items: ExploreItem[] }) => { + // Simular datos recibidos de la API const [categoriesSelected, setCategoriesSelected] = useState([ { name: "Photography", selected: true }, diff --git a/t3/src/pages/product/[id].tsx b/t3/src/pages/product/[id].tsx index 1d44b58..b93bf4b 100644 --- a/t3/src/pages/product/[id].tsx +++ b/t3/src/pages/product/[id].tsx @@ -9,11 +9,14 @@ import { useEffect, useState } from "react"; import { addresses } from "../../smart-contracts/constants"; -import ReadOwnerOf from "../../smart-contracts/hooks/useReadOwnerOf"; -import IsApproved from "../../smart-contracts/hooks/useIsApproved"; -import useListItem from "../../smart-contracts/hooks/useListItemEthers"; -import useCancelList from "../../smart-contracts/hooks/useCancelListEthers"; -import useApproveItem from "../../smart-contracts/hooks/useApproveItemEthers"; +import ReadOwnerOf from "../../smart-contracts/auxFunctions/ReadOwnerOf"; +import IsApproved from "../../smart-contracts/auxFunctions/IsApproved"; + +import CancelList from "../../smart-contracts/auxFunctions/CancelListEthers"; +import ApproveItem from "../../smart-contracts/auxFunctions/ApproveItemEthers"; + +import ListItem from "../../smart-contracts/auxFunctions/ListItemEthers"; +import CreateOffer from "../../smart-contracts/auxFunctions/CreateOffer"; import axios from "axios"; import shortenAddress from "~/utils/shortenAddress"; @@ -23,110 +26,241 @@ interface MetadataIPFS { } } -type ListItemData = { +type ItemDataList = { amountList: number; durationList: number; }; +type ItemDataOffer = { + amountOffer: number; + durationOffer: number; +}; + + type NFTProductProps = { nftId: number, - tokenUri: string, - creatorAddress: string, - creatorFee: number, - creatorName: string, - sellerAddress: string, - sellerName: string, - amount: number, - isListed: boolean, - isOwner: boolean, - isApproved: boolean, + userAddress: string, + nftData: { + creator: string, + feeNumerator: number, + tokenId: number, + tokenUri: string + }, + listedNftData: { + amount: number, + endTime: number, + isCancelled: boolean, + seller: string, + startingTime: number, + tokenId: number + }, + creatorData: { + address: string, + email: string, + emailVerified: boolean, + id: string, + image: string, + name: string + }, + sellerData: { + address: string, + email: string, + emailVerified: boolean, + id: string, + image: string, + name: string + }, + offerData: { + amount: number, + buyer: string, + isCancelled: boolean, + tokenId: number + }, + buyerData: { + address: string, + email: string, + emailVerified: boolean, + id: string, + image: string, + name: string + } }; -const NFTProduct = ({ - nftId, - tokenUri, - creatorAddress, - creatorFee, - creatorName, - sellerAddress, - sellerName, - amount, - isListed, - isOwner, - isApproved, -}: NFTProductProps) => { +const NFTProduct = ({ nftId, userAddress, nftData, listedNftData, creatorData, sellerData, offerData, buyerData } : NFTProductProps) => { - const [tokenImage, setTokenImage] = useState(""); const [showFormList, setShowFormList] = useState(false); - const [formDataList, setFormDataList] = useState({ + const [formDataList, setFormDataList] = useState({ amountList: 0, durationList: 0, }); - function formatTokenUri(_tokenUri: string) { - const formattedTokenUri = `https://ipfs.io/ipfs/${_tokenUri?.substring(7, 200)}`; - return formattedTokenUri; + const [showFormOffer, setShowFormOffer] = useState(false); + const [formDataOffer, setFormDataOffer] = useState({ + amountOffer: 0, + durationOffer: 0, + }); + + // logic moved from the server side props: + const [ownerOFNft, setOwnerOFNft] = useState(""); + const [isApproved, setIsApproved] = useState(false); + const [isOwner, setIsOwnerd] = useState(false); + + const [isListed, setIsListed] = useState(false); + const [hasOffer, setHasOffer] = useState(false); + + const [creatorAddress, setCreatorAddress] = useState(""); + const [creatorName, setCreatorName] = useState(""); + const [creatorImage, setCreatorImage] = useState(""); + const [creatorFee, setCreatorFee] = useState(0); + // const [tokenUri, setTokenUri] = useState(""); + const [tokenImage, setTokenImage] = useState(""); + + const [sellerAddress, setSellerAddress] = useState(""); + const [sellerName, setSellerName] = useState(""); + const [sellerImage, setSellerImage] = useState(""); + const [sellerAmount, setSellerAmount] = useState(""); + + const [buyerAddress, setBuyerAddress] = useState(""); + const [buyerName, setBuyerName] = useState(""); + const [buyerImage, setBuyerImage] = useState(""); + const [buyerAmount, setBuyerAmount] = useState(""); + + async function loadMainInfo() { + + setOwnerOFNft(await ReadOwnerOf(nftId)) + + const addressApproved = await IsApproved(nftId); + setIsApproved(addresses.FrommeMarketplace == addressApproved) + setIsOwnerd(await ReadOwnerOf(nftId) == userAddress) + + if(nftData) { + setCreatorAddress(nftData.creator) + setCreatorFee(nftData.feeNumerator) + + + // Image + const _formattedTokenUri = formatTokenUri(nftData.tokenUri) + const metadataIPFS: MetadataIPFS = await axios.get(_formattedTokenUri) + + const image = metadataIPFS.data.image + const formattedImage = formatTokenUri(image) + + setTokenImage(formattedImage) + } + + if(creatorData) { + setCreatorName(creatorData.name || "NoName") + setCreatorImage(creatorData.image || "/images/test.jpg") + } + + // Is NFT listed? + if (listedNftData) { + setIsListed(true) + const amount = Number(listedNftData?.amount) + const sellerAddress = listedNftData?.seller; + + if (sellerAddress) { + if(sellerData) { + setSellerAddress(sellerAddress) + setSellerName(sellerData.name || "NoName") + setSellerImage(sellerData.image || "/images/test.jpg") + setSellerAmount(ethers.utils.formatEther(amount)) + } + } + } + // Has offers? + if (offerData) { + setHasOffer(true) + const amount = Number(offerData?.amount) + const buyerAddress = offerData?.buyer; + + if (buyerAddress) { + if(buyerData) { + setBuyerAddress(buyerAddress) + setBuyerName(buyerData.name || "NoName") + setBuyerImage(buyerData.image || "/images/test.jpg") + setBuyerAmount(ethers.utils.formatEther(amount)) + } + } + } } useEffect(() => { - const getTokenUri = async () => { - const _formattedTokenUri = formatTokenUri(tokenUri); - const metadataIPFS: MetadataIPFS = await axios.get(_formattedTokenUri); + loadMainInfo().catch(console.error); + }, []) - const image = metadataIPFS.data.image; - const formattedImage = formatTokenUri(image); + ////////////////////////////////////////// - setTokenImage(formattedImage); - }; - void getTokenUri(); - }, []); + function formatTokenUri(_tokenUri: string) { + const formattedTokenUri = `https://ipfs.io/ipfs/${_tokenUri?.substring(7,200)}`; + return formattedTokenUri + } const handleListItem = () => { - setShowFormList(true); + setShowFormList(!showFormList); }; - const HandleListItemSubmit = async (e: React.FormEvent) => { + const handleListItemSubmit = async (e: React.FormEvent) => { e.preventDefault(); + console.log("List Submited", nftId, formDataList) + setFormDataList(formDataList); + await ListItem(nftId, formDataList.amountList, formDataList.durationList) setShowFormList(false); + }; + + const handleCreateOffer = () => { + setShowFormOffer(!showFormOffer); + + }; + const handleCreateOfferSubmit = async (e: React.FormEvent) => { + e.preventDefault(); - // send data to contract - await useListItem( - nftId, - formDataList.amountList, - formDataList.durationList - ); + console.log("Offer Submited", nftId, formDataOffer) - console.log("Item Listed"); + setFormDataOffer(formDataOffer); + await CreateOffer(nftId, formDataOffer.amountOffer, formDataOffer.durationOffer) + setShowFormOffer(false); }; - const HandleCancelListSubmit = async (e: React.FormEvent) => { - await useCancelList(nftId); - console.log("List Canceled"); + const handleCancelListSubmit = async (e: React.FormEvent) => { + await CancelList(nftId) }; - const HandleApproveItem = async (e: React.FormEvent) => { - await useApproveItem(nftId); - console.log("Item Approved"); + const handleApproveItem = async (e: React.FormEvent) => { + await ApproveItem(nftId) }; - const handleInputChange = (e: React.ChangeEvent) => { + const handleInputChangeList = (e: React.ChangeEvent) => { + console.log("formDataList :: ", formDataList) setFormDataList({ ...formDataList, [e.target.name]: e.target.value }); }; - let ethValue; + const handleInputChangeOffer = (e: React.ChangeEvent) => { + console.log("formDataOffer :: ", formDataOffer) + setFormDataOffer({ ...formDataOffer, [e.target.name]: e.target.value }); + }; - if (isListed) { - ethValue = ethers.utils.formatEther(amount); - } + const decimalPlaces = 2; + const creatorFeeInPerc: string = (creatorFee / 10000 * 100).toFixed(decimalPlaces) + '%'; + + // console.log('creatorImage', creatorImage) + // console.log('isListed', isListed) + // console.log('hasOffer', hasOffer) + // console.log('isOwner', isOwner) + // console.log('isApproved', isApproved) - const creatorFeeInPerc: string = ((creatorFee / 10000) * 100).toFixed(2) + "%"; + // console.log('ownerOFNft', ownerOFNft) + // console.log('userAddress', userAddress) return (
-

Token # {nftId}

+
+

Token # {nftId} :

+

{isApproved ? "Approved" : "Pending Approval"}

+

@@ -139,61 +273,105 @@ const NFTProduct = ({
-
-
-

Creator Address:

-

{shortenAddress(creatorAddress)}

-

Creator Fee:

-

{creatorFeeInPerc}

-
-
-
-

Creator

-
+

Creator

+ {``}

{creatorName}

+
+
+
+

Address:

+

{shortenAddress(creatorAddress)}

+

Fee:

+

{creatorFeeInPerc}

+
+
+ {isListed && (
+
+
+
+

List

+ {``} +

{sellerName}

+
+
+
+
-

Seller Address:

+

Seller Address:

{shortenAddress(sellerAddress)}

-

Price

+

Price:

- {ethValue || null} + {sellerAmount || null} ETH

-
-
-
-
-

Seller

-
-

{sellerName}

-
+
+ )} + {hasOffer && ( +
+
+
+
+

Offer

+ {``} +

{buyerName}

+
+
+
+

Buyer Address:

+

{shortenAddress(buyerAddress)}

+

Price:

+

+ {buyerAmount || null} + ETH +

+
+
+
)}
{isListed == true && isOwner == false && ( )} {isListed == true && isOwner == true && ( @@ -201,42 +379,73 @@ const NFTProduct = ({ {isListed == false && isOwner == true && isApproved == false && ( )} + + {isListed == false && isOwner == true && isApproved == true && ( - )} {showFormList && ( -
HandleListItemSubmit}> + + +
+ )} + + {isOwner == false && ( + + )} + {showFormOffer && ( +
+ +
)} @@ -251,42 +460,35 @@ const NFTProduct = ({
{/*
*/}
- {tokenImage} + />}
Music
); -}; +} + +export default NFTProduct; + export const getServerSideProps: GetServerSideProps = async (ctx) => { - const session = await getSession(ctx); - const userAddress = session?.user.name; + + const session = await getSession(ctx) + const userAddress = session?.user.name // from the query data, get nftId // from nftId get everything else (nft creator, if is listed the seller, etc.) const nftId = parseInt(ctx.query.id as string); - console.log("nftId:", nftId); - - const ownerOFNft = await ReadOwnerOf(nftId); - console.log("ownerOFNft", ownerOFNft); - - const addressApproved = await IsApproved(nftId) as string; - const isApproved = addresses.FrommeMarketplace == addressApproved; - console.log("isApproved", isApproved); - - const isOwner = ownerOFNft == userAddress; - console.log("isOwner", isOwner); if (!nftId && nftId != 0) { - console.log("404"); + console.log("404") return { redirect: { destination: "/404", @@ -297,90 +499,138 @@ export const getServerSideProps: GetServerSideProps = async (ctx) => { const nftData = await prisma.nft.findUnique({ where: { - tokenId: nftId, - }, + tokenId: nftId + } }); + // console.log('nftData', nftData) - const creatorAddress = nftData?.creator; - const creatorFee = nftData?.feeNumerator; - const tokenUri = nftData?.tokenUri; + function formatTokenUri(_tokenUri: string) { + const formattedTokenUri = `https://ipfs.io/ipfs/${_tokenUri?.substring(7,200)}`; + return formattedTokenUri + } - const currentTimestamp = Math.floor(Date.now() / 1000); // Get the current timestamp as a BigInt + if (nftData) { + // Image + const _formattedTokenUri = formatTokenUri(nftData.tokenUri) + // console.log('_formattedTokenUri', _formattedTokenUri) + const metadataIPFS: MetadataIPFS = await axios.get(_formattedTokenUri) - const listedNftDataList = await prisma.listedNft.findMany({ - where: { - tokenId: nftId, - startingTime: { - lte: currentTimestamp, // Check if startingTime is less than or equal to current time - }, - endTime: { - gte: currentTimestamp, // Check if endTime is greater than or equal to current time - }, - }, - }); - // weshould only have one listed element active (between timestamps) - const listedNftData = listedNftDataList[0]; - console.log("listedNftData :", listedNftData); + const image = metadataIPFS.data.image + const tokenImage = formatTokenUri(image) + // console.log('tokenImage', tokenImage) - const creatorData = await prisma.user.findUnique({ - where: { - address: creatorAddress, - }, - }); + const currentTimestamp = Math.floor(Date.now() / 1000); // Get the current timestamp as a BigInt + const listedNftDataList = await prisma.listedNft.findMany({ + where: { + tokenId: nftId, + startingTime: { + lte: currentTimestamp, // Check if startingTime is less than or equal to current time + }, + endTime: { + gte: currentTimestamp, // Check if endTime is greater than or equal to current time + }, + } + }); + const listedNftData = listedNftDataList[0] + // console.log('listedNftData', listedNftData) + + const creatorData = await prisma.user.findUnique({ + where: { + address: nftData.creator + } + }); + // console.log(nftId, 'creatorData', creatorData) + + // LISTED + OFFER + let listedNftDataOut + let offerDataOut + let sellerDataOut + let buyerDataOut + + // Is NFT listed? + if (listedNftData) { + + const convertedNftData = { + ...listedNftData, + amount: Number(listedNftData.amount) + }; + // console.log('convertedNftData', convertedNftData) - // Is NFT listed? - if (listedNftData) { - const amount = Number(listedNftData?.amount); - const currentTime = new Date(); - const currentTimestamp = currentTime.getTime(); + const sellerAddress = convertedNftData?.seller; + const sellerData = await prisma.user.findUnique({ + where: { + address: sellerAddress || "failSellerAddress" + } + }); - const sellerAddress = listedNftData?.seller; + listedNftDataOut = convertedNftData + sellerDataOut = sellerData - const sellerData = await prisma.user.findUnique({ + } else { + listedNftDataOut = null + sellerDataOut = null + } + + // OFFERS + const offerDataList = await prisma.offer.findMany({ where: { - address: sellerAddress || "failSellerAddress", - }, + tokenId: nftId, + } }); - - // If the list is still active - *100 because miliseconds to seconds - if (currentTimestamp < listedNftData.endTime * 1000) { - return { - props: { - nftId: nftId, - tokenUri: tokenUri, - creatorAddress: creatorAddress, - creatorFee: creatorFee, - creatorName: creatorData?.name, - sellerAddress: sellerAddress, - sellerName: sellerData?.name, - amount: amount, - startingTime: listedNftData?.startingTime, - endTime: listedNftData?.endTime, - isListed: true, - isOwner: isOwner, - isApproved: isApproved, - }, + const offerData = offerDataList[0] + // console.log('offerData', offerData) + + // Has offer? + if (offerData) { + + const convertedNftData = { + ...offerData, + amount: Number(offerData.amount) }; + // console.log('convertedNftData', convertedNftData) + + const buyerAddress = convertedNftData?.buyer; + const buyerData = await prisma.user.findUnique({ + where: { + address: buyerAddress || "failBuyerAddress" + } + }); + + offerDataOut = convertedNftData + buyerDataOut = buyerData + + } else { + offerDataOut = null + buyerDataOut = null } - } + + return { + props: { + nftId: nftId, + userAddress: userAddress, + nftData: nftData, + listedNftData: listedNftDataOut, + creatorData: creatorData, + sellerData: sellerDataOut, + tokenImage: tokenImage, + offerData: offerDataOut, + buyerData: buyerDataOut + }, + }; + + } return { props: { nftId: nftId, - tokenUri: tokenUri, - creatorAddress: creatorAddress, - creatorFee: creatorFee, - creatorName: creatorData?.name, - sellerAddress: null, - sellerName: null, - amount: null, - startingTime: null, - endTime: null, - isListed: false, - isOwner: isOwner, - isApproved: isApproved, + userAddress: userAddress, + nftData: null, + listedNftData: null, + creatorData: null, + sellerData: null, + tokenImage: null, + offerData: null, + buyerData: null }, - }; -}; - -export default NFTProduct; \ No newline at end of file + } +} \ No newline at end of file diff --git a/t3/src/smart-contracts/hooks/useApproveItemEthers.ts b/t3/src/smart-contracts/auxFunctions/ApproveItemEthers.ts similarity index 85% rename from t3/src/smart-contracts/hooks/useApproveItemEthers.ts rename to t3/src/smart-contracts/auxFunctions/ApproveItemEthers.ts index 3d9be06..0ebf5cb 100644 --- a/t3/src/smart-contracts/hooks/useApproveItemEthers.ts +++ b/t3/src/smart-contracts/auxFunctions/ApproveItemEthers.ts @@ -8,12 +8,9 @@ declare global { } } -export default async function useApproveItem(tokenId: number) { +export default async function ApproveItem(tokenId: number) { try { - const providerUrl = process.env.NEXT_PUBLIC_URL_MUMBAI; - console.log('providerUrl', providerUrl) - const provider = new ethers.providers.Web3Provider(window.ethereum, "any"); await provider.send("eth_requestAccounts", []); const signer = provider.getSigner(); @@ -32,7 +29,7 @@ export default async function useApproveItem(tokenId: number) { await window.ethereum.enable(); // Perform the contract function call - const result = await contract.approve(addresses.FrommeMarketplace, tokenId); + const result = await contract.approve(addresses.FrommeMarketplace, tokenId) // Process the result console.log('Contract function called:', result); @@ -40,7 +37,9 @@ export default async function useApproveItem(tokenId: number) { console.error('Error calling contract function:', error); } } - await callContractFunction(); + + await callContractFunction() + } catch (error) { console.error('Error reading getApproved of token:', error); throw error; diff --git a/t3/src/smart-contracts/hooks/useCancelListEthers.ts b/t3/src/smart-contracts/auxFunctions/CancelListEthers.ts similarity index 86% rename from t3/src/smart-contracts/hooks/useCancelListEthers.ts rename to t3/src/smart-contracts/auxFunctions/CancelListEthers.ts index 08cc0bc..e131566 100644 --- a/t3/src/smart-contracts/hooks/useCancelListEthers.ts +++ b/t3/src/smart-contracts/auxFunctions/CancelListEthers.ts @@ -1,10 +1,7 @@ import { addresses, FrommeMarketplace_abi } from "../constants"; import { ethers } from 'ethers'; -// Load environment variables from .env file -// dotenv.config({ path: '..\..\..\.env' }); - -export default async function useCancelList(_tokenId: number) { +export default async function CancelList(_tokenId: number) { try { const provider = new ethers.providers.Web3Provider(window.ethereum as ethers.providers.ExternalProvider, "any"); diff --git a/t3/src/smart-contracts/auxFunctions/CreateOffer.ts b/t3/src/smart-contracts/auxFunctions/CreateOffer.ts new file mode 100644 index 0000000..61a485c --- /dev/null +++ b/t3/src/smart-contracts/auxFunctions/CreateOffer.ts @@ -0,0 +1,31 @@ + +import { addresses, FrommeMarketplace_abi } from "../constants"; +import { ethers } from 'ethers'; + +export default async function CreateOffer(_tokenId: number, _amount: number, _durationInSeconds: number) { + try { + + const provider = new ethers.providers.Web3Provider(window.ethereum, "any"); + await provider.send("eth_requestAccounts", []); + const signer = provider.getSigner(); + console.log("Account:", await signer.getAddress()); + + const contract = new ethers.Contract(addresses.FrommeMarketplace, FrommeMarketplace_abi, signer) as ethers.Contract & { createOffer: (_tokenId: number, _durationInSeconds: number, value: {value: number}) => Promise } + + // Example function to send a transaction to the contract + async function sendTransactionToContract() { + + const amountInWei = Number(ethers.utils.parseEther(_amount.toString())) + // console.log(amountInWei) + + await contract.createOffer(_tokenId, _durationInSeconds, { value: amountInWei }); + console.log('Transaction mined!'); + } + + await sendTransactionToContract() + + } catch (error) { + console.error('Error making offer:', error); + throw error; + } +} diff --git a/t3/src/smart-contracts/hooks/useIsApproved.ts b/t3/src/smart-contracts/auxFunctions/IsApproved.ts similarity index 75% rename from t3/src/smart-contracts/hooks/useIsApproved.ts rename to t3/src/smart-contracts/auxFunctions/IsApproved.ts index 209e148..7827e94 100644 --- a/t3/src/smart-contracts/hooks/useIsApproved.ts +++ b/t3/src/smart-contracts/auxFunctions/IsApproved.ts @@ -1,8 +1,10 @@ + import { addresses, NFTFactory_abi } from "../constants"; -import { ethers } from "ethers"; +import { ethers } from 'ethers'; -export default async function useIsApproved(tokenId: number) { +export default async function IsApproved(tokenId: number) { try { + const providerUrl = process.env.NEXT_PUBLIC_URL_MUMBAI; // Replace with the actual JSON-RPC URL const provider = new ethers.providers.JsonRpcProvider(providerUrl); @@ -10,13 +12,13 @@ export default async function useIsApproved(tokenId: number) { addresses.NFTFactory, NFTFactory_abi, provider - ) as ethers.Contract & { getApproved: (tokenId: number) => Promise }; + ) as ethers.Contract & { getApproved: (tokenId: number) => Promise }; const addressApproved = await contract.getApproved(tokenId); return addressApproved; } catch (error) { - console.error("Error reading getApproved of token:", error); + console.error('Error reading getApproved of token:', error); throw error; } } diff --git a/t3/src/smart-contracts/auxFunctions/ListItemEthers.ts b/t3/src/smart-contracts/auxFunctions/ListItemEthers.ts new file mode 100644 index 0000000..36fb23d --- /dev/null +++ b/t3/src/smart-contracts/auxFunctions/ListItemEthers.ts @@ -0,0 +1,31 @@ + +import { addresses, FrommeMarketplace_abi } from "../constants"; +import { ethers } from 'ethers'; + +export default async function ListItem(_tokenId: number, _amount: number, _durationInSeconds: number) { + try { + + const provider = new ethers.providers.Web3Provider(window.ethereum as ethers.providers.ExternalProvider); + await provider.send("eth_requestAccounts", []); + const signer = provider.getSigner(); + console.log("Account:", await signer.getAddress()); + + const contract = new ethers.Contract(addresses.FrommeMarketplace, FrommeMarketplace_abi, signer) as ethers.Contract & { listItem: (_tokenId: number, _amount: number, _durationInSeconds: number) => Promise } + + // Example function to send a transaction to the contract + async function sendTransactionToContract() { + + const amountInWei = Number(ethers.utils.parseEther(_amount.toString())) + // console.log(amountInWei) + + await contract.listItem(_tokenId, amountInWei, _durationInSeconds); + console.log('Transaction mined!'); + } + + await sendTransactionToContract() + + } catch (error) { + console.error('Error reading owner of token:', error); + throw error; + } +} diff --git a/t3/src/smart-contracts/hooks/useReadOwnerOf.ts b/t3/src/smart-contracts/auxFunctions/ReadOwnerOf.ts similarity index 99% rename from t3/src/smart-contracts/hooks/useReadOwnerOf.ts rename to t3/src/smart-contracts/auxFunctions/ReadOwnerOf.ts index 1694b3a..ee65fea 100644 --- a/t3/src/smart-contracts/hooks/useReadOwnerOf.ts +++ b/t3/src/smart-contracts/auxFunctions/ReadOwnerOf.ts @@ -2,7 +2,6 @@ import { addresses, NFTFactory_abi } from "../constants"; import { ethers } from 'ethers'; - export default async function ReadOwnerOf(tokenId: number) { try { diff --git a/t3/src/smart-contracts/hooks/useListItemEthers.ts b/t3/src/smart-contracts/hooks/useListItemEthers.ts deleted file mode 100644 index dddca89..0000000 --- a/t3/src/smart-contracts/hooks/useListItemEthers.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { addresses, FrommeMarketplace_abi } from "../constants"; -import { ethers } from "ethers"; - -// Load environment variables from .env file -// dotenv.config({ path: '..\..\..\.env' }); - -export default async function useListItem( - _tokenId: number, - _amount: number, - _durationInSeconds: number -) { - try { - const provider = new ethers.providers.Web3Provider(window.ethereum, "any"); - await provider.send("eth_requestAccounts", []); - const signer = provider.getSigner(); - console.log("Account:", await signer.getAddress()); - - const contract = new ethers.Contract( - addresses.FrommeMarketplace, - FrommeMarketplace_abi, - signer - ) as ethers.Contract & { - listItem: ( - _tokenId: number, - amountInWei: ethers.BigNumber, - _durationInSeconds: number - ) => Promise; - }; - - // Example function to send a transaction to the contract - async function sendTransactionToContract() { - const amountInWei = ethers.utils.parseEther(_amount.toString()); - // console.log(amountInWei) - - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const tx = await contract.listItem( - _tokenId, - amountInWei, - _durationInSeconds - ); - // Wait for the transaction to be mined - // eslint-disable-next-line @typescript-eslint/no-unsafe-call - await tx.wait(); // eslint-disable-line @typescript-eslint/no-unsafe-member-access - console.log("Transaction mined!"); - } - - await sendTransactionToContract(); - } catch (error) { - console.error("Error reading owner of token:", error); - throw error; - } -} diff --git a/t3/src/utils/shortenAddress.ts b/t3/src/utils/shortenAddress.ts index c17dd03..56819cd 100644 --- a/t3/src/utils/shortenAddress.ts +++ b/t3/src/utils/shortenAddress.ts @@ -1,7 +1,7 @@ function shortenAddress(address: string): string { - if (address.length < 10) { - throw new Error("Invalid Ethereum address"); - } + // if (address.length < 10) { + // throw new Error("Invalid Ethereum address"); + // } const firstChars = address.slice(0, 6); const lastChars = address.slice(-4);