Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions db/migrations/1706784285254-Data.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,21 @@ module.exports = class Data1706784285254 {
// Script inserted manually. Modifies the foreign key constraint on the verified_contract table to delete
// the verified contract when the contract is deleted.
// *************************************************************************************************************
await db.query(`ALTER TABLE "verified_contract" DROP CONSTRAINT "FK_70c992c058f4f82d658a2cd899c";`);
await db.query(`ALTER TABLE "verified_contract" ADD CONSTRAINT "FK_70c992c058f4f82d658a2cd899c" FOREIGN KEY ("contract_id") REFERENCES "contract"("id") ON DELETE CASCADE ON UPDATE NO ACTION`)
try {
await db.query(`
ALTER TABLE "verified_contract"
DROP CONSTRAINT IF EXISTS "FK_70c992c058f4f82d658a2cd899c";
`);
} catch (error) {
console.log("Catched FK_70c992c058f4f82d658a2cd899c error:", error);
}


await db.query(`
ALTER TABLE "verified_contract"
ADD CONSTRAINT "FK_70c992c058f4f82d658a2cd899c"
FOREIGN KEY ("contract_id") REFERENCES "contract"("id")
ON DELETE CASCADE ON UPDATE NO ACTION;
`);
}
}
52 changes: 51 additions & 1 deletion src/processor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,108 +108,155 @@ processor.run(database, async (ctx_) => {
});

