diff --git a/assets/cb-storage.meta.txt b/assets/cb-storage.meta.txt new file mode 100644 index 0000000..22e38a5 --- /dev/null +++ b/assets/cb-storage.meta.txt @@ -0,0 +1 @@ +000200010000000000010600000001100000000000000001110000000112000000c128740008186e66745f696f1c496e69744e465400002001106e616d65040118537472696e6700012c6465736372697074696f6e040118537472696e67000140697066735f666f6c6465725f6c696e6b040118537472696e6700011461646d696e08011c4163746f72496400014c73746172745f6e756d6265725f6f665f6e667414010c75333200015c6e65775f73746172745f6e756d6265725f6f665f6e667414010c7533320001386e756d6265725f6f665f6e66747314010c7533320001346d656469615f6d6f64756c757314010c75333200000400000502000810106773746418636f6d6d6f6e287072696d6974697665731c4163746f724964000004000c01205b75383b2033325d00000c0000032000000010001000000503001400000505001808186e66745f696f244e4654416374696f6e000140104d696e74040124726563697069656e7408011c4163746f7249640000001c417070726f76650c011c6163636f756e7408011c4163746f724964000140617070726f7665645f6163636f756e7408011c4163746f724964000120746f6b656e5f696414010c753332000100385265766f6b65417070726f76616c08011c6163636f756e7408011c4163746f724964000120746f6b656e5f696414010c753332000200104275726e08011c6163636f756e7408011c4163746f724964000120746f6b656e5f696414010c7533320003006c416363657074546f6b656e46726f6d4f7468657253746f72616765080120746f6b656e5f696414010c7533320001106d6574611c0138496e6e6572546f6b656e4d657461000400205472616e736665720c011c6163636f756e7408011c4163746f724964000124726563697069656e7408011c4163746f724964000120746f6b656e5f696414010c753332000500144f776e6572040120746f6b656e5f696414010c75333200060038546f6b656e73466f724f776e65720401206f776e65725f696408011c4163746f72496400070030416464417474726962757465080120746f6b656e5f696414010c753332000124617474726962757465040118537472696e670008002041646441646d696e04012061646d696e5f696408011c4163746f7249640009002c44656c65746541646d696e04012061646d696e5f696408011c4163746f724964000a0038557064617465497066734c696e6b040140697066735f666f6c6465725f6c696e6b040118537472696e67000b00485570646174654e756d6265724f664e6674730401386e756d6265725f6f665f6e66747314010c753332000c005855706461746553746172744e756d6265724f664e667404014c73746172745f6e756d6265725f6f665f6e667414010c753332000d00244275726e466f726365040124746f6b656e5f6964733401205665633c7533323e000e0024416464546f6b656e73040118746f6b656e733801685665633c287533322c20496e6e6572546f6b656e4d657461293e000f00001c08186e66745f696f38496e6e6572546f6b656e4d65746100001001146d6564696114010c7533320001146f776e657208011c4163746f7249640001286163746976697469657320015c5665633c28537472696e672c207531362c20753634293e0001106c696e6b3001384f7074696f6e3c537472696e673e0000200000022400240000040c04282c002800000504002c00000506003004184f7074696f6e04045401040108104e6f6e6500000010536f6d650400040000010000340000021400380000023c003c00000408141c004008186e66745f696f204e46545265706c79000124184d696e746564080120746f6b656e5f696414010c7533320001106d6574611c0138496e6e6572546f6b656e4d657461000000144f776e65720801146f776e657208011c4163746f724964000120746f6b656e5f696414010c75333200010038546f6b656e73466f724f776e6572040118746f6b656e733401205665633c7533323e000200284e66744368616e6765640401106d6574611c0138496e6e6572546f6b656e4d65746100030020417070726f766564000400144275726e740401106d6574611c0138496e6e6572546f6b656e4d6574610005002c5472616e7366657272656400060034546f6b656e41636365707465640401106d6574611c0138496e6e6572546f6b656e4d6574610007003c417070726f76616c5265766f6b6564000800004408186e66745f696f285374617465517565727900013424546f6b656e496e666f040014010c75333200000024416c6c546f6b656e7300010040416c6c546f6b656e735261774461746100020034546f6b656e73496e52616e676508011066726f6d14010c753332000108746f14010c753332000300504e756d6265724f664d696e746564546f6b656e73000400304f776e65724f66546f6b656e040014010c7533320005003849706673466f6c6465724c696e6b0006001841646d696e730007003c417070726f76616c4f66546f6b656e040014010c75333200080030416c6c417070726f76616c7300090038546f6b656e73466f724f776e6572040008011c4163746f724964000a003c4d61784e756d6265724f664e667473000b004053746172744e756d6265724f664e6674000c00004808186e66745f696f2853746174655265706c7900013424546f6b656e496e666f04004c012c4f7074696f6e3c4e66743e00000024416c6c546f6b656e73040058014c5665633c284163746f7249642c204e6674293e00010040416c6c546f6b656e7352617744617461040060014c5665633c496e6e6572546f6b656e4d6574613e00020034546f6b656e73496e52616e6765040058014c5665633c284163746f7249642c204e6674293e000300504e756d6265724f664d696e746564546f6b656e7304002c010c753634000400304f776e65724f66546f6b656e040008011c4163746f7249640005003849706673466f6c6465724c696e6b0400040118537472696e670006001841646d696e7304006401305665633c4163746f7249643e0007003c417070726f76616c4f66546f6b656e040068013c4f7074696f6e3c4163746f7249643e00080030416c6c417070726f76616c7304006c014c5665633c287533322c204163746f724964293e00090038546f6b656e73466f724f776e657204003401205665633c7533323e000a003c4d61784e756d6265724f664e667473040014010c753332000b004053746172744e756d6265724f664e6674040014010c753332000c00004c04184f7074696f6e04045401500108104e6f6e6500000010536f6d6504005000000100005008186e66745f696f0c4e667400001401146f776e657208011c4163746f7249640001106e616d65040118537472696e6700012c6465736372697074696f6e040118537472696e670001246d656469615f75726c040118537472696e670001286174747269625f75726c54012c5665633c537472696e673e0000540000020400580000025c005c00000408085000600000021c006400000208006804184f7074696f6e04045401080108104e6f6e6500000010536f6d6504000800000100006c00000270007000000408140800 \ No newline at end of file diff --git a/src/config.ts b/src/config.ts index 9a1fe3c..888a502 100644 --- a/src/config.ts +++ b/src/config.ts @@ -12,11 +12,13 @@ config(); export default { nfts: { cb: getEnv('NFT_CB'), - vit: getEnv('NFT_VIT'), - draft: getEnv('NFT_DRAFT'), - vitMigratedAtBlock: getEnv('VIT_MIGRATED_AT_BLOCK'), - vitMigratedTS: Number(getEnv('VIT_MIGRATED_TS')), - readMigrateNfts: Boolean(getEnv('READ_MIGRATED_NFTS', '')), + vit: getEnv('NFT_VIT', ''), + draft: getEnv('NFT_DRAFT', ''), + vitMigratedAtBlock: getEnv('VIT_MIGRATED_AT_BLOCK', '0'), + cbMigratedAtBlock: getEnv('CB_MIGRATED_AT_BLOCK', '0'), + vitMigratedTS: Number(getEnv('VIT_MIGRATED_TS', '0')), + cbMigratedTs: Number(getEnv('CB_MIGRATED_TS', '0')), + readMigratedNfts: Boolean(getEnv('READ_MIGRATED_NFTS', '')), old: getEnv('NFT_OLD', ''), }, squid: { diff --git a/src/handlers/vit-nft.ts b/src/handlers/migrated-nft.ts similarity index 55% rename from src/handlers/vit-nft.ts rename to src/handlers/migrated-nft.ts index 779ded9..13c447c 100644 --- a/src/handlers/vit-nft.ts +++ b/src/handlers/migrated-nft.ts @@ -1,14 +1,15 @@ import { HexString, HumanTypesRepr, ProgramMetadata } from '@gear-js/api'; +import { readFileSync } from 'fs'; + import config from '../config'; -import { StateReply, VitNftStateReply } from '../types'; +import { StateReply, StorageStateReply } from '../types'; import { gearReadStateBatchReq, gearReadStateReq, getDate } from '../utils'; -import { readFileSync } from 'fs'; import { BatchState } from '../batchState'; import { getCollectionDescription, getCollectionName } from './helpers'; async function getStorages(meta: ProgramMetadata) { const payload = '0x01'; - const result = await gearReadStateReq(config.nfts.vit, payload); + const result = await gearReadStateReq(config.nfts.cb, payload); const data = meta.createType((meta.types.state as HumanTypesRepr).output, result); if (data.isStorageIds) { return data.asStorageIds.toJSON() as HexString[]; @@ -16,22 +17,33 @@ async function getStorages(meta: ProgramMetadata) { } const meta = ProgramMetadata.from(readFileSync('./assets/cb-nft.meta.txt', 'utf8')); -const nftMeta = ProgramMetadata.from(readFileSync('./assets/vit-nft.meta.txt', 'utf8')); -const blockNumber = BigInt(config.nfts.vitMigratedAtBlock); -const timestamp = new Date(config.nfts.vitMigratedTS); +const nftMeta = ProgramMetadata.from(readFileSync('./assets/cb-storage.meta.txt', 'utf8')); +const blockNumber = BigInt(config.nfts.cbMigratedAtBlock); +const timestamp = new Date(config.nfts.cbMigratedTs); export async function readMigratedNfts(state: BatchState) { const storages = await getStorages(meta); - const description = await getCollectionDescription(meta, config.nfts.vit); - const name = await getCollectionName(meta, config.nfts.vit); - const collection = state.newCollection(config.nfts.vit, name, description); - for (let i = 0; i < storages.length; i += 5) { - const result = await gearReadStateBatchReq(storages.slice(i, i + 5), '0x02'); - - for (const value of result) { - const data = nftMeta.createType((nftMeta.types.state as HumanTypesRepr).output, value); + const description = await getCollectionDescription(meta, config.nfts.cb); + const name = await getCollectionName(meta, config.nfts.cb); + const collection = state.newCollection(config.nfts.cb, name, description); + + const batchSize = 5; + for (let i = 0; i < storages.length; i += batchSize) { + console.log(`Reading storage ${i + 1} - ${i + batchSize} of ${storages.length}`); + + const [tokens, links] = await Promise.all([ + gearReadStateBatchReq(storages.slice(i, i + batchSize), '0x02'), + gearReadStateBatchReq(storages.slice(i, i + batchSize), '0x06'), + ]); + + for (let j = 0; j < batchSize; j++) { + const data = nftMeta.createType((nftMeta.types.state as HumanTypesRepr).output, tokens[j]); + const link = nftMeta.createType((nftMeta.types.state as HumanTypesRepr).output, links[j]); + + const mediaLink = link.asIpfsFolderLink; + if (data.isAllTokensRawData) { - for (const { media, owner, link, activities } of data.asAllTokensRawData) { + for (const { media, owner, activities } of data.asAllTokensRawData) { await state.mintNft( media.toString(), collection, @@ -44,7 +56,7 @@ export async function readMigratedNfts(state: BatchState) { }), description, name + ' - ' + media.toString(), - link.toString(), + `${mediaLink}/${media.toString()}.png`, blockNumber, timestamp, ); @@ -52,6 +64,5 @@ export async function readMigratedNfts(state: BatchState) { } } } - await state.save(); } diff --git a/src/main.ts b/src/main.ts index 8a4ac13..171e0cb 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,7 +4,7 @@ import { UserMessageSentArgs } from './types'; import config from './config'; import { BatchState } from './batchState'; import { cbNftHandler } from './handlers/cb-nft'; -import { readMigratedNfts } from './handlers/vit-nft'; +import { readMigratedNfts } from './handlers/migrated-nft'; import { draftNftHandler } from './handlers/draft-nft'; const programs = [config.nfts.cb, config.nfts.vit]; @@ -14,7 +14,7 @@ if (config.nfts.old !== '') { simpleNfts.push(...config.nfts.old.split(',')); } -let isMigratedNftsSaved = !config.nfts.readMigrateNfts; +let isMigratedNftsSaved = !config.nfts.readMigratedNfts; const state = new BatchState(); diff --git a/src/types/vit.nft.ts b/src/types/vit.nft.ts index 5ccd1b1..198ec9a 100644 --- a/src/types/vit.nft.ts +++ b/src/types/vit.nft.ts @@ -1,7 +1,9 @@ -import { Enum, Vec } from '@polkadot/types'; +import { Enum, Text, Vec } from '@polkadot/types'; import { InnerTokenMeta } from './cb-nft'; -export interface VitNftStateReply extends Enum { +export interface StorageStateReply extends Enum { isAllTokensRawData: boolean; asAllTokensRawData: Vec; + isIpfsFolderLink: boolean; + asIpfsFolderLink: Text; } diff --git a/src/utils.ts b/src/utils.ts index 3246ecb..50d39fe 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,4 +1,3 @@ -import { CreateType } from '@gear-js/api'; import config from './config'; export function getDate(ts: string) {