From b7f78a22aa7e1cca3fd1fbf3b453abcfd1bd6035 Mon Sep 17 00:00:00 2001 From: sarmat Date: Wed, 15 Mar 2023 14:34:05 -0600 Subject: [PATCH] add data migration with locking --- scripts/deploy.ts | 57 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/scripts/deploy.ts b/scripts/deploy.ts index 8cccfe5..e9550d2 100644 --- a/scripts/deploy.ts +++ b/scripts/deploy.ts @@ -1,5 +1,9 @@ import { GSN_MUMBAI_FORWARDER_CONTRACT_ADDRESS } from '@big-whale-labs/constants' +import { OBSSStorage } from 'typechain' +import { cwd } from 'process' import { ethers, run, upgrades } from 'hardhat' +import { readFileSync } from 'fs' +import { resolve } from 'path' import { utils } from 'ethers' import { version } from '../package.json' import prompt from 'prompt' @@ -8,6 +12,25 @@ const regexes = { ethereumAddress: /^0x[a-fA-F0-9]{40}$/, } +type LegacyData = + | OBSSStorage.LegacyPostStruct[] + | OBSSStorage.LegacyReactionStruct[] + +function getBatchOfData(data: LegacyData, start: number, end: number) { + return data.slice(start, end) +} + +function prepareAllBatches(data: LegacyData) { + const batchStep = 10 + const batches: LegacyData[] = [] + for (let i = 0; i < data.length; i += batchStep) { + const batch = getBatchOfData(data, i, i + batchStep) + console.log(batch) + batches.push(batch) + } + return batches +} + async function main() { const [deployer] = await ethers.getSigners() @@ -79,10 +102,44 @@ async function main() { ) const adminAddress = await upgrades.erc1967.getAdminAddress(contract.address) + const deployedContract = factory.attach(contract.address).connect(provider) + console.log('OBSSStorage Proxy address:', contract.address) console.log('Implementation address:', implementationAddress) console.log('Admin address:', adminAddress) + console.log('Migrating data...') + const legacyPosts = JSON.parse( + readFileSync(resolve(cwd(), 'data', 'legacy-posts.json'), 'utf-8') + ) + const legacyReactions = JSON.parse( + readFileSync(resolve(cwd(), 'data', 'legacy-reactions.json'), 'utf-8') + ) + const legacyPostsBatches = prepareAllBatches(legacyPosts) + const legacyReactionsBatches = prepareAllBatches(legacyReactions) + + for (let i = 0; i < legacyPosts.length; i++) { + console.log(`Loading data batch ${i}`) + const tx = await deployedContract.migrateLegacyData( + legacyPostsBatches[i] as OBSSStorage.LegacyPostStruct[], + legacyReactionsBatches[i] as OBSSStorage.LegacyReactionStruct[] + ) + const receipt = await tx.wait() + console.log( + `Batch ${i} minted `, + `https://mumbai.polygonscan.com/tx/${receipt.transactionHash}` + ) + } + console.log('Data migration done!') + + console.log('Locking data migration...') + + await deployedContract.lockDataMigration() + const isDataLoadingLocked = await deployedContract.isDataMigrationLocked() + if (isDataLoadingLocked) { + console.log('Data migration locked!') + } + console.log('Wait for 1 minute to make sure blockchain is updated') await new Promise((resolve) => setTimeout(resolve, 15 * 1000))