From d86e84db5555bb961ec26e46c2162eb2d770bc5a Mon Sep 17 00:00:00 2001 From: psparacino Date: Fri, 2 Aug 2024 13:58:44 -0400 Subject: [PATCH 1/3] pdc: add unsupported_registry fallback so new c3 registries don't break subgraph --- polygon-digital-carbon/schema.graphql | 1 + polygon-digital-carbon/src/utils/CarbonCredit.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/polygon-digital-carbon/schema.graphql b/polygon-digital-carbon/schema.graphql index 760391d7..d3f6970f 100644 --- a/polygon-digital-carbon/schema.graphql +++ b/polygon-digital-carbon/schema.graphql @@ -8,6 +8,7 @@ enum Registry { J_CREDIT ECO_REGISTRY CCS + UNSUPPORTED_REGISTRY } enum RetireSource { diff --git a/polygon-digital-carbon/src/utils/CarbonCredit.ts b/polygon-digital-carbon/src/utils/CarbonCredit.ts index e43f704d..0f56d600 100644 --- a/polygon-digital-carbon/src/utils/CarbonCredit.ts +++ b/polygon-digital-carbon/src/utils/CarbonCredit.ts @@ -170,6 +170,7 @@ function updateC3Call(tokenAddress: Address, carbonCredit: CarbonCredit): Carbon else if (attributes.registry == 'JCS' || attributes.registry == 'JPN') registry = 'J_CREDIT' else if (attributes.registry == 'ACR') registry = 'AMERICAN_CARBON_REGISTRY' else if (attributes.registry == 'ECO') registry = 'ECO_REGISTRY' + else registry = 'UNSUPPORTED_REGISTRY'; let projectID: string From 00bb82e14b0a77e28d268ded1a7266f782f221f9 Mon Sep 17 00:00:00 2001 From: psparacino Date: Thu, 26 Sep 2024 11:23:07 -0400 Subject: [PATCH 2/3] create Debug entity and log unsupported registry --- polygon-digital-carbon/schema.graphql | 14 +++++++++++++- polygon-digital-carbon/src/utils/CarbonCredit.ts | 16 +++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/polygon-digital-carbon/schema.graphql b/polygon-digital-carbon/schema.graphql index d3f6970f..fdae44ab 100644 --- a/polygon-digital-carbon/schema.graphql +++ b/polygon-digital-carbon/schema.graphql @@ -761,8 +761,20 @@ type PuroIdMigration @entity { # Subgraph Versioning -type SubgraphVersion @entity(immutable: true) { +type SubgraphVersion @entity(immutable: true) { id: ID! schemaVersion: String! publishedVersion: String! } + +# Custom Error to assist with debugging + +type Debug @entity(immutable: true) { + id: ID! + functionName: String! + error: String! + # 0 if not available + blockNumber: BigInt! + # 0x if not available + transactionHash: Bytes! +} diff --git a/polygon-digital-carbon/src/utils/CarbonCredit.ts b/polygon-digital-carbon/src/utils/CarbonCredit.ts index 0f56d600..45641f7b 100644 --- a/polygon-digital-carbon/src/utils/CarbonCredit.ts +++ b/polygon-digital-carbon/src/utils/CarbonCredit.ts @@ -2,7 +2,7 @@ import { Address, BigInt, Bytes, dataSource } from '@graphprotocol/graph-ts' import { stdYearFromTimestampNew as stdYearFromTimestamp } from '../../../lib/utils/Dates' import { ZERO_BI } from '../../../lib/utils/Decimals' import { C3ProjectToken } from '../../generated/templates/C3ProjectToken/C3ProjectToken' -import { CarbonCredit, CarbonProject } from '../../generated/schema' +import { CarbonCredit, CarbonProject, Debug } from '../../generated/schema' import { ToucanCarbonOffsets } from '../../generated/templates/ToucanCarbonOffsets/ToucanCarbonOffsets' import { loadOrCreateCarbonProject } from './CarbonProject' import { MethodologyCategories } from './MethodologyCategories' @@ -170,7 +170,16 @@ function updateC3Call(tokenAddress: Address, carbonCredit: CarbonCredit): Carbon else if (attributes.registry == 'JCS' || attributes.registry == 'JPN') registry = 'J_CREDIT' else if (attributes.registry == 'ACR') registry = 'AMERICAN_CARBON_REGISTRY' else if (attributes.registry == 'ECO') registry = 'ECO_REGISTRY' - else registry = 'UNSUPPORTED_REGISTRY'; + else registry = 'UNSUPPORTED_REGISTRY' + + if (registry == 'UNSUPPORTED_REGISTRY') { + let debug = new Debug(`UNSUPPORTED_REGISTRY. tokenAddress: ${tokenAddress.toHexString()}`) + debug.functionName = 'updateC3Call' + debug.error = 'Unsupported registry found in updateC3Call' + debug.blockNumber = BigInt.fromI32(0) + debug.transactionHash = Bytes.fromI32(0) + debug.save() + } let projectID: string @@ -193,7 +202,8 @@ function updateC3Call(tokenAddress: Address, carbonCredit: CarbonCredit): Carbon carbonCredit.save() project.methodologies = attributes.methodology - project.category = project.category != '' ? project.category : MethodologyCategories.getMethodologyCategory(project.methodologies) + project.category = + project.category != '' ? project.category : MethodologyCategories.getMethodologyCategory(project.methodologies) project.region = attributes.region project.save() From c2371d655756b3dee257adea9d32604e3fee9561 Mon Sep 17 00:00:00 2001 From: psparacino Date: Thu, 26 Sep 2024 11:35:30 -0400 Subject: [PATCH 3/3] create Debug and return if no retire found for loadRetire --- polygon-digital-carbon/src/KlimaAggregator.ts | 28 ++++++++++++++++++- .../src/RetirementHandler.ts | 23 +++++++++++++++ polygon-digital-carbon/src/TransferHandler.ts | 7 +++++ polygon-digital-carbon/src/utils/Debug.ts | 11 ++++++++ 4 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 polygon-digital-carbon/src/utils/Debug.ts diff --git a/polygon-digital-carbon/src/KlimaAggregator.ts b/polygon-digital-carbon/src/KlimaAggregator.ts index d68b3f41..c347735b 100644 --- a/polygon-digital-carbon/src/KlimaAggregator.ts +++ b/polygon-digital-carbon/src/KlimaAggregator.ts @@ -11,6 +11,7 @@ import { saveKlimaRetire } from './utils/KlimaRetire' import { ZERO_BI } from '../../lib/utils/Decimals' import { getRetirementsContractAddress } from '../utils/helpers' import { SubgraphVersion } from '../generated/schema' +import { createDebug } from './utils/Debug' export function handleMossRetired(event: MossRetired): void { // Ignore zero value retirements @@ -28,6 +29,11 @@ export function handleMossRetired(event: MossRetired): void { let retire = loadRetire(sender.id.concatI32(sender.totalRetirements - 1)) + if (!retire) { + createDebug('handleMossRetired', 'Retire not found', event.block.number, event.transaction.hash) + return + } + if (event.params.carbonPool != ZERO_ADDRESS) retire.pool = event.params.carbonPool retire.source = 'KLIMA' @@ -62,6 +68,11 @@ export function handleToucanRetired(event: ToucanRetired): void { let retire = loadRetire(sender.id.concatI32(sender.totalRetirements - 1)) + if (!retire) { + createDebug('handleToucanRetired', 'Retire not found', event.block.number, event.transaction.hash) + return + } + if (event.params.carbonPool != ZERO_ADDRESS) retire.pool = event.params.carbonPool retire.source = 'KLIMA' @@ -96,6 +107,11 @@ export function handleC3Retired(event: C3Retired): void { let retire = loadRetire(sender.id.concatI32(sender.totalRetirements - 1)) + if (!retire) { + createDebug('handleC3Retired', 'Retire not found', event.block.number, event.transaction.hash) + return + } + if (event.params.carbonPool != ZERO_ADDRESS) retire.pool = event.params.carbonPool retire.source = 'KLIMA' @@ -130,6 +146,11 @@ export function handleCarbonRetired(event: CarbonRetired): void { let retire = loadRetire(sender.id.concatI32(sender.totalRetirements - 1)) + if (!retire) { + createDebug('handleCarbonRetired', 'Retire not found', event.block.number, event.transaction.hash) + return + } + if (event.params.carbonPool != ZERO_ADDRESS) retire.pool = event.params.carbonPool retire.source = 'KLIMA' @@ -161,7 +182,12 @@ export function handleCarbonRetiredWithTokenId(event: CarbonRetiredTokenId): voi loadOrCreateAccount(event.params.retiringAddress) loadOrCreateAccount(event.params.beneficiaryAddress) - let retire = loadRetire(sender.id.concatI32(sender.totalRetirements - 1)) + let retire = loadRetire(sender.id.concatI32(sender.totalRetirements - 1)) + + if (!retire) { + createDebug('handleCarbonRetiredWithTokenId', 'Retire not found', event.block.number, event.transaction.hash) + return + } if (event.params.carbonPool != ZERO_ADDRESS) retire.pool = event.params.carbonPool diff --git a/polygon-digital-carbon/src/RetirementHandler.ts b/polygon-digital-carbon/src/RetirementHandler.ts index 360e5219..a819a6d0 100644 --- a/polygon-digital-carbon/src/RetirementHandler.ts +++ b/polygon-digital-carbon/src/RetirementHandler.ts @@ -26,6 +26,7 @@ import { loadAsyncRetireRequest, loadOrCreateAsyncRetireRequest } from './utils/ import { C3RetirementMetadata as C3RetirementMetadataTemplate } from '../generated/templates' import { extractIpfsHash } from '../utils/ipfs' import { returnedPoccID } from '../generated/Coorest/Coorest' +import { createDebug } from './utils/Debug' export function saveToucanRetirement(event: Retired): void { // Disregard events with zero amount @@ -134,6 +135,12 @@ export function saveToucanPuroRetirementRequest(event: RetirementRequested): voi let request = loadOrCreateAsyncRetireRequest(requestId) let retire = loadRetire(retireId) + + if (!retire) { + createDebug('saveToucanPuroRetirementRequest', 'Retire not found', event.block.number, event.transaction.hash) + return + } + retire.beneficiaryLocation = event.params.params.beneficiaryLocation retire.consumptionCountryCode = event.params.params.consumptionCountryCode retire.consumptionPeriodStart = event.params.params.consumptionPeriodStart @@ -277,6 +284,12 @@ export function handleReturnedPoccID(event: returnedPoccID): void { log.info('Returned POCC ID event fired {}', [event.transaction.hash.toHexString()]) let sender = loadOrCreateAccount(event.transaction.from) let retire = loadRetire(sender.id.concatI32(sender.totalRetirements - 1)) + + if (!retire) { + createDebug('handleReturnedPoccID', 'Retire not found', event.block.number, event.transaction.hash) + return + } + retire.retirementTokenId = event.params.poccID retire.save() } @@ -349,6 +362,11 @@ export function saveStartAsyncToken(event: StartAsyncToken): void { let retire = loadRetire(retireId) + if (!retire) { + createDebug('saveStartAsyncToken', 'Retire not found', event.block.number, event.transaction.hash) + return + } + let requestId = createAsyncRetireRequestId(event.params.fromToken, event.params.index) let c3RetireRequestDetails = loadOrCreateC3RetireRequestDetails(requestId) @@ -382,6 +400,11 @@ export function completeC3RetireRequest(event: EndAsyncToken): void { let retireId: Bytes = asyncRetireRequest.retire let retire = loadRetire(retireId) + if (!retire) { + createDebug('completeC3RetireRequest', 'Retire not found', event.block.number, event.transaction.hash) + return + } + if (c3RetireRequestDetails == null) { log.error('No C3RetireRequest found for retireId: {} hash: {}', [event.transaction.hash.toHexString()]) return diff --git a/polygon-digital-carbon/src/TransferHandler.ts b/polygon-digital-carbon/src/TransferHandler.ts index d2f796aa..ab13e9ed 100644 --- a/polygon-digital-carbon/src/TransferHandler.ts +++ b/polygon-digital-carbon/src/TransferHandler.ts @@ -42,6 +42,7 @@ import { loadOrCreateAsyncRetireRequest } from './utils/AsyncRetireRequest' import { AsyncRetireRequestStatus } from '../utils/enums' import { convertToAmountTonnes, createAsyncRetireRequestId } from '../utils/helpers' import { burnedCO2Token } from '../generated/CCO2/CCO2' +import { createDebug } from './utils/Debug' export function handleCreditTransfer(event: Transfer): void { recordTransfer( @@ -115,6 +116,12 @@ export function handleToucanPuroRetirementFinalized(event: RetirementFinalized): if (request.retire !== null) { let retire = loadRetire(request.retire) + + if (!retire) { + createDebug('handleToucanPuroRetirementFinalized', 'Retire not found', event.block.number, event.transaction.hash) + return + } + retire.asyncRetireStatus = AsyncRetireRequestStatus.FINALIZED retire.save() } diff --git a/polygon-digital-carbon/src/utils/Debug.ts b/polygon-digital-carbon/src/utils/Debug.ts new file mode 100644 index 00000000..a5dd3090 --- /dev/null +++ b/polygon-digital-carbon/src/utils/Debug.ts @@ -0,0 +1,11 @@ +import { Bytes, BigInt } from '@graphprotocol/graph-ts' +import { Debug } from '../../generated/schema' + +export function createDebug(functionName: string, error: string, blockNumber: BigInt, transactionHash: Bytes): void { + let debug = new Debug(functionName) + debug.functionName = functionName + debug.error = error + debug.blockNumber = blockNumber + debug.transactionHash = transactionHash + debug.save() +}