const processBatch = async (batch: Block<Fields>[]) => {
console.log("[processBatch] function called") //remove-this-later
// Push data from previous batch
if (newBlockData) {
console.log("new block detected") //remove-this-later
if (firebaseDB) firebaseDB.notifyBlock(newBlockData);
if (emitterIO) emitterIO.notifyBlock(newBlockData);
if (pusher) pusher.notifyBlock(newBlockData);
console.log("emitted the new block") //remove-this-later
}

// Initialize global variables in first batch
if (isFirstBatch) {
console.log("is this the first batch?") //remove-this-later
const reefVerifiedContract_ = await ctx.store.get(VerifiedContract, REEF_CONTRACT_ADDRESS);
console.log("reef verified contract instance fetched") //remove-this-later
if (reefVerifiedContract_) {
console.log("is reef verified contract") //remove-this-later
reefVerifiedContract = reefVerifiedContract_;
} else {
console.log("no reef verified contract in db") //remove-this-later
throw new Error('REEF verified contract not found in the database');
}

const emptyAccount_ = await ctx.store.get(Account, "0x");
console.log("get empty account instance") //remove-this-later
if (emptyAccount_) {
emptyAccount = emptyAccount_;
} else {
console.log("empty account not found") //remove-this-later
throw new Error('Empty account not found in the database');
}

const emptyExtrinsic_ = await ctx.store.get(Extrinsic, "-1");
console.log("get empty extrinsic") //remove-this-later
if (emptyExtrinsic_) {
emptyExtrinsic = emptyExtrinsic_;
} else {
console.log("empty extrinsic not found") //remove-this-later
throw new Error('Empty extrinsic not found in the database');
}


isFirstBatch = false;
}

// Initialize managers
const blockManager: BlockManager = new BlockManager();
console.log("1/10 block manager init") //remove-this-later
const extrinsicManager: ExtrinsicManager = new ExtrinsicManager();
console.log("2/10 extrinsic manager init") //remove-this-later
const eventManager: EventManager = new EventManager();
console.log("3/10 event manager init") //remove-this-later
const contractManager: ContractManager = new ContractManager();
console.log("4/10 contract manager init") //remove-this-later
const evmEventManager: EvmEventManager = new EvmEventManager();
console.log("5/10 evm event manager init") //remove-this-later
const tokenHolderManager: TokenHolderManager = new TokenHolderManager();
console.log("6/10 token holder manager init") //remove-this-later
const stakingManager: StakingManager = new StakingManager();
console.log("7/10 staking manager init") //remove-this-later
const stakingElectionManager: StakingElectionManager = new StakingElectionManager();
console.log("8/10 staking election manager init") //remove-this-later
const transferManager: TransferManager = new TransferManager(tokenHolderManager);
console.log("9/10 transfer manager init") //remove-this-later
const accountManager = new AccountManager(tokenHolderManager, transferManager);
console.log("10/10 account manager init") //remove-this-later

if (batch.length > 1) ctx.log.debug(`Batch size: ${batch.length}`);
console.log("batch size ",batch.length) //remove-this-later

// Process blocks
for (const block of batch) {
console.log("block processing started") //remove-this-later
if (!headReached && ctx.blocks[0].header.height > 1 && ctx.isHead
&& block.header.height === ctx.blocks[ctx.blocks.length - 1].header.height) {
headReached = true;
await updateFromHead(block.header);
}

console.log("processing block") //remove-this-later
blockManager.process(block.header);
console.log("processed block") //remove-this-later

ctx.log.debug(`Processing block ${block.header.height}`);

for (const event of block.events) {
if (event.phase === "Initialization" &&
(event.name === 'Staking.StakingElection' || event.name === 'Staking.StakersElected') ) {
await stakingElectionManager.process(event);
console.log("staking process start") //remove-this-later
await stakingElectionManager.process(event);
console.log("staking process end") //remove-this-later
} else if (event.phase === "ApplyExtrinsic") {
const signedData = await extrinsicManager.process(event);
eventManager.process(event);
console.log("end") //remove-this-later

switch (event.name) {
case 'EVM.Log':
console.log("evm.log process start") //remove-this-later
await evmEventManager.process(event, signedData, transferManager, accountManager, ctx.store);
console.log("end") //remove-this-later
break;
case 'EVM.Created':
console.log("evm.created process start") //remove-this-later
await contractManager.process(event);
console.log("end") //remove-this-later
break;
case 'EVM.ExecutedFailed':
console.log("evm.executedfailed process start") //remove-this-later
await evmEventManager.process(event, signedData, transferManager, accountManager);
console.log("end") //remove-this-later
break;

case 'EvmAccounts.ClaimAccount':
console.log("evmaccounts.claimaccount process start") //remove-this-later
const addressClaimer = hexToNativeAddress(event.args[0]);
await accountManager.process(addressClaimer, block.header, true, true);
console.log("end") //remove-this-later
break;

case 'Balances.Endowed':
console.log("balances.endowed process start") //remove-this-later
const addressEndowed = hexToNativeAddress(event.args[0]);
await accountManager.process(addressEndowed, block.header);
console.log("end") //remove-this-later
break;
case 'Balances.Reserved':
console.log("balances process start") //remove-this-later
const addressReserved = hexToNativeAddress(event.args[0]);
await accountManager.process(addressReserved, block.header);
console.log("end") //remove-this-later
break;
case 'Balances.Transfer':
console.log("balances transfer process start") //remove-this-later
await transferManager.process(event, accountManager, reefVerifiedContract, signedData, true);
console.log("end") //remove-this-later
break;

case 'Staking.Rewarded':
console.log("staking process start") //remove-this-later
await stakingManager.process(event, accountManager);
console.log("end") //remove-this-later
break;

case 'System.KilledAccount':
console.log("system.killedAccount process start") //remove-this-later
const address = hexToNativeAddress(event.args);
await accountManager.process(address, block.header, false);
console.log("end") //remove-this-later
break;
}
}
Expand Down Expand Up @@ -237,14 +284,17 @@ const processBatch = async (batch: Block<Fields>[]) => {
.filter(t => t.token.type === 'ERC20' && t.signerAddress !== '')
.map(t => t.signerAddress as string)
.filter((value, index, array) => array.indexOf(value) === index);
console.log("updatedErc20Accounts parsed") //remove-this-later
const updatedErc721Accounts = Array.from(tokenHolderManager.tokenHoldersData.values())
.filter(t => t.token.type === 'ERC721' && t.signerAddress !== '')
.map(t => t.signerAddress as string)
.filter((value, index, array) => array.indexOf(value) === index);
console.log("updatedErc721Accounts parsed") //remove-this-later
const updatedErc1155Accounts = Array.from(tokenHolderManager.tokenHoldersData.values())
.filter(t => t.token.type === 'ERC1155' && t.signerAddress !== '')
.map(t => t.signerAddress as string)
.filter((value, index, array) => array.indexOf(value) === index);
console.log("updatedErc1155Accounts parsed") //remove-this-later

newBlockData = {
blockHeight: lastBlockHeader.height,
Expand Down