@clayno-club/asset-flow 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/chains/solana/index.ts","../src/chains/solana/utils.ts","../src/chains/solana/facts/build-facts.ts","../src/chains/solana/matchers/classify.ts","../src/chains/solana/matchers/core/direct-nft-transfer.ts","../src/chains/solana/matchers/core/explicit-nft-sale.ts","../src/chains/solana/matchers/core/nft-mint.ts","../src/semantics/marketplace.ts","../src/chains/solana/matchers/marketplace/magic-eden-buy-intent.ts","../src/chains/solana/matchers/marketplace/magic-eden-lucky-buy.ts","../src/chains/solana/matchers/marketplace/marketplace-bid.ts","../src/chains/solana/matchers/marketplace/marketplace-listing.ts","../src/chains/solana/matchers/marketplace/hyperspace-instant-sell.ts","../src/chains/solana/matchers/marketplace/tensor-unknown-sale.ts","../src/chains/solana/matchers/protocol/bet-program-activity.ts","../src/chains/solana/matchers/protocol/bubblegum-compressed-mint.ts","../src/chains/solana/matchers/protocol/candy-machine-route.ts","../src/chains/solana/matchers/protocol/clay-class-program-activity.ts","../src/chains/solana/matchers/protocol/corrupt-program-unwind.ts","../src/chains/solana/matchers/protocol/fungible-token-transfer-noise.ts","../src/chains/solana/matchers/protocol/foxy-cancel-swap.ts","../src/chains/solana/matchers/protocol/foxy-init-swap.ts","../src/chains/solana/matchers/protocol/foxy-raffle-transfer.ts","../src/chains/solana/matchers/protocol/foxy-swap.ts","../src/chains/solana/matchers/protocol/hadeswap-activity.ts","../src/semantics/loan.ts","../src/chains/solana/matchers/protocol/loan-collateral-transfer.ts","../src/chains/solana/matchers/protocol/loan-program-activity.ts","../src/chains/solana/matchers/protocol/metaplex-resize-activity.ts","../src/chains/solana/matchers/protocol/migrate-to-pnft.ts","../src/chains/solana/matchers/protocol/metaplex-metadata-update.ts","../src/chains/solana/matchers/protocol/sharky-repay-loan-sale.ts","../src/chains/solana/matchers/protocol/sharky-take-loan-transfer.ts","../src/chains/solana/matchers/protocol/tlock-legacy-claim.ts","../src/chains/solana/matchers/fallbacks.ts","../src/chains/solana/matchers/registry.ts","../src/chains/solana/matchers/select.ts","../src/chains/solana/observation.ts","../src/chains/solana/explain.ts","../src/chains/solana/classifier.ts","../src/chains/solana/coverage.ts","../src/semantics/sale.ts","../src/chains/solana/protocol-events.ts","../src/semantics/canonicalize.ts","../src/semantics/custody.ts","../src/semantics/ownership.ts","../src/semantics/value-movement-extraction.ts","../src/semantics/value-movements.ts","../src/chains/solana/normalize.ts","../src/chains/solana/raw.ts","../src/chains/sui/index.ts","../src/chains/sui/helpers.ts","../src/chains/sui/classifier.ts","../src/chains/sui/normalize.ts"],"sourcesContent":["export * from \"./classifier.js\";\nexport * from \"./coverage.js\";\nexport * from \"./explain.js\";\nexport * from \"./facts/build-facts.js\";\nexport * from \"./facts/types.js\";\nexport * from \"./matchers/classify.js\";\nexport * from \"./matchers/registry.js\";\nexport * from \"./matchers/select.js\";\nexport * from \"./matchers/types.js\";\nexport * from \"./normalize.js\";\nexport * from \"./observation.js\";\nexport * from \"./protocol-events.js\";\nexport * from \"./raw.js\";\nexport * from \"./utils.js\";\n\nexport { classifyEnhancedTransactionForMint as classify } from \"./classifier.js\";\nexport { explainEnhancedTransactionForMint as explain } from \"./explain.js\";\nexport { extractMintFlows as buildFlows } from \"./normalize.js\";\nexport { normalizeMintHistory as buildMintHistory } from \"./normalize.js\";\nexport { reconstructOwnershipPeriods as buildOwnershipPeriods } from \"./normalize.js\";\nexport { extractValueMovements as buildValueMovements } from \"./normalize.js\";\nexport { extractCandidateMintsFromEnhancedTx as extractMints } from \"./normalize.js\";\nexport { augmentEnhancedTransactionWithRaw as augmentWithRaw } from \"./raw.js\";\nexport { shouldFetchRawForMintTx as shouldFetchRaw } from \"./raw.js\";\n","import type { HeliusEnhancedAction, HeliusEnhancedTx, HeliusTokenTransfer } from \"./types.js\";\n\nconst MEANINGFUL_SETTLEMENT_LAMPORTS = 10_000_000;\n\nexport function normalizeEnhancedType(value: string | undefined): string {\n if (!value) return \"\";\n return value\n .trim()\n .replace(/[^\\w]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_|_$/g, \"\")\n .toUpperCase();\n}\n\nexport function toNullableNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === \"string\" && value.trim().length > 0) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n return null;\n}\n\nexport function isNonFungibleTokenStandard(tokenStandard: string | null | undefined): boolean {\n return tokenStandard === \"ProgrammableNonFungible\" || tokenStandard === \"NonFungible\";\n}\n\nexport function isMintNftTransfer(transfer: HeliusTokenTransfer, mint: string): boolean {\n const numericAmount =\n typeof transfer.tokenAmount === \"number\" ? transfer.tokenAmount : Number(transfer.tokenAmount ?? NaN);\n if (!Number.isFinite(numericAmount) || numericAmount <= 0) return false;\n if (transfer.mint !== mint) return false;\n return isNonFungibleTokenStandard(transfer.tokenStandard);\n}\n\nexport function getMintNftTransfers(tx: HeliusEnhancedTx, mint: string): HeliusTokenTransfer[] {\n return (tx.tokenTransfers ?? []).filter((transfer) => isMintNftTransfer(transfer, mint));\n}\n\nfunction isMeaningfulPaidAction(\n action: HeliusEnhancedAction,\n primaryBuyer: string | null,\n primarySeller: string | null,\n): boolean {\n if (normalizeEnhancedType(action.actionType) !== \"PAID\") return false;\n\n const amount = toNullableNumber(action.amount);\n if (!amount || amount < MEANINGFUL_SETTLEMENT_LAMPORTS) return false;\n\n const from = action.from ?? null;\n const to = action.to ?? null;\n return from === primaryBuyer || to === primarySeller || from === primarySeller || to === primaryBuyer;\n}\n\nexport function hasMeaningfulNativeSettlement(tx: HeliusEnhancedTx, mint: string): boolean {\n const nftTransfers = getMintNftTransfers(tx, mint);\n if (nftTransfers.length === 0) return false;\n\n const primaryBuyer = nftTransfers[nftTransfers.length - 1]?.toUserAccount ?? null;\n const primarySeller = nftTransfers[0]?.fromUserAccount ?? null;\n const largeNativeTransfers = (tx.nativeTransfers ?? []).filter((transfer) => {\n const amount = toNullableNumber(transfer.amount);\n return !!amount && amount >= MEANINGFUL_SETTLEMENT_LAMPORTS;\n });\n const hasMatchingNativeTransfer = largeNativeTransfers.some((transfer) => {\n const from = transfer.fromUserAccount ?? null;\n const to = transfer.toUserAccount ?? null;\n return from === primaryBuyer || to === primarySeller || from === primarySeller || to === primaryBuyer;\n });\n\n if (hasMatchingNativeTransfer) {\n return true;\n }\n\n return (tx.actions ?? []).some((action) => isMeaningfulPaidAction(action, primaryBuyer, primarySeller));\n}\n","import type { HeliusEnhancedInstruction, HeliusEnhancedTx } from \"../types.js\";\nimport { getMintNftTransfers, hasMeaningfulNativeSettlement, normalizeEnhancedType } from \"../utils.js\";\nimport type { AssetFlowTransactionFacts } from \"./types.js\";\n\nconst NOISY_OWNERSHIP_CHANGE_SOURCES = new Set([\n \"ASSOCIATED_TOKEN_PROGRAM\",\n \"SYSTEM_PROGRAM\",\n \"SOLANA_PROGRAM_LIBRARY\",\n \"UNKNOWN\",\n]);\n\nfunction collectInstructionProgramIds(\n instructions: HeliusEnhancedInstruction[] | undefined,\n programIds: Set<string>,\n): void {\n for (const instruction of instructions ?? []) {\n if (instruction.programId) {\n programIds.add(instruction.programId);\n }\n\n if (instruction.innerInstructions?.length) {\n collectInstructionProgramIds(instruction.innerInstructions, programIds);\n }\n }\n}\n\nfunction collectInstructionLabels(instructions: HeliusEnhancedInstruction[] | undefined, labels: Set<string>): void {\n for (const instruction of instructions ?? []) {\n if (instruction.name) {\n labels.add(instruction.name);\n }\n\n if (instruction.innerInstructions?.length) {\n collectInstructionLabels(instruction.innerInstructions, labels);\n }\n }\n}\n\nfunction getNetTransferEndpoints(nftTransfers: AssetFlowTransactionFacts[\"nftTransfers\"]): {\n from: string | null;\n to: string | null;\n} {\n const from = nftTransfers.find((transfer) => transfer.fromUserAccount)?.fromUserAccount ?? null;\n const to = [...nftTransfers].reverse().find((transfer) => transfer.toUserAccount)?.toUserAccount ?? null;\n return { from, to };\n}\n\nexport function buildTransactionFacts(tx: HeliusEnhancedTx, mint: string): AssetFlowTransactionFacts {\n const nftTransfers = getMintNftTransfers(tx, mint);\n const { from: primarySeller, to: primaryBuyer } = getNetTransferEndpoints(nftTransfers);\n const hasMeaningfulSettlement = hasMeaningfulNativeSettlement(tx, mint);\n const programIds = new Set((tx.programIds ?? []).filter(Boolean));\n const instructionLabels = new Set((tx.instructionLabels ?? []).filter(Boolean));\n\n collectInstructionProgramIds(tx.instructions, programIds);\n collectInstructionLabels(tx.instructions, instructionLabels);\n\n const hasProgramEvidence = programIds.size > 0 || instructionLabels.size > 0;\n const normalizedSource = normalizeEnhancedType(tx.source);\n const hasTransferTouch = nftTransfers.length > 0;\n const rawOwnershipChange = !!primaryBuyer && primarySeller !== primaryBuyer;\n const isNoisyOwnershipChange =\n rawOwnershipChange &&\n !hasMeaningfulSettlement &&\n hasTransferTouch &&\n NOISY_OWNERSHIP_CHANGE_SOURCES.has(normalizedSource) &&\n !hasProgramEvidence;\n const hasOwnershipChange = rawOwnershipChange && !isNoisyOwnershipChange;\n\n const nftTouchKind = !hasTransferTouch\n ? \"NONE\"\n : hasOwnershipChange\n ? \"OWNERSHIP_CHANGE\"\n : primarySeller === primaryBuyer\n ? \"SAME_OWNER\"\n : \"SAME_OWNER\";\n\n const ownershipKind = !hasTransferTouch\n ? \"NONE\"\n : isNoisyOwnershipChange\n ? \"AMBIGUOUS\"\n : hasOwnershipChange\n ? \"DIRECT\"\n : primarySeller && primaryBuyer && primarySeller === primaryBuyer\n ? \"SAME_OWNER\"\n : \"AMBIGUOUS\";\n\n const settlementKind = hasMeaningfulSettlement\n ? primaryBuyer && primarySeller\n ? \"NATIVE_SALE\"\n : \"POTENTIAL_SALE\"\n : hasOwnershipChange && !hasProgramEvidence\n ? \"AMBIGUOUS\"\n : \"NONE\";\n\n return {\n mint,\n tx,\n normalizedType: normalizeEnhancedType(tx.type),\n normalizedSource,\n nftTransfers,\n nftTouchKind,\n ownershipKind,\n settlementKind,\n hasOwnershipChange,\n hasMeaningfulSettlement,\n primaryBuyer,\n primarySeller,\n custodyEndpoint: hasTransferTouch ? primaryBuyer : null,\n hasProgramEvidence,\n isNoisyOwnershipChange,\n programIds: [...programIds],\n instructionLabels: [...instructionLabels],\n };\n}\n","import type {\n AssetFlowTxClassification,\n AssetFlowDerivedType,\n AssetFlowEffect,\n AssetFlowMaterialization,\n AssetFlowInterpreterConfidence,\n AssetFlowFamily,\n} from \"../types.js\";\n\ninterface ClassificationInput {\n family: AssetFlowFamily;\n derivedType: AssetFlowDerivedType;\n matcherId: string;\n reason: string;\n observation: {\n normalizedType: string;\n hasOwnershipChange: boolean;\n };\n overrides?: Partial<\n Pick<\n AssetFlowTxClassification,\n \"normalizedType\" | \"effect\" | \"materialization\" | \"confidence\" | \"shouldExtractValueMovements\"\n >\n >;\n}\n\nexport const PERSIST_DERIVED_TYPES: Set<AssetFlowDerivedType> = new Set([\n \"SALE\",\n \"SWAP\",\n \"TRANSFER\",\n \"MINT\",\n \"LIST\",\n \"DELIST\",\n \"LOCK\",\n \"UNLOCK\",\n \"FORECLOSURE\",\n]);\n\nfunction deriveEffect(derivedType: AssetFlowDerivedType): AssetFlowEffect {\n if (derivedType === \"SALE\" || derivedType === \"SWAP\") return \"OWNERSHIP_CHANGE_AND_SETTLEMENT\";\n if (derivedType === \"TRANSFER\" || derivedType === \"MINT\" || derivedType === \"FORECLOSURE\" || derivedType === \"UNLOCK\")\n return \"OWNERSHIP_CHANGE_ONLY\";\n if (derivedType === \"LIST\" || derivedType === \"DELIST\") return \"NON_SETTLEMENT_MARKETPLACE_ACTION\";\n if (derivedType === \"LOCK\" || derivedType === \"NON_SETTLEMENT\") return \"NO_MINT_EFFECT\";\n return \"UNKNOWN\";\n}\n\nfunction deriveMaterialization(derivedType: AssetFlowDerivedType): AssetFlowMaterialization {\n if (PERSIST_DERIVED_TYPES.has(derivedType)) return \"PERSIST_FLOW\";\n if (derivedType === \"NON_SETTLEMENT\") return \"SKIP_FLOW\";\n return \"REVIEW\";\n}\n\nfunction deriveConfidence(derivedType: AssetFlowDerivedType): AssetFlowInterpreterConfidence {\n if (derivedType === \"UNKNOWN\") return \"low\";\n return \"high\";\n}\n\nfunction deriveShouldExtractValueMovements(derivedType: AssetFlowDerivedType): boolean {\n return derivedType === \"SALE\" || derivedType === \"SWAP\";\n}\n\nexport function classification(input: ClassificationInput): AssetFlowTxClassification {\n return {\n family: input.family,\n derivedType: input.derivedType,\n matcherId: input.matcherId,\n reason: input.reason,\n normalizedType: input.overrides?.normalizedType ?? input.observation.normalizedType,\n hasOwnershipChange: input.observation.hasOwnershipChange,\n effect: input.overrides?.effect ?? deriveEffect(input.derivedType),\n materialization: input.overrides?.materialization ?? deriveMaterialization(input.derivedType),\n confidence: input.overrides?.confidence ?? deriveConfidence(input.derivedType),\n shouldExtractValueMovements:\n input.overrides?.shouldExtractValueMovements ?? deriveShouldExtractValueMovements(input.derivedType),\n };\n}\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst DIRECT_TRANSFER_TYPES = new Set([\"TRANSFER\", \"NFT_TRANSFER\"]);\nconst DIRECT_TRANSFER_SOURCES = new Set([\"METAPLEX\", \"PHANTOM\", \"SOLANA_PROGRAM_LIBRARY\"]);\n\nexport const directNftTransferMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.direct-nft-transfer\",\n matches(observation) {\n return (\n DIRECT_TRANSFER_SOURCES.has(observation.normalizedSource) &&\n DIRECT_TRANSFER_TYPES.has(observation.normalizedType) &&\n observation.nftTransfers.length > 0 &&\n observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_TRANSFER\",\n derivedType: \"TRANSFER\",\n matcherId: this.id,\n reason: \"matched_direct_nft_transfer_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const explicitNftSaleMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.explicit-nft-sale\",\n matches(observation) {\n return observation.normalizedType === \"NFT_SALE\" && observation.nftTransfers.length > 0;\n },\n classify(observation) {\n return classification({\n family: \"EXPLICIT_NFT_SALE\",\n derivedType: \"SALE\",\n matcherId: this.id,\n reason: \"explicit_sale_type\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const nftMintMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.nft-mint\",\n matches(observation) {\n return (\n observation.normalizedType === \"NFT_MINT\" && observation.nftTransfers.length > 0 && observation.hasOwnershipChange\n );\n },\n classify(observation) {\n return classification({\n family: \"NFT_MINT\",\n derivedType: \"MINT\",\n matcherId: this.id,\n reason: \"matched_nft_mint_family\",\n observation,\n });\n },\n};\n","import type { AssetFlowObservation } from \"../types.js\";\n\nconst MARKETPLACE_SOURCES = new Set([\"HADESWAP\", \"HYPERSPACE\", \"MAGIC_EDEN\", \"TENSOR\"]);\nconst LISTING_TYPES = new Set([\"NFT_LISTING\", \"NFT_CANCEL_LISTING\"]);\nconst BID_SOURCES = new Set([\"MAGIC_EDEN\", \"TENSOR\", \"HYPERSPACE\"]);\nconst BID_TYPES = new Set([\"NFT_BID\", \"NFT_BID_CANCELLED\"]);\nconst TENSOR_LEGACY_MARKETPLACE_PROGRAM_ID = \"TCMPhJdwDryooaGtiocG1u3xcYbRpiJzb283XfCZsDp\";\nconst MAGIC_EDEN_MMM_PROGRAM_ID = \"mmm3XBJg5gk8XJxEKBvdgptZz6SgK4tXvn36sodowMc\";\nconst TENSOR_BID_PROGRAM_ID = \"TB1Dqt8JeKQh7RLDzfYDJsq8KS4fS2yt87avRjyRxMv\";\nconst FOXY_RAFFLE_SOURCE = \"FOXY_RAFFLE\";\nconst FOXY_RAFFLE_CREATE_TYPE = \"CREATE_RAFFLE\";\nconst FOXY_RAFFLE_UNWIND_TYPE = \"UNKNOWN\";\nconst ASSOCIATED_TOKEN_PROGRAM_ID = \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\";\nconst HADESWAP_SOURCE = \"HADESWAP\";\nconst MAGIC_EDEN_M2_PROGRAM_ID = \"M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K\";\nconst BUY_INTENT_INSTRUCTION_LABEL = \"BuyV2\";\nconst MEANINGFUL_SETTLEMENT_LAMPORTS = 10_000_000;\n\nexport interface MarketplaceListingResolution {\n derivedType: \"LIST\" | \"DELIST\" | \"NON_SETTLEMENT\";\n hasTrackedMovement: boolean;\n}\n\nexport interface MarketplaceBidResolution {\n matchedBy: \"NORMALIZED_BID_ACTION\" | \"TENSOR_BID_PROGRAM\";\n}\n\nexport interface MagicEdenBuyIntentResolution {\n matchedBy: \"MAGIC_EDEN_PROGRAM\" | \"BUY_V2_INSTRUCTION\";\n}\n\nexport interface HadeswapActivityResolution {\n activityKind: \"SALE\" | \"MAINTENANCE\" | \"POOL_MOVEMENT\" | \"POOL_WITHDRAWAL\";\n}\n\nexport interface TensorUnknownSaleResolution {\n matchedBy: \"UNKNOWN_TENSOR_SETTLED_TRANSFER\";\n}\n\nexport interface RoutedSettlementResolution {\n intermediary: string;\n buyer: string;\n counterparty: string;\n matchedBy: \"INTERMEDIARY_OUTBOUND_SETTLEMENT\" | \"INTERMEDIARY_INBOUND_SETTLEMENT\";\n}\n\nexport interface MagicEdenLuckyBuyResolution {\n intermediary: string;\n buyer: string;\n settlement: RoutedSettlementResolution;\n}\n\nfunction isPureNonSettlementObservation(observation: AssetFlowObservation): boolean {\n return (\n observation.nftTransfers.length === 0 && !observation.hasOwnershipChange && !observation.hasMeaningfulSettlement\n );\n}\n\nfunction isUnknownSaleLikeMarketplaceObservation(observation: AssetFlowObservation, source: string): boolean {\n return (\n observation.normalizedType === \"UNKNOWN\" &&\n observation.normalizedSource === source &&\n observation.hasOwnershipChange &&\n observation.hasMeaningfulSettlement\n );\n}\n\nfunction isStandardMarketplaceListing(observation: AssetFlowObservation): boolean {\n return (\n !observation.hasMeaningfulSettlement &&\n ((MARKETPLACE_SOURCES.has(observation.normalizedSource) && LISTING_TYPES.has(observation.normalizedType)) ||\n observation.programIds.includes(TENSOR_LEGACY_MARKETPLACE_PROGRAM_ID) ||\n observation.programIds.includes(MAGIC_EDEN_MMM_PROGRAM_ID))\n );\n}\n\nfunction isFoxyRaffleListing(observation: AssetFlowObservation): boolean {\n return (\n observation.normalizedSource === FOXY_RAFFLE_SOURCE &&\n observation.hasOwnershipChange &&\n (observation.normalizedType === FOXY_RAFFLE_CREATE_TYPE ||\n (observation.normalizedType === FOXY_RAFFLE_UNWIND_TYPE &&\n !observation.hasMeaningfulSettlement &&\n !observation.programIds.includes(ASSOCIATED_TOKEN_PROGRAM_ID)))\n );\n}\n\nfunction isDelistLikeMarketplaceAction(observation: AssetFlowObservation): boolean {\n return (\n observation.normalizedType === \"NFT_CANCEL_LISTING\" ||\n (observation.normalizedSource === FOXY_RAFFLE_SOURCE && observation.normalizedType === FOXY_RAFFLE_UNWIND_TYPE)\n );\n}\n\nexport function resolveMarketplaceListing(observation: AssetFlowObservation): MarketplaceListingResolution | null {\n if (!isStandardMarketplaceListing(observation) && !isFoxyRaffleListing(observation)) {\n return null;\n }\n\n const hasTrackedMovement = observation.hasOwnershipChange && observation.nftTransfers.length > 0;\n if (!hasTrackedMovement) {\n return {\n derivedType: \"NON_SETTLEMENT\",\n hasTrackedMovement: false,\n };\n }\n\n return {\n derivedType: isDelistLikeMarketplaceAction(observation) ? \"DELIST\" : \"LIST\",\n hasTrackedMovement: true,\n };\n}\n\nexport function resolveMarketplaceBid(observation: AssetFlowObservation): MarketplaceBidResolution | null {\n if (!isPureNonSettlementObservation(observation)) {\n return null;\n }\n\n if (BID_SOURCES.has(observation.normalizedSource) && BID_TYPES.has(observation.normalizedType)) {\n return { matchedBy: \"NORMALIZED_BID_ACTION\" };\n }\n\n if (observation.programIds.includes(TENSOR_BID_PROGRAM_ID)) {\n return { matchedBy: \"TENSOR_BID_PROGRAM\" };\n }\n\n return null;\n}\n\nexport function resolveMagicEdenBuyIntent(observation: AssetFlowObservation): MagicEdenBuyIntentResolution | null {\n if (!isPureNonSettlementObservation(observation)) {\n return null;\n }\n\n if (observation.programIds.includes(MAGIC_EDEN_M2_PROGRAM_ID)) {\n return { matchedBy: \"MAGIC_EDEN_PROGRAM\" };\n }\n\n if (observation.instructionLabels.includes(BUY_INTENT_INSTRUCTION_LABEL)) {\n return { matchedBy: \"BUY_V2_INSTRUCTION\" };\n }\n\n return null;\n}\n\nexport function resolveHadeswapActivity(observation: AssetFlowObservation): HadeswapActivityResolution | null {\n if (observation.normalizedSource !== HADESWAP_SOURCE) {\n return null;\n }\n\n if (observation.hasOwnershipChange && observation.hasMeaningfulSettlement) {\n return { activityKind: \"SALE\" };\n }\n\n if (\n observation.normalizedType === \"UNKNOWN\" &&\n observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement\n ) {\n const isWithdrawal = observation.instructionLabels.some(\n (label) => label.startsWith(\"Withdraw\") || label.startsWith(\"withdraw\"),\n );\n return { activityKind: isWithdrawal ? \"POOL_WITHDRAWAL\" : \"POOL_MOVEMENT\" };\n }\n\n if (isPureNonSettlementObservation(observation)) {\n return { activityKind: \"MAINTENANCE\" };\n }\n\n return null;\n}\n\nexport interface HyperspaceInstantSellResolution {\n matchedBy: \"HYPERSPACE_LISTING_WITH_SETTLEMENT\";\n}\n\nexport function resolveHyperspaceInstantSell(\n observation: AssetFlowObservation,\n): HyperspaceInstantSellResolution | null {\n if (\n observation.normalizedSource !== \"HYPERSPACE\" ||\n observation.normalizedType !== \"NFT_LISTING\" ||\n !observation.hasMeaningfulSettlement ||\n !observation.hasOwnershipChange ||\n observation.nftTransfers.length === 0\n ) {\n return null;\n }\n\n return { matchedBy: \"HYPERSPACE_LISTING_WITH_SETTLEMENT\" };\n}\n\nexport function resolveTensorUnknownSale(observation: AssetFlowObservation): TensorUnknownSaleResolution | null {\n if (!isUnknownSaleLikeMarketplaceObservation(observation, \"TENSOR\")) {\n return null;\n }\n\n return {\n matchedBy: \"UNKNOWN_TENSOR_SETTLED_TRANSFER\",\n };\n}\n\nfunction resolveRoutedSettlement(\n observation: AssetFlowObservation,\n intermediary: string,\n buyer: string,\n): RoutedSettlementResolution | null {\n for (const transfer of observation.tx.nativeTransfers ?? []) {\n const amount = typeof transfer.amount === \"number\" ? transfer.amount : Number(transfer.amount ?? NaN);\n if (!Number.isFinite(amount) || amount < MEANINGFUL_SETTLEMENT_LAMPORTS) {\n continue;\n }\n\n const from = transfer.fromUserAccount ?? null;\n const to = transfer.toUserAccount ?? null;\n\n if (from === intermediary && to && to !== buyer && to !== intermediary) {\n return {\n intermediary,\n buyer,\n counterparty: to,\n matchedBy: \"INTERMEDIARY_OUTBOUND_SETTLEMENT\",\n };\n }\n\n if (to === intermediary && from && from !== buyer && from !== intermediary) {\n return {\n intermediary,\n buyer,\n counterparty: from,\n matchedBy: \"INTERMEDIARY_INBOUND_SETTLEMENT\",\n };\n }\n }\n\n return null;\n}\n\nexport function resolveMagicEdenLuckyBuy(observation: AssetFlowObservation): MagicEdenLuckyBuyResolution | null {\n if (\n observation.normalizedSource !== \"MAGIC_EDEN\" ||\n observation.normalizedType !== \"UNKNOWN\" ||\n !observation.hasOwnershipChange ||\n observation.nftTransfers.length < 2\n ) {\n return null;\n }\n\n const first = observation.nftTransfers[0];\n const last = observation.nftTransfers[observation.nftTransfers.length - 1];\n const intermediary = first?.toUserAccount ?? null;\n const buyer = last?.toUserAccount ?? null;\n\n if (\n !first?.fromUserAccount ||\n !intermediary ||\n !last?.fromUserAccount ||\n !buyer ||\n first.fromUserAccount === intermediary ||\n last.fromUserAccount !== intermediary ||\n buyer === intermediary\n ) {\n return null;\n }\n\n const settlement = resolveRoutedSettlement(observation, intermediary, buyer);\n if (!settlement) {\n return null;\n }\n\n return {\n intermediary,\n buyer,\n settlement,\n };\n}\n","import { classification } from \"../classify.js\";\nimport { resolveMagicEdenBuyIntent } from \"../../../../semantics/marketplace.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const magicEdenBuyIntentMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.magic-eden-buy-intent\",\n matches(observation) {\n return resolveMagicEdenBuyIntent(observation) !== null;\n },\n classify(observation) {\n if (!resolveMagicEdenBuyIntent(observation)) {\n throw new Error(\n `Magic Eden buy intent matcher classified a non-matching transaction: ${observation.tx.signature}`,\n );\n }\n\n return classification({\n family: \"MAGIC_EDEN_BUY_INTENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_magic_eden_buy_intent_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { resolveMagicEdenLuckyBuy } from \"../../../../semantics/marketplace.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const magicEdenLuckyBuyMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.magic-eden-lucky-buy\",\n matches(observation) {\n return resolveMagicEdenLuckyBuy(observation) !== null;\n },\n classify(observation) {\n if (!resolveMagicEdenLuckyBuy(observation)) {\n throw new Error(\n `Magic Eden lucky buy matcher classified a non-matching transaction: ${observation.tx.signature}`,\n );\n }\n\n return classification({\n family: \"MAGIC_EDEN_LUCKY_BUY\",\n derivedType: \"SALE\",\n matcherId: this.id,\n reason: \"matched_magic_eden_lucky_buy_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { resolveMarketplaceBid } from \"../../../../semantics/marketplace.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const marketplaceBidMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.marketplace-bid\",\n matches(observation) {\n return resolveMarketplaceBid(observation) !== null;\n },\n classify(observation) {\n if (!resolveMarketplaceBid(observation)) {\n throw new Error(`Marketplace bid matcher classified a non-matching transaction: ${observation.tx.signature}`);\n }\n\n return classification({\n family: \"MARKETPLACE_BID\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_marketplace_bid_family\",\n observation,\n overrides: { effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\" },\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { resolveMarketplaceListing } from \"../../../../semantics/marketplace.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const marketplaceListingMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.marketplace-listing\",\n matches(observation) {\n return resolveMarketplaceListing(observation) !== null;\n },\n classify(observation) {\n const resolution = resolveMarketplaceListing(observation);\n if (!resolution) {\n throw new Error(`Marketplace listing matcher classified a non-matching transaction: ${observation.tx.signature}`);\n }\n\n if (resolution.hasTrackedMovement) {\n return classification({\n family: \"MARKETPLACE_LISTING\",\n derivedType: resolution.derivedType,\n matcherId: this.id,\n reason: \"matched_marketplace_listing_family\",\n observation,\n });\n }\n\n return classification({\n family: \"MARKETPLACE_LISTING\",\n derivedType: resolution.derivedType,\n matcherId: this.id,\n reason: \"matched_marketplace_listing_family\",\n observation,\n overrides: { effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\" },\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { resolveHyperspaceInstantSell } from \"../../../../semantics/marketplace.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const hyperspaceInstantSellMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.hyperspace-instant-sell\",\n matches(observation) {\n return resolveHyperspaceInstantSell(observation) !== null;\n },\n classify(observation) {\n if (!resolveHyperspaceInstantSell(observation)) {\n throw new Error(\n `Hyperspace instant sell matcher classified a non-matching transaction: ${observation.tx.signature}`,\n );\n }\n\n return classification({\n family: \"EXPLICIT_NFT_SALE\",\n derivedType: \"SALE\",\n matcherId: this.id,\n reason: \"hyperspace_listing_matched_buy_order\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { resolveTensorUnknownSale } from \"../../../../semantics/marketplace.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const tensorUnknownSaleMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.tensor-unknown-sale\",\n matches(observation) {\n return resolveTensorUnknownSale(observation) !== null;\n },\n classify(observation) {\n if (!resolveTensorUnknownSale(observation)) {\n throw new Error(`Tensor unknown sale matcher classified a non-matching transaction: ${observation.tx.signature}`);\n }\n\n return classification({\n family: \"TENSOR_UNKNOWN_SALE\",\n derivedType: \"SALE\",\n matcherId: this.id,\n reason: \"matched_tensor_unknown_sale_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst BET_PROGRAM_ID = \"25c2ojUsK7i2AMJMmXg5F34waXTq4GcCP8r6DG7oY1Mn\";\n\nexport const betProgramActivityMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.bet-program-activity\",\n matches(observation) {\n return (\n observation.programIds.includes(BET_PROGRAM_ID) &&\n observation.nftTransfers.length === 0 &&\n !observation.hasOwnershipChange\n );\n },\n classify(observation) {\n return classification({\n family: \"BET_PROGRAM_ACTIVITY\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_bet_program_activity_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const bubblegumCompressedMintMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.bubblegum-compressed-mint\",\n matches(observation) {\n return (\n observation.normalizedType === \"COMPRESSED_NFT_MINT\" &&\n observation.normalizedSource === \"BUBBLEGUM\" &&\n observation.nftTransfers.length === 0 &&\n !observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement\n );\n },\n classify(observation) {\n return classification({\n family: \"BUBBLEGUM_COMPRESSED_MINT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_bubblegum_compressed_mint_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const candyMachineRouteMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.candy-machine-route\",\n matches(observation) {\n return (\n observation.normalizedType === \"CANDY_MACHINE_ROUTE\" &&\n observation.normalizedSource === \"CANDY_MACHINE_V3\" &&\n observation.nftTransfers.length === 0 &&\n !observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_candy_machine_route_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst CLAY_CLASS_PROGRAM_ID = \"CLAYVLFC58dsDXcYTy4vD6uK4Gu6xy6UNhUHkXsBkRfu\";\nconst CLAY_STAKING_INSTRUCTION_LABELS = new Set([\"Stake\", \"Unstake\"]);\n\nfunction getStakingDirection(instructionLabels: string[]): \"LOCK\" | \"UNLOCK\" | null {\n for (const label of instructionLabels) {\n if (label === \"Stake\") return \"LOCK\";\n if (label === \"Unstake\") return \"UNLOCK\";\n }\n return null;\n}\n\nexport const clayClassProgramActivityMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.clay-class-program-activity\",\n matches(observation) {\n if (!observation.programIds.includes(CLAY_CLASS_PROGRAM_ID)) return false;\n if (observation.hasOwnershipChange || observation.hasMeaningfulSettlement) return false;\n\n const isStaking = observation.instructionLabels.some((l) => CLAY_STAKING_INSTRUCTION_LABELS.has(l));\n if (isStaking) return true;\n\n return observation.nftTransfers.length === 0;\n },\n classify(observation) {\n const direction = getStakingDirection(observation.instructionLabels);\n\n if (direction) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: direction,\n matcherId: this.id,\n reason: direction === \"LOCK\" ? \"clay_staking_lock\" : \"clay_staking_unlock\",\n observation,\n overrides: {\n normalizedType: direction === \"LOCK\" ? \"STAKE\" : \"UNSTAKE\",\n ...(direction === \"LOCK\" ? { effect: \"NO_MINT_EFFECT\" as const } : {}),\n },\n });\n }\n\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_clay_class_program_activity_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst CORRUPT_PROGRAM_ID = \"CrUptMreyezRbdHJbeZ5sMJ9idiSuMUJpdchQzY6NFjL\";\n\nexport const corruptProgramUnwindMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.corrupt-program-unwind\",\n matches(observation) {\n return (\n observation.programIds.includes(CORRUPT_PROGRAM_ID) &&\n !observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement &&\n observation.nftTransfers.length === 0\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"non_settlement_type\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { isNonFungibleTokenStandard } from \"../../utils.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const fungibleTokenTransferNoiseMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.fungible-token-transfer-noise\",\n matches(observation) {\n return (\n observation.normalizedType === \"TRANSFER\" &&\n observation.nftTransfers.length === 0 &&\n !observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement &&\n (observation.tx.tokenTransfers ?? []).length > 0 &&\n (observation.tx.tokenTransfers ?? []).every((transfer) => !isNonFungibleTokenStandard(transfer.tokenStandard))\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_fungible_token_transfer_noise_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst FOXY_CANCEL_SWAP_LABELS = new Set([\"CancelSwapV2\", \"WithdrawPnft\"]);\n\nexport const foxyCancelSwapMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.foxy-cancel-swap\",\n matches(observation) {\n if (\n observation.normalizedSource !== \"FOXY\" ||\n observation.nftTransfers.length === 0 ||\n !observation.hasOwnershipChange\n ) {\n return false;\n }\n if (observation.normalizedType === \"CANCEL_SWAP\" || observation.normalizedType === \"REJECT_SWAP\") {\n return true;\n }\n if (\n observation.normalizedType === \"UNKNOWN\" &&\n observation.instructionLabels.some((l) => FOXY_CANCEL_SWAP_LABELS.has(l))\n ) {\n return true;\n }\n return false;\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"UNLOCK\",\n matcherId: this.id,\n reason: \"foxy_cancel_swap_escrow_return\",\n observation,\n overrides: { effect: \"NO_MINT_EFFECT\" },\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const foxyInitSwapMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.foxy-init-swap\",\n matches(observation) {\n return observation.normalizedType === \"INIT_SWAP\" && observation.normalizedSource === \"FOXY\";\n },\n classify(observation) {\n const trackedMintMoves = observation.nftTransfers.length > 0 && observation.hasOwnershipChange;\n\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: trackedMintMoves ? \"LOCK\" : \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: trackedMintMoves ? \"foxy_init_swap_escrow_deposit\" : \"matched_foxy_init_swap_family\",\n observation,\n overrides: trackedMintMoves ? { effect: \"NO_MINT_EFFECT\" } : undefined,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst FOXY_RAFFLE_PROGRAM_ID = \"9ehXDD5bnhSpFVRf99veikjgq8VajtRH7e3D9aVPLqYd\";\nconst ASSOCIATED_TOKEN_PROGRAM_ID = \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\";\n\nfunction hasRefundToPrimaryBuyer(observation: Parameters<AssetFlowClassificationMatcher[\"matches\"]>[0]): boolean {\n return (observation.tx.nativeTransfers ?? []).some(\n (transfer) => transfer.toUserAccount && transfer.toUserAccount === observation.primaryBuyer,\n );\n}\n\nexport const foxyRaffleTransferMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.foxy-raffle-transfer\",\n matches(observation) {\n return (\n observation.normalizedSource === \"ASSOCIATED_TOKEN_PROGRAM\" &&\n observation.normalizedType === \"INITIALIZE_ACCOUNT\" &&\n observation.programIds.includes(FOXY_RAFFLE_PROGRAM_ID) &&\n observation.programIds.includes(ASSOCIATED_TOKEN_PROGRAM_ID) &&\n observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement &&\n observation.nftTransfers.length > 0\n );\n },\n classify(observation) {\n if (hasRefundToPrimaryBuyer(observation)) {\n return classification({\n family: \"MARKETPLACE_LISTING\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_marketplace_listing_family\",\n observation,\n overrides: { effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\" },\n });\n }\n\n return classification({\n family: \"GENERIC_TRANSFER\",\n derivedType: \"TRANSFER\",\n matcherId: this.id,\n reason: \"ownership_change_without_settlement\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const foxySwapMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.foxy-swap\",\n matches(observation) {\n return (\n observation.normalizedType === \"SWAP\" &&\n observation.normalizedSource === \"FOXY\" &&\n observation.nftTransfers.length > 0 &&\n observation.hasOwnershipChange\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_SWAP\",\n derivedType: \"SWAP\",\n matcherId: this.id,\n reason: \"matched_foxy_swap_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { resolveHadeswapActivity } from \"../../../../semantics/marketplace.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const hadeswapActivityMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.hadeswap-activity\",\n matches(observation) {\n return resolveHadeswapActivity(observation) !== null;\n },\n classify(observation) {\n const resolution = resolveHadeswapActivity(observation);\n if (!resolution) {\n throw new Error(`Hadeswap activity matcher classified a non-matching transaction: ${observation.tx.signature}`);\n }\n\n if (resolution.activityKind === \"SALE\") {\n return classification({\n family: \"GENERIC_UNKNOWN_SALE\",\n derivedType: \"SALE\",\n matcherId: this.id,\n reason: \"derived_sale_from_unknown\",\n observation,\n });\n }\n\n if (resolution.activityKind === \"POOL_WITHDRAWAL\") {\n return classification({\n family: \"MARKETPLACE_LISTING\",\n derivedType: \"DELIST\",\n matcherId: this.id,\n reason: \"hadeswap_pool_withdrawal\",\n observation,\n });\n }\n\n if (resolution.activityKind === \"POOL_MOVEMENT\") {\n return classification({\n family: \"MARKETPLACE_LISTING\",\n derivedType: \"LIST\",\n matcherId: this.id,\n reason: \"hadeswap_pool_custody_change\",\n observation,\n });\n }\n\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"non_settlement_type\",\n observation,\n });\n },\n};\n","import type { AssetFlowObservation } from \"../types.js\";\nimport { normalizeEnhancedType } from \"../chains/solana/utils.js\";\n\nconst LOAN_PROGRAM_SOURCES = new Set([\"SHARKY_FI\", \"CITRUS\", \"RAINFI\", \"CARDINAL_RENT\", \"FRAKT\"]);\nconst LOAN_LOCK_TYPES = new Set([\"TAKE_LOAN\", \"BORROW_SOL_FOR_NFT\", \"REBORROW_SOL_FOR_NFT\", \"BORROW_PERPETUAL\"]);\nconst LOAN_UNLOCK_TYPES = new Set([\"REPAY_LOAN\", \"REPAY_PERPETUAL_LOAN\", \"REPAY\", \"UNFREEZE\"]);\nconst LOAN_UNLOCK_INSTRUCTION_LABELS = new Set([\n \"DelistCollateral\", // Citrus v2 repay\n \"Repay\", // Citrus v1 repay\n \"Repay2\", // Citrus v1 repay variant\n \"CancelRequest\", // Citrus cancel (returns NFT)\n]);\nconst LOAN_ACTIVITY_TYPES = new Set([...LOAN_LOCK_TYPES, ...LOAN_UNLOCK_TYPES, \"UNKNOWN\"]);\nconst RAW_LOAN_OVERRIDE_SOURCES = new Set([\"CITRUS\", \"SHARKY_FI\", \"FRAKT\", \"CARDINAL_RENT\"]);\nconst FORECLOSURE_SOURCES = new Set([\"SHARKY_FI\", \"CARDINAL_RENT\", \"RAINFI\"]);\nconst FORECLOSURE_TYPES = new Set([\"FORECLOSE_LOAN\", \"UNKNOWN\", \"BOT_LIQUIDATE\"]);\nconst FORECLOSURE_PROGRAM_INSTRUCTIONS = new Map<string, string>([\n [\"mid36PV7Tk5j2cZjBYArGcjMS85pHm9geYN97HsSLtg\", \"LiquidateNft\"], // Midgard lending\n [\"4tdmkuY6EStxbS6Y8s5ueznL3VPMSugrvQuDeAHGZhSt\", \"ClaimPerpetualLoanV2\"], // Banx Bonds perpetual loan claim\n]);\n\nexport interface LoanProgramActivityResolution {\n lifecycleDirection: \"LOCK\" | \"UNLOCK\";\n classificationDerivedType: \"LOCK\" | \"UNLOCK\" | \"NON_SETTLEMENT\";\n hasTrackedMintTouch: boolean;\n}\n\nexport interface LoanCollateralTransferResolution {\n derivedType: \"FORECLOSURE\" | \"UNLOCK\" | \"TRANSFER\";\n}\n\nfunction hasTrackedOwnershipChangeWithoutSettlement(observation: AssetFlowObservation): boolean {\n return observation.nftTransfers.length > 0 && observation.hasOwnershipChange && !observation.hasMeaningfulSettlement;\n}\n\nexport function isLoanLockType(type: string): boolean {\n return LOAN_LOCK_TYPES.has(type);\n}\n\nexport function isLoanUnlockType(type: string): boolean {\n return LOAN_UNLOCK_TYPES.has(type);\n}\n\nexport function isLoanActivityType(type: string): boolean {\n return LOAN_ACTIVITY_TYPES.has(type);\n}\n\nexport function isLoanProgramSource(source: string): boolean {\n return LOAN_PROGRAM_SOURCES.has(source);\n}\n\nexport function shouldAugmentRawLoanLifecycle(source: string | undefined, type: string | undefined): boolean {\n return (\n RAW_LOAN_OVERRIDE_SOURCES.has(normalizeEnhancedType(source)) && isLoanActivityType(normalizeEnhancedType(type))\n );\n}\n\nfunction hasUnlockInstructionLabel(observation: AssetFlowObservation): boolean {\n return observation.instructionLabels.some((label) => LOAN_UNLOCK_INSTRUCTION_LABELS.has(label));\n}\n\nfunction inferLoanLifecycleDirection(observation: AssetFlowObservation): \"LOCK\" | \"UNLOCK\" {\n if (isLoanUnlockType(observation.normalizedType)) return \"UNLOCK\";\n if (isLoanLockType(observation.normalizedType)) return \"LOCK\";\n if (hasUnlockInstructionLabel(observation)) return \"UNLOCK\";\n return \"LOCK\";\n}\n\nexport function resolveLoanProgramActivity(observation: AssetFlowObservation): LoanProgramActivityResolution | null {\n if (\n !isLoanProgramSource(observation.normalizedSource) ||\n !isLoanActivityType(observation.normalizedType) ||\n (observation.hasOwnershipChange && observation.hasMeaningfulSettlement)\n ) {\n return null;\n }\n\n const hasTrackedMintTouch = observation.nftTransfers.length > 0;\n const lifecycleDirection = inferLoanLifecycleDirection(observation);\n\n return {\n lifecycleDirection,\n hasTrackedMintTouch,\n classificationDerivedType: hasTrackedMintTouch ? lifecycleDirection : \"NON_SETTLEMENT\",\n };\n}\n\nexport function looksLikeProtocolCustodyRelease(observation: AssetFlowObservation): boolean {\n const transfers = observation.nftTransfers;\n if (transfers.length === 0) {\n return false;\n }\n\n if (observation.normalizedSource === \"CITRUS\" && observation.normalizedType === \"CLAIM_NFT\") {\n return true;\n }\n\n if (observation.normalizedSource !== \"FRAKT\" || observation.normalizedType !== \"UNKNOWN\" || transfers.length < 2) {\n return false;\n }\n\n const first = transfers[0];\n const last = transfers[transfers.length - 1];\n\n return Boolean(\n first?.fromUserAccount &&\n first.fromUserAccount === first.toUserAccount &&\n last?.fromUserAccount &&\n last.fromUserAccount === first.fromUserAccount &&\n last.toUserAccount &&\n last.toUserAccount !== last.fromUserAccount,\n );\n}\n\nfunction hasForeclosureProgramEvidence(observation: AssetFlowObservation): boolean {\n for (const [programId, instruction] of FORECLOSURE_PROGRAM_INSTRUCTIONS) {\n if (observation.programIds.includes(programId) && observation.instructionLabels.includes(instruction)) {\n return true;\n }\n }\n return false;\n}\n\nexport function resolveLoanCollateralTransfer(\n observation: AssetFlowObservation,\n): LoanCollateralTransferResolution | null {\n const isForeclosureLike =\n FORECLOSURE_SOURCES.has(observation.normalizedSource) && FORECLOSURE_TYPES.has(observation.normalizedType);\n const isForeclosureLikeByProgram = hasForeclosureProgramEvidence(observation);\n const isCustodyReleaseLike = looksLikeProtocolCustodyRelease(observation);\n\n if (\n !hasTrackedOwnershipChangeWithoutSettlement(observation) ||\n (!isForeclosureLike && !isForeclosureLikeByProgram && !isCustodyReleaseLike)\n ) {\n return null;\n }\n\n if (\n observation.normalizedType === \"FORECLOSE_LOAN\" ||\n observation.normalizedSource === \"CITRUS\" ||\n observation.normalizedType === \"BOT_LIQUIDATE\" ||\n isForeclosureLikeByProgram\n ) {\n return { derivedType: \"FORECLOSURE\" };\n }\n\n if (isCustodyReleaseLike) {\n return { derivedType: \"UNLOCK\" };\n }\n\n return { derivedType: \"TRANSFER\" };\n}\n","import { classification } from \"../classify.js\";\nimport { resolveLoanCollateralTransfer } from \"../../../../semantics/loan.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const loanCollateralTransferMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.loan-collateral-transfer\",\n matches(observation) {\n return resolveLoanCollateralTransfer(observation) !== null;\n },\n classify(observation) {\n const resolution = resolveLoanCollateralTransfer(observation);\n if (!resolution) {\n throw new Error(`Loan collateral matcher classified a non-matching transaction: ${observation.tx.signature}`);\n }\n\n return classification({\n family: \"GENERIC_TRANSFER\",\n derivedType: resolution.derivedType,\n matcherId: this.id,\n reason: \"matched_loan_collateral_transfer_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { resolveLoanProgramActivity } from \"../../../../semantics/loan.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const loanProgramActivityMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.loan-program-activity\",\n matches(observation) {\n return resolveLoanProgramActivity(observation) !== null;\n },\n classify(observation) {\n const resolution = resolveLoanProgramActivity(observation);\n if (!resolution) {\n throw new Error(\n `Loan program activity matcher classified a non-matching transaction: ${observation.tx.signature}`,\n );\n }\n\n if (resolution.hasTrackedMintTouch) {\n return classification({\n family: \"LOAN_PROGRAM_ACTIVITY\",\n derivedType: resolution.classificationDerivedType,\n matcherId: this.id,\n reason: \"matched_loan_program_activity_family\",\n observation,\n overrides: { effect: \"NO_MINT_EFFECT\" },\n });\n }\n\n return classification({\n family: \"LOAN_PROGRAM_ACTIVITY\",\n derivedType: resolution.classificationDerivedType,\n matcherId: this.id,\n reason: \"matched_loan_program_activity_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst METADATA_PROGRAM_ID = \"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\";\nconst RESIZE_HELPER_PROGRAM_ID = \"F6fmDVCQfvnEq2KR8hhfZSEczfM9JK9fWbCsYJNbTGn7\";\n\nexport const metaplexResizeActivityMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.metaplex-resize-activity\",\n matches(observation) {\n return (\n observation.normalizedType === \"TRANSFER\" &&\n observation.normalizedSource === \"SYSTEM_PROGRAM\" &&\n observation.programIds.includes(METADATA_PROGRAM_ID) &&\n observation.programIds.includes(RESIZE_HELPER_PROGRAM_ID) &&\n observation.nftTransfers.length === 0 &&\n !observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_metaplex_resize_activity_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const migrateToPnftMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.migrate-to-pnft\",\n matches(observation) {\n return (\n observation.normalizedType === \"MIGRATE_TO_PNFT\" &&\n observation.normalizedSource === \"METAPLEX\" &&\n observation.nftTransfers.length === 0 &&\n !observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_migrate_to_pnft_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst TOKEN_METADATA_PROGRAM_ID = \"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\";\nconst UPDATE_INSTRUCTION_LABEL = \"Update\";\n\nexport const metaplexMetadataUpdateMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.metaplex-metadata-update\",\n matches(observation) {\n return (\n observation.normalizedType === \"UNKNOWN\" &&\n observation.normalizedSource === \"UNKNOWN\" &&\n !observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement &&\n observation.programIds.includes(TOKEN_METADATA_PROGRAM_ID) &&\n (observation.instructionLabels.length === 0 || observation.instructionLabels.includes(UPDATE_INSTRUCTION_LABEL))\n );\n },\n classify(observation) {\n return classification({\n family: \"METAPLEX_METADATA_UPDATE\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_metaplex_metadata_update_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst SHARKY_REPAY_TYPES = new Set([\"REPAY_LOAN\", \"UNKNOWN\"]);\n\nexport const sharkyRepayLoanSaleMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.sharky-repay-loan-sale\",\n matches(observation) {\n return (\n observation.normalizedSource === \"SHARKY_FI\" &&\n SHARKY_REPAY_TYPES.has(observation.normalizedType) &&\n observation.hasOwnershipChange &&\n observation.hasMeaningfulSettlement &&\n observation.nftTransfers.length > 0\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_TRANSFER\",\n derivedType: \"UNLOCK\",\n matcherId: this.id,\n reason: \"matched_loan_collateral_transfer_family\",\n observation,\n overrides: {\n normalizedType: \"REPAY_LOAN\",\n effect: \"OWNERSHIP_CHANGE_AND_SETTLEMENT\",\n shouldExtractValueMovements: true,\n },\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const sharkyTakeLoanTransferMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.sharky-take-loan-transfer\",\n matches(observation) {\n return (\n observation.normalizedSource === \"SHARKY_FI\" &&\n observation.normalizedType === \"TAKE_LOAN\" &&\n observation.hasOwnershipChange &&\n observation.hasMeaningfulSettlement &&\n observation.nftTransfers.length > 0\n );\n },\n classify(observation) {\n return classification({\n family: \"LOAN_PROGRAM_ACTIVITY\",\n derivedType: \"TRANSFER\",\n matcherId: this.id,\n reason: \"sharky_take_loan_with_settlement\",\n observation,\n overrides: {\n normalizedType: \"TAKE_LOAN\",\n effect: \"OWNERSHIP_CHANGE_AND_SETTLEMENT\",\n shouldExtractValueMovements: false,\n },\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst TLOCK_PROGRAM_ID = \"TLoCKic2wGJm7VhZKumih4Lc35fUhYqVMgA4j389Buk\";\nconst CLAIM_INSTRUCTION_LABEL = \"ClaimLegacyReceiveSol\";\n\nexport const tlockLegacyClaimMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.tlock-legacy-claim\",\n matches(observation) {\n return (\n observation.hasOwnershipChange &&\n (observation.programIds.includes(TLOCK_PROGRAM_ID) ||\n observation.instructionLabels.includes(CLAIM_INSTRUCTION_LABEL))\n );\n },\n classify(observation) {\n return classification({\n family: \"TLOCK_LEGACY_CLAIM\",\n derivedType: \"TRANSFER\",\n matcherId: this.id,\n reason: \"matched_lock_claim_family\",\n observation,\n });\n },\n};\n","import { classification } from \"./classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"./types.js\";\n\nconst EXPLICIT_SALE_TYPES = new Set([\"NFT_SALE\"]);\nconst EXPLICIT_SWAP_TYPES = new Set([\"SWAP\"]);\nconst NON_SETTLEMENT_TYPES = new Set([\"NFT_BID\", \"NFT_BID_CANCELLED\", \"NFT_LISTING\", \"NFT_CANCEL_LISTING\", \"NFT_MINT\"]);\n\nexport const fallbackMatchers: AssetFlowClassificationMatcher[] = [\n {\n id: \"fallback.no-nft-transfer\",\n matches(observation) {\n return observation.nftTransfers.length === 0;\n },\n classify(observation) {\n return classification({\n family: \"UNKNOWN\",\n derivedType: \"UNKNOWN\",\n matcherId: this.id,\n reason: \"no_nft_transfer\",\n observation,\n });\n },\n },\n {\n id: \"fallback.explicit-sale-type\",\n matches(observation) {\n return EXPLICIT_SALE_TYPES.has(observation.normalizedType);\n },\n classify(observation) {\n return classification({\n family: \"EXPLICIT_NFT_SALE\",\n derivedType: \"SALE\",\n matcherId: this.id,\n reason: \"explicit_sale_type\",\n observation,\n overrides: { confidence: \"medium\" },\n });\n },\n },\n {\n id: \"fallback.generic-swap\",\n matches(observation) {\n return EXPLICIT_SWAP_TYPES.has(observation.normalizedType);\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_SWAP\",\n derivedType: \"SWAP\",\n matcherId: this.id,\n reason: \"explicit_swap_type\",\n observation,\n overrides: { confidence: \"medium\" },\n });\n },\n },\n {\n id: \"fallback.non-settlement-type\",\n matches(observation) {\n return NON_SETTLEMENT_TYPES.has(observation.normalizedType);\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"non_settlement_type\",\n observation,\n overrides: {\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"REVIEW\",\n confidence: \"medium\",\n },\n });\n },\n },\n {\n id: \"fallback.no-ownership-change\",\n matches(observation) {\n return !observation.hasOwnershipChange;\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"no_ownership_change\",\n observation,\n overrides: {\n effect: \"NO_MINT_EFFECT\",\n materialization: \"REVIEW\",\n confidence: \"low\",\n },\n });\n },\n },\n {\n id: \"fallback.derived-sale-from-unknown\",\n matches(observation) {\n return observation.hasMeaningfulSettlement;\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_UNKNOWN_SALE\",\n derivedType: \"SALE\",\n matcherId: this.id,\n reason: observation.normalizedType === \"NFT_SALE\" ? \"explicit_sale_type\" : \"derived_sale_from_unknown\",\n observation,\n overrides: { confidence: \"low\" },\n });\n },\n },\n {\n id: \"fallback.generic-transfer\",\n matches() {\n return true;\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_TRANSFER\",\n derivedType: \"TRANSFER\",\n matcherId: this.id,\n reason: \"ownership_change_without_settlement\",\n observation,\n overrides: { confidence: \"low\" },\n });\n },\n },\n];\n","import type { AssetFlowClassificationMatcher, RegisteredAssetFlowClassificationMatcher } from \"./types.js\";\nimport { directNftTransferMatcher } from \"./core/direct-nft-transfer.js\";\nimport { explicitNftSaleMatcher } from \"./core/explicit-nft-sale.js\";\nimport { nftMintMatcher } from \"./core/nft-mint.js\";\nimport { magicEdenBuyIntentMatcher } from \"./marketplace/magic-eden-buy-intent.js\";\nimport { magicEdenLuckyBuyMatcher } from \"./marketplace/magic-eden-lucky-buy.js\";\nimport { marketplaceBidMatcher } from \"./marketplace/marketplace-bid.js\";\nimport { marketplaceListingMatcher } from \"./marketplace/marketplace-listing.js\";\nimport { hyperspaceInstantSellMatcher } from \"./marketplace/hyperspace-instant-sell.js\";\nimport { tensorUnknownSaleMatcher } from \"./marketplace/tensor-unknown-sale.js\";\nimport { betProgramActivityMatcher } from \"./protocol/bet-program-activity.js\";\nimport { bubblegumCompressedMintMatcher } from \"./protocol/bubblegum-compressed-mint.js\";\nimport { candyMachineRouteMatcher } from \"./protocol/candy-machine-route.js\";\nimport { clayClassProgramActivityMatcher } from \"./protocol/clay-class-program-activity.js\";\nimport { corruptProgramUnwindMatcher } from \"./protocol/corrupt-program-unwind.js\";\nimport { fungibleTokenTransferNoiseMatcher } from \"./protocol/fungible-token-transfer-noise.js\";\nimport { foxyCancelSwapMatcher } from \"./protocol/foxy-cancel-swap.js\";\nimport { foxyInitSwapMatcher } from \"./protocol/foxy-init-swap.js\";\nimport { foxyRaffleTransferMatcher } from \"./protocol/foxy-raffle-transfer.js\";\nimport { foxySwapMatcher } from \"./protocol/foxy-swap.js\";\nimport { hadeswapActivityMatcher } from \"./protocol/hadeswap-activity.js\";\nimport { loanCollateralTransferMatcher } from \"./protocol/loan-collateral-transfer.js\";\nimport { loanProgramActivityMatcher } from \"./protocol/loan-program-activity.js\";\nimport { metaplexResizeActivityMatcher } from \"./protocol/metaplex-resize-activity.js\";\nimport { migrateToPnftMatcher } from \"./protocol/migrate-to-pnft.js\";\nimport { metaplexMetadataUpdateMatcher } from \"./protocol/metaplex-metadata-update.js\";\nimport { sharkyRepayLoanSaleMatcher } from \"./protocol/sharky-repay-loan-sale.js\";\nimport { sharkyTakeLoanTransferMatcher } from \"./protocol/sharky-take-loan-transfer.js\";\nimport { tlockLegacyClaimMatcher } from \"./protocol/tlock-legacy-claim.js\";\nimport { fallbackMatchers } from \"./fallbacks.js\";\n\nfunction registerMatcher(\n matcher: AssetFlowClassificationMatcher,\n priority: number,\n): RegisteredAssetFlowClassificationMatcher {\n return {\n ...matcher,\n priority,\n };\n}\n\nfunction registerMatchers(\n entries: Array<readonly [AssetFlowClassificationMatcher, number]>,\n): RegisteredAssetFlowClassificationMatcher[] {\n return entries.map(([matcher, priority]) => registerMatcher(matcher, priority));\n}\n\n// Rule priority is explicit. Higher priority wins.\n// Rule order is still preserved for readability, but selection should no longer rely on raw array position.\n\nexport const protocolMatchers: RegisteredAssetFlowClassificationMatcher[] = registerMatchers([\n [tlockLegacyClaimMatcher, 1000],\n [bubblegumCompressedMintMatcher, 990],\n [betProgramActivityMatcher, 980],\n [candyMachineRouteMatcher, 970],\n [clayClassProgramActivityMatcher, 960],\n [corruptProgramUnwindMatcher, 950],\n [fungibleTokenTransferNoiseMatcher, 940],\n [foxyCancelSwapMatcher, 930],\n [foxyInitSwapMatcher, 920],\n [foxyRaffleTransferMatcher, 910],\n [foxySwapMatcher, 900],\n [hadeswapActivityMatcher, 890],\n [loanCollateralTransferMatcher, 880],\n [loanProgramActivityMatcher, 870],\n [migrateToPnftMatcher, 860],\n [sharkyTakeLoanTransferMatcher, 855],\n [sharkyRepayLoanSaleMatcher, 850],\n [metaplexResizeActivityMatcher, 840],\n [metaplexMetadataUpdateMatcher, 830],\n] as const);\n\nexport const coreAndMarketplaceMatchers: RegisteredAssetFlowClassificationMatcher[] = registerMatchers([\n [nftMintMatcher, 700],\n [directNftTransferMatcher, 690],\n [explicitNftSaleMatcher, 680],\n [magicEdenLuckyBuyMatcher, 670],\n [hyperspaceInstantSellMatcher, 665],\n [tensorUnknownSaleMatcher, 660],\n [marketplaceListingMatcher, 650],\n [magicEdenBuyIntentMatcher, 640],\n [marketplaceBidMatcher, 630],\n] as const);\n\nexport const assetFlowMatchers: RegisteredAssetFlowClassificationMatcher[] = [\n ...protocolMatchers,\n ...coreAndMarketplaceMatchers,\n ...registerMatchers(fallbackMatchers.map((matcher, index) => [matcher, 100 - index] as const)),\n];\n","import type { AssetFlowObservation } from \"../types.js\";\nimport type { RegisteredAssetFlowClassificationMatcher } from \"./types.js\";\n\nexport function getMatchingAssetFlowMatchers(\n matchers: RegisteredAssetFlowClassificationMatcher[],\n observation: AssetFlowObservation,\n): RegisteredAssetFlowClassificationMatcher[] {\n return matchers\n .filter((matcher) => matcher.matches(observation))\n .sort((left, right) =>\n right.priority !== left.priority ? right.priority - left.priority : left.id.localeCompare(right.id),\n );\n}\n\nexport function selectAssetFlowMatcher(\n matchers: RegisteredAssetFlowClassificationMatcher[],\n observation: AssetFlowObservation,\n): RegisteredAssetFlowClassificationMatcher {\n const matching = getMatchingAssetFlowMatchers(matchers, observation);\n const selected = matching[0];\n\n if (!selected) {\n throw new Error(`No matcher matched transaction ${observation.tx.signature} for mint ${observation.mint}`);\n }\n\n const ambiguous = matching.filter((matcher) => matcher.priority === selected.priority && matcher.id !== selected.id);\n if (ambiguous.length > 0) {\n throw new Error(\n `Ambiguous matcher selection for transaction ${observation.tx.signature} and mint ${observation.mint}: ${[selected.id, ...ambiguous.map((matcher) => matcher.id)].join(\", \")}`,\n );\n }\n\n return selected;\n}\n","import type { AssetFlowObservation, HeliusEnhancedTx } from \"./types.js\";\nimport { buildTransactionFacts } from \"./facts/build-facts.js\";\nimport type { AssetFlowTransactionFacts } from \"./facts/types.js\";\n\nexport function observationFromFacts(facts: AssetFlowTransactionFacts): AssetFlowObservation {\n return {\n mint: facts.mint,\n tx: facts.tx,\n normalizedType: facts.normalizedType,\n normalizedSource: facts.normalizedSource,\n nftTransfers: facts.nftTransfers,\n hasOwnershipChange: facts.hasOwnershipChange,\n hasMeaningfulSettlement: facts.hasMeaningfulSettlement,\n primaryBuyer: facts.primaryBuyer,\n primarySeller: facts.primarySeller,\n programIds: facts.programIds,\n instructionLabels: facts.instructionLabels,\n };\n}\n\nexport function observeEnhancedTransactionForMint(tx: HeliusEnhancedTx, mint: string): AssetFlowObservation {\n return observationFromFacts(buildTransactionFacts(tx, mint));\n}\n","import { buildTransactionFacts } from \"./facts/build-facts.js\";\nimport type { AssetFlowTransactionFacts } from \"./facts/types.js\";\nimport { assetFlowMatchers } from \"./matchers/registry.js\";\nimport { getMatchingAssetFlowMatchers, selectAssetFlowMatcher } from \"./matchers/select.js\";\nimport type { RegisteredAssetFlowClassificationMatcher } from \"./matchers/types.js\";\nimport { observationFromFacts } from \"./observation.js\";\nimport type { AssetFlowObservation, AssetFlowTxClassification, HeliusEnhancedTx } from \"./types.js\";\n\nexport interface AssetFlowMatcherExplanation {\n matcher: RegisteredAssetFlowClassificationMatcher;\n classification: AssetFlowTxClassification;\n}\n\nexport interface AssetFlowClassificationExplanation {\n facts: AssetFlowTransactionFacts;\n observation: AssetFlowObservation;\n candidates: AssetFlowMatcherExplanation[];\n selected: AssetFlowMatcherExplanation;\n classification: AssetFlowTxClassification;\n}\n\nfunction buildMatcherExplanation(\n matcher: RegisteredAssetFlowClassificationMatcher,\n observation: AssetFlowObservation,\n): AssetFlowMatcherExplanation {\n return {\n matcher,\n classification: matcher.classify(observation),\n };\n}\n\nexport function explainEnhancedTransactionForMint(\n tx: HeliusEnhancedTx,\n mint: string,\n): AssetFlowClassificationExplanation {\n const facts = buildTransactionFacts(tx, mint);\n const observation = observationFromFacts(facts);\n const matchingMatchers = getMatchingAssetFlowMatchers(assetFlowMatchers, observation);\n const selectedMatcher = selectAssetFlowMatcher(assetFlowMatchers, observation);\n const candidates = matchingMatchers.map((matcher) => buildMatcherExplanation(matcher, observation));\n const selected =\n candidates.find((candidate) => candidate.matcher.id === selectedMatcher.id) ??\n buildMatcherExplanation(selectedMatcher, observation);\n\n return {\n facts,\n observation,\n candidates,\n selected,\n classification: selected.classification,\n };\n}\n","import { explainEnhancedTransactionForMint } from \"./explain.js\";\nimport type { AssetFlowTxClassification, HeliusEnhancedTx } from \"./types.js\";\n\nexport function classifyEnhancedTransactionForMint(tx: HeliusEnhancedTx, mint: string): AssetFlowTxClassification {\n return explainEnhancedTransactionForMint(tx, mint).classification;\n}\n","import { classifyEnhancedTransactionForMint } from \"./classifier.js\";\nimport { observeEnhancedTransactionForMint } from \"./observation.js\";\nimport type { AssetFlowObservation, AssetFlowTxClassification, HeliusEnhancedTx } from \"./types.js\";\nimport { normalizeEnhancedType } from \"./utils.js\";\n\nconst DEFAULT_CLUSTER_SAMPLE_LIMIT = 5;\n\nexport interface AssetFlowCoverageReviewCandidate {\n mint: string;\n signature: string;\n timestamp: number | null;\n source: string;\n normalizedType: string;\n matcherId: string;\n family: AssetFlowTxClassification[\"family\"];\n effect: AssetFlowTxClassification[\"effect\"];\n materialization: AssetFlowTxClassification[\"materialization\"];\n confidence: AssetFlowTxClassification[\"confidence\"];\n reason: AssetFlowTxClassification[\"reason\"];\n hasOwnershipChange: boolean;\n hasMeaningfulSettlement: boolean;\n programIds: string[];\n instructionLabels: string[];\n}\n\nexport interface AssetFlowCoverageCluster {\n fingerprint: string;\n matcherId: string;\n family: AssetFlowTxClassification[\"family\"];\n effect: AssetFlowTxClassification[\"effect\"];\n materialization: AssetFlowTxClassification[\"materialization\"];\n confidence: AssetFlowTxClassification[\"confidence\"];\n normalizedType: string;\n source: string;\n reason: AssetFlowTxClassification[\"reason\"];\n hasOwnershipChange: boolean;\n hasMeaningfulSettlement: boolean;\n programIds: string[];\n instructionLabels: string[];\n count: number;\n sampleSignatures: string[];\n sampleMints: string[];\n}\n\nexport interface AssetFlowCoverageScanResult {\n mint: string;\n transactionsScanned: number;\n reviewCandidates: AssetFlowCoverageReviewCandidate[];\n clusters: AssetFlowCoverageCluster[];\n}\n\nfunction shouldReviewClassification(\n _observation: AssetFlowObservation,\n classification: AssetFlowTxClassification,\n): boolean {\n if (classification.materialization !== \"REVIEW\" && classification.confidence === \"high\") {\n return false;\n }\n\n return true;\n}\n\nfunction buildCoverageFingerprint(\n candidate: Omit<AssetFlowCoverageReviewCandidate, \"mint\" | \"signature\" | \"timestamp\">,\n): string {\n return JSON.stringify({\n matcherId: candidate.matcherId,\n family: candidate.family,\n effect: candidate.effect,\n materialization: candidate.materialization,\n normalizedType: candidate.normalizedType,\n source: candidate.source,\n reason: candidate.reason,\n hasOwnershipChange: candidate.hasOwnershipChange,\n hasMeaningfulSettlement: candidate.hasMeaningfulSettlement,\n programIds: candidate.programIds,\n instructionLabels: candidate.instructionLabels,\n });\n}\n\nexport function collectCoverageReviewCandidates(\n transactions: HeliusEnhancedTx[],\n mint: string,\n): AssetFlowCoverageReviewCandidate[] {\n const candidates: AssetFlowCoverageReviewCandidate[] = [];\n\n for (const tx of transactions) {\n const observation = observeEnhancedTransactionForMint(tx, mint);\n const classification = classifyEnhancedTransactionForMint(tx, mint);\n if (!shouldReviewClassification(observation, classification)) {\n continue;\n }\n\n candidates.push({\n mint,\n signature: tx.signature,\n timestamp: typeof tx.timestamp === \"number\" && Number.isFinite(tx.timestamp) ? tx.timestamp : null,\n source: normalizeEnhancedType(tx.source) || \"UNKNOWN\",\n normalizedType: classification.normalizedType || \"UNKNOWN\",\n matcherId: classification.matcherId,\n family: classification.family,\n effect: classification.effect,\n materialization: classification.materialization,\n confidence: classification.confidence,\n reason: classification.reason,\n hasOwnershipChange: observation.hasOwnershipChange,\n hasMeaningfulSettlement: observation.hasMeaningfulSettlement,\n programIds: observation.programIds,\n instructionLabels: observation.instructionLabels,\n });\n }\n\n return candidates;\n}\n\nexport function clusterCoverageReviewCandidates(\n candidates: AssetFlowCoverageReviewCandidate[],\n sampleLimit = DEFAULT_CLUSTER_SAMPLE_LIMIT,\n): AssetFlowCoverageCluster[] {\n const clusters = new Map<\n string,\n AssetFlowCoverageCluster & {\n seenSignatures: Set<string>;\n seenMints: Set<string>;\n }\n >();\n\n const sortedCandidates = [...candidates].sort((a, b) => {\n const aTimestamp = a.timestamp ?? 0;\n const bTimestamp = b.timestamp ?? 0;\n if (aTimestamp !== bTimestamp) return aTimestamp - bTimestamp;\n return a.signature.localeCompare(b.signature);\n });\n\n for (const candidate of sortedCandidates) {\n const { timestamp: _timestamp, ...fingerprintInput } = candidate;\n const fingerprint = buildCoverageFingerprint(fingerprintInput);\n const existing = clusters.get(fingerprint);\n\n if (!existing) {\n clusters.set(fingerprint, {\n fingerprint,\n matcherId: candidate.matcherId,\n family: candidate.family,\n effect: candidate.effect,\n materialization: candidate.materialization,\n confidence: candidate.confidence,\n normalizedType: candidate.normalizedType,\n source: candidate.source,\n reason: candidate.reason,\n hasOwnershipChange: candidate.hasOwnershipChange,\n hasMeaningfulSettlement: candidate.hasMeaningfulSettlement,\n programIds: candidate.programIds,\n instructionLabels: candidate.instructionLabels,\n count: 1,\n sampleSignatures: [candidate.signature],\n sampleMints: [candidate.mint],\n seenSignatures: new Set([candidate.signature]),\n seenMints: new Set([candidate.mint]),\n });\n continue;\n }\n\n existing.count += 1;\n if (!existing.seenSignatures.has(candidate.signature) && existing.sampleSignatures.length < sampleLimit) {\n existing.sampleSignatures.push(candidate.signature);\n existing.seenSignatures.add(candidate.signature);\n }\n if (!existing.seenMints.has(candidate.mint) && existing.sampleMints.length < sampleLimit) {\n existing.sampleMints.push(candidate.mint);\n existing.seenMints.add(candidate.mint);\n }\n }\n\n return Array.from(clusters.values())\n .map(({ seenSignatures: _seenSignatures, seenMints: _seenMints, ...cluster }) => cluster)\n .sort((a, b) => {\n if (a.count !== b.count) return b.count - a.count;\n if (a.matcherId !== b.matcherId) return a.matcherId.localeCompare(b.matcherId);\n return a.normalizedType.localeCompare(b.normalizedType);\n });\n}\n\nexport function scanTransactionsForCoverage(\n transactions: HeliusEnhancedTx[],\n mint: string,\n): AssetFlowCoverageScanResult {\n const reviewCandidates = collectCoverageReviewCandidates(transactions, mint);\n return {\n mint,\n transactionsScanned: transactions.length,\n reviewCandidates,\n clusters: clusterCoverageReviewCandidates(reviewCandidates),\n };\n}\n","import type { ExtractedValueMovement, HeliusEnhancedTx, HeliusTokenTransfer } from \"../types.js\";\n\nconst LAMPORTS_PER_SOL = 1_000_000_000;\nconst SOL_SETTLEMENT_EPSILON = 0.000001;\n\nexport interface SaleProtocolResolutionFlow {\n fromAddress: string | null;\n toAddress: string | null;\n transferIndex: number;\n tokenStandard: string | null;\n derivedType: \"SALE\" | \"LIST\";\n}\n\nexport interface SaleProtocolResolution {\n kind: \"DIRECT_FLOW\" | \"POOL_SALE\" | \"ESCROW_SALE\";\n flows: SaleProtocolResolutionFlow[];\n}\n\ninterface SaleValueMovementTaggingParams {\n tx: Pick<HeliusEnhancedTx, \"signature\" | \"slot\" | \"timestamp\" | \"type\" | \"source\" | \"description\">;\n movements: ExtractedValueMovement[];\n rentThreshold: number;\n}\n\nfunction isSameAmount(left: number, right: number): boolean {\n return Math.abs(left - right) <= SOL_SETTLEMENT_EPSILON;\n}\n\nfunction lamportsFromSol(amount: number): string | null {\n if (!Number.isFinite(amount) || amount <= 0) {\n return null;\n }\n\n return Math.round(amount * LAMPORTS_PER_SOL).toString();\n}\n\nexport function parseQuotedPriceFromDescription(\n description: string | undefined,\n): { amount: number; currency: string } | null {\n if (!description) {\n return null;\n }\n\n const match = description.match(/\\bfor\\s+([0-9]+(?:\\.[0-9]+)?)\\s+([A-Z]{2,10})\\b/i);\n if (!match) {\n return null;\n }\n\n const amount = Number(match[1]);\n const currency = match[2]?.toUpperCase();\n\n if (!Number.isFinite(amount) || amount <= 0 || !currency) {\n return null;\n }\n\n return { amount, currency };\n}\n\nexport function parseSaleParticipantsFromDescription(description: string | undefined): {\n seller: string;\n buyer: string;\n} | null {\n if (!description) {\n return null;\n }\n\n const match = description.match(/^(\\S+)\\s+sold\\b.+?\\s+to\\s+(\\S+)\\s+for\\b/i);\n if (!match) {\n return null;\n }\n\n const seller = match[1]?.trim();\n const buyer = match[2]?.trim();\n if (!seller || !buyer) {\n return null;\n }\n\n return { seller, buyer };\n}\n\nexport function parseSwapInitiatorFromDescription(description: string | undefined): string | null {\n if (!description) {\n return null;\n }\n\n const match = description.match(/^(\\S+)\\s+swapped\\b/i);\n return match?.[1]?.trim() ?? null;\n}\n\nexport function inferSaleSellerFromSettlement(\n tx: HeliusEnhancedTx,\n buyerAddress: string | null,\n escrowAddress: string | null,\n describedSellerAddress: string | null = null,\n): string | null {\n let bestRecipient: { address: string; amount: number } | null = null;\n const transfers = tx.nativeTransfers ?? [];\n\n for (const transfer of transfers) {\n const recipient = transfer.toUserAccount?.trim();\n const amount = typeof transfer.amount === \"number\" ? transfer.amount : Number(transfer.amount ?? NaN);\n\n if (!recipient || !Number.isFinite(amount) || amount <= 0) {\n continue;\n }\n\n if (buyerAddress && recipient === buyerAddress) {\n continue;\n }\n\n if (escrowAddress && recipient === escrowAddress) {\n continue;\n }\n\n if (!bestRecipient || amount > bestRecipient.amount) {\n bestRecipient = { address: recipient, amount };\n }\n }\n\n if (!bestRecipient) {\n return null;\n }\n\n // Some marketplace settlements pay an intermediary account first, which then\n // forwards the seller proceeds in the same transaction.\n const forwardedTransfers = transfers\n .filter((transfer) => transfer.fromUserAccount?.trim() === bestRecipient.address)\n .map((transfer) => ({\n address: transfer.toUserAccount?.trim() ?? null,\n amount: typeof transfer.amount === \"number\" ? transfer.amount : Number(transfer.amount ?? NaN),\n }))\n .filter(\n (transfer): transfer is { address: string; amount: number } =>\n Boolean(transfer.address) &&\n Number.isFinite(transfer.amount) &&\n transfer.amount > 0 &&\n transfer.address !== buyerAddress &&\n transfer.address !== escrowAddress,\n );\n\n const describedSellerForward = describedSellerAddress\n ? forwardedTransfers.find((transfer) => transfer.address === describedSellerAddress && transfer.amount > 0)\n : null;\n\n if (describedSellerForward) {\n return describedSellerForward.address;\n }\n\n const forwardedRecipient = forwardedTransfers.find((transfer) => transfer.amount >= bestRecipient.amount * 0.999);\n\n if (forwardedRecipient) {\n return forwardedRecipient.address;\n }\n\n return bestRecipient.address;\n}\n\nexport function annotateSaleValueMovements(params: SaleValueMovementTaggingParams): ExtractedValueMovement[] {\n const { tx, movements, rentThreshold } = params;\n const quotedPrice = parseQuotedPriceFromDescription(tx.description);\n const significantSolIndexes = movements\n .map((movement, index) => ({ movement, index }))\n .filter(\n ({ movement }) => movement.currency === \"SOL\" && movement.movementKind === \"NATIVE\" && movement.role !== \"RENT\",\n )\n .sort((left, right) => right.movement.amount - left.movement.amount);\n\n if (quotedPrice?.currency === \"SOL\") {\n const observedGross = significantSolIndexes.find(({ movement }) =>\n isSameAmount(movement.amount, quotedPrice.amount),\n );\n if (observedGross) {\n observedGross.movement.role = \"SALE_GROSS\";\n observedGross.movement.confidence = \"HIGH\";\n } else {\n movements.push({\n signature: tx.signature,\n slot: tx.slot ?? null,\n timestamp: tx.timestamp ?? 0,\n heliusType: tx.type ?? \"UNKNOWN\",\n source: tx.source ?? \"UNKNOWN\",\n movementKind: \"NATIVE\",\n currency: \"SOL\",\n amount: quotedPrice.amount,\n rawAmount: lamportsFromSol(quotedPrice.amount),\n decimals: 9,\n fromAddress: null,\n toAddress: null,\n movementIndex: -1,\n tokenStandard: null,\n role: \"SALE_GROSS\",\n confidence: \"HIGH\",\n isSynthetic: true,\n });\n }\n } else if (significantSolIndexes[0]) {\n significantSolIndexes[0].movement.role = \"SALE_GROSS\";\n significantSolIndexes[0].movement.confidence = \"MEDIUM\";\n }\n\n const remainingSignificant = movements\n .map((movement, index) => ({ movement, index }))\n .filter(\n ({ movement }) =>\n movement.currency === \"SOL\" &&\n movement.movementKind === \"NATIVE\" &&\n movement.role === \"UNKNOWN\" &&\n movement.amount >= rentThreshold,\n )\n .sort((left, right) => right.movement.amount - left.movement.amount);\n\n if (quotedPrice?.currency === \"SOL\" && remainingSignificant[0]) {\n remainingSignificant[0].movement.role = \"SELLER_PROCEEDS\";\n remainingSignificant[0].movement.confidence = \"MEDIUM\";\n remainingSignificant.shift();\n }\n\n if (remainingSignificant[0]) {\n remainingSignificant[0].movement.role = \"ROYALTY\";\n remainingSignificant[0].movement.confidence = quotedPrice?.currency === \"SOL\" ? \"MEDIUM\" : \"LOW\";\n remainingSignificant.shift();\n }\n\n for (const { movement } of remainingSignificant) {\n movement.role = \"MARKETPLACE_FEE\";\n movement.confidence = quotedPrice?.currency === \"SOL\" ? \"MEDIUM\" : \"LOW\";\n }\n\n return movements;\n}\n\ninterface ResolveSaleProtocolSemanticsParams {\n tx: HeliusEnhancedTx;\n fromAddress: string | null;\n toAddress: string | null;\n firstTransfer: HeliusTokenTransfer;\n lastTransfer: HeliusTokenTransfer;\n intermediaries?: Set<string>;\n}\n\nfunction resolveSyntheticSeller(params: {\n describedSeller: string | null;\n describedBuyer: string | null;\n settlementSeller: string | null;\n escrowAddress: string | null;\n buyerAddress: string | null;\n}): string | null {\n const { describedSeller, describedBuyer, settlementSeller, escrowAddress, buyerAddress } = params;\n\n if (describedSeller && describedSeller !== escrowAddress && describedSeller !== buyerAddress) {\n if (\n settlementSeller &&\n settlementSeller !== describedSeller &&\n settlementSeller !== escrowAddress &&\n settlementSeller !== buyerAddress\n ) {\n return settlementSeller;\n }\n return describedSeller;\n }\n\n if (describedSeller && describedSeller === escrowAddress) {\n return null;\n }\n\n if (describedBuyer && settlementSeller && settlementSeller !== escrowAddress && settlementSeller !== buyerAddress) {\n return settlementSeller;\n }\n\n return null;\n}\n\nfunction canSynthesizeEscrowEntry(params: {\n syntheticSeller: string | null;\n escrowAddress: string | null;\n buyerAddress: string | null;\n describedBuyer: string | null;\n intermediaries?: Set<string>;\n}): params is {\n syntheticSeller: string;\n escrowAddress: string;\n buyerAddress: string;\n describedBuyer: string | null;\n intermediaries?: Set<string>;\n} {\n return Boolean(\n params.syntheticSeller &&\n params.escrowAddress &&\n params.buyerAddress &&\n (!params.describedBuyer ||\n params.describedBuyer === params.buyerAddress ||\n params.intermediaries?.has(params.describedBuyer)),\n );\n}\n\nexport function resolveSaleProtocolSemantics(params: ResolveSaleProtocolSemanticsParams): SaleProtocolResolution {\n const { tx, fromAddress, toAddress, firstTransfer, lastTransfer, intermediaries } = params;\n const saleParticipants = parseSaleParticipantsFromDescription(tx.description);\n const describedSeller = saleParticipants?.seller ?? null;\n const describedBuyer = saleParticipants?.buyer ?? null;\n const listingTokenStandard = firstTransfer.tokenStandard ?? lastTransfer.tokenStandard ?? null;\n const saleTokenStandard = lastTransfer.tokenStandard ?? firstTransfer.tokenStandard ?? null;\n\n const buyerInTransfers = describedBuyer\n ? (tx.tokenTransfers ?? []).some((t) => t.fromUserAccount === describedBuyer || t.toUserAccount === describedBuyer)\n : false;\n const isPoolSale =\n describedBuyer &&\n toAddress &&\n describedBuyer !== toAddress &&\n describedBuyer !== fromAddress &&\n describedSeller === fromAddress &&\n buyerInTransfers;\n\n if (isPoolSale) {\n return {\n kind: \"POOL_SALE\",\n flows: [\n {\n fromAddress,\n toAddress: describedBuyer,\n transferIndex: 0,\n tokenStandard: saleTokenStandard,\n derivedType: \"SALE\",\n },\n ],\n };\n }\n\n const settlementSeller = inferSaleSellerFromSettlement(tx, toAddress, fromAddress, describedSeller);\n const syntheticSeller = resolveSyntheticSeller({\n describedSeller,\n describedBuyer,\n settlementSeller,\n escrowAddress: fromAddress,\n buyerAddress: toAddress,\n });\n\n if (\n canSynthesizeEscrowEntry({\n syntheticSeller,\n escrowAddress: fromAddress,\n buyerAddress: toAddress,\n describedBuyer,\n intermediaries,\n })\n ) {\n return {\n kind: \"ESCROW_SALE\",\n flows: [\n {\n fromAddress: syntheticSeller,\n toAddress: fromAddress,\n transferIndex: 0,\n tokenStandard: listingTokenStandard,\n derivedType: \"LIST\",\n },\n {\n fromAddress,\n toAddress,\n transferIndex: 1,\n tokenStandard: saleTokenStandard,\n derivedType: \"SALE\",\n },\n ],\n };\n }\n\n return {\n kind: \"DIRECT_FLOW\",\n flows: [\n {\n fromAddress,\n toAddress,\n transferIndex: 0,\n tokenStandard: saleTokenStandard,\n derivedType: \"SALE\",\n },\n ],\n };\n}\n","import { PERSIST_DERIVED_TYPES } from \"./matchers/classify.js\";\nimport {\n inferSaleSellerFromSettlement,\n parseSwapInitiatorFromDescription,\n resolveSaleProtocolSemantics,\n} from \"../../semantics/sale.js\";\nimport type { AssetFlowTxClassification, ExtractedMintFlow, HeliusEnhancedTx, HeliusTokenTransfer } from \"./types.js\";\nimport { normalizeEnhancedType } from \"./utils.js\";\n\nexport type MintFlowProtocolEventKind = \"DIRECT_FLOW\" | \"POOL_SALE\" | \"ESCROW_SALE\" | \"SWAP_REASSIGN\";\n\nexport interface MintFlowProtocolEventFlow {\n fromAddress: string | null;\n toAddress: string | null;\n transferIndex: number;\n tokenStandard: string | null;\n derivedType: ExtractedMintFlow[\"derivedType\"];\n}\n\nexport interface MintFlowProtocolEvent {\n kind: MintFlowProtocolEventKind;\n tx: HeliusEnhancedTx;\n timestamp: number;\n classification: AssetFlowTxClassification | null;\n flows: MintFlowProtocolEventFlow[];\n}\n\nfunction deriveMintFlowType(classification: AssetFlowTxClassification | null, normalizedType: string) {\n if (normalizedType === \"NFT_MINT\") {\n return \"MINT\" as const;\n }\n\n if (!classification || classification.materialization !== \"PERSIST_FLOW\") {\n return \"UNKNOWN\" as const;\n }\n\n if (PERSIST_DERIVED_TYPES.has(classification.derivedType)) {\n return classification.derivedType as ExtractedMintFlow[\"derivedType\"];\n }\n\n return \"UNKNOWN\" as const;\n}\n\nfunction getMintTransfers(tx: HeliusEnhancedTx, mint: string): HeliusTokenTransfer[] {\n return (tx.tokenTransfers ?? []).filter((transfer) => {\n if (transfer.mint !== mint) return false;\n const numericAmount =\n typeof transfer.tokenAmount === \"number\" ? transfer.tokenAmount : Number(transfer.tokenAmount ?? NaN);\n return Number.isFinite(numericAmount) && numericAmount > 0;\n });\n}\n\nfunction getTransferEndpoints(mintTransfers: HeliusTokenTransfer[]) {\n const firstTransfer = mintTransfers.find((transfer) => transfer.fromUserAccount) ?? mintTransfers[0]!;\n const lastTransfer =\n [...mintTransfers].reverse().find((transfer) => transfer.toUserAccount) ?? mintTransfers[mintTransfers.length - 1]!;\n\n let fromAddress = firstTransfer.fromUserAccount ?? null;\n let toAddress = lastTransfer.toUserAccount ?? null;\n const intermediaries = new Set<string>();\n\n if (mintTransfers.length > 1 && fromAddress && toAddress && fromAddress === toAddress) {\n const fromSet = new Set<string>();\n const toSet = new Set<string>();\n for (const t of mintTransfers) {\n if (t.fromUserAccount) fromSet.add(t.fromUserAccount);\n if (t.toUserAccount) toSet.add(t.toUserAccount);\n }\n const netFrom = [...fromSet].filter((addr) => !toSet.has(addr));\n const netTo = [...toSet].filter((addr) => !fromSet.has(addr));\n if (netFrom.length === 1 && netTo.length === 1) {\n fromAddress = netFrom[0]!;\n toAddress = netTo[0]!;\n for (const addr of fromSet) {\n if (toSet.has(addr)) intermediaries.add(addr);\n }\n }\n }\n\n return {\n firstTransfer,\n lastTransfer,\n fromAddress,\n toAddress,\n tokenStandard: lastTransfer.tokenStandard ?? firstTransfer.tokenStandard ?? null,\n intermediaries,\n };\n}\n\nexport function interpretMintFlowProtocolEvent(params: {\n tx: HeliusEnhancedTx;\n mint: string;\n getClassification: (tx: HeliusEnhancedTx) => AssetFlowTxClassification;\n}): MintFlowProtocolEvent | null {\n const { tx, mint, getClassification } = params;\n const timestamp = tx.timestamp;\n if (typeof timestamp !== \"number\" || !Number.isFinite(timestamp) || timestamp <= 0) return null;\n\n const normalizedType = normalizeEnhancedType(tx.type);\n const classification = normalizedType === \"NFT_MINT\" ? null : getClassification(tx);\n const derivedType = deriveMintFlowType(classification, normalizedType);\n if (normalizedType !== \"NFT_MINT\" && derivedType === \"UNKNOWN\") return null;\n\n const mintTransfers = getMintTransfers(tx, mint);\n if (mintTransfers.length === 0) return null;\n\n const { firstTransfer, lastTransfer, fromAddress, toAddress, tokenStandard, intermediaries } =\n getTransferEndpoints(mintTransfers);\n if (derivedType !== \"MINT\" && derivedType !== \"LOCK\" && derivedType !== \"UNLOCK\" && fromAddress === toAddress) {\n return null;\n }\n\n if (derivedType === \"SWAP\" && fromAddress && toAddress && fromAddress !== toAddress) {\n const swapInitiator = parseSwapInitiatorFromDescription(tx.description);\n if (swapInitiator && toAddress === swapInitiator && fromAddress !== swapInitiator) {\n const otherTransfer = (tx.tokenTransfers ?? []).find(\n (transfer) => transfer.mint !== mint && transfer.fromUserAccount === swapInitiator,\n );\n const swapPartner = otherTransfer?.toUserAccount ?? null;\n\n const ESCROW_TRACKED_SWAP_MATCHERS = new Set([\"solana.foxy-swap\"]);\n const isEscrowTracked = classification && ESCROW_TRACKED_SWAP_MATCHERS.has(classification.matcherId);\n if (swapPartner || !isEscrowTracked) {\n const resolvedPartner = swapPartner ?? inferSaleSellerFromSettlement(tx, swapInitiator, fromAddress);\n return {\n kind: \"SWAP_REASSIGN\",\n tx,\n timestamp,\n classification,\n flows: [\n {\n fromAddress: resolvedPartner ?? fromAddress,\n toAddress: swapInitiator,\n transferIndex: 0,\n tokenStandard,\n derivedType,\n },\n ],\n };\n }\n }\n }\n\n if (derivedType === \"SALE\") {\n const resolution = resolveSaleProtocolSemantics({\n tx,\n fromAddress,\n toAddress,\n firstTransfer,\n lastTransfer,\n intermediaries,\n });\n\n return {\n kind: resolution.kind,\n tx,\n timestamp,\n classification,\n flows: resolution.flows,\n };\n }\n\n return {\n kind: \"DIRECT_FLOW\",\n tx,\n timestamp,\n classification,\n flows: [\n {\n fromAddress,\n toAddress,\n transferIndex: 0,\n tokenStandard,\n derivedType,\n },\n ],\n };\n}\n","import type { ExtractedMintFlow, ExtractedValueMovement } from \"../types.js\";\n\nexport function buildMintFlowCanonicalKey(flow: ExtractedMintFlow): string {\n return [\n flow.signature,\n flow.transferIndex,\n flow.fromAddress ?? \"none\",\n flow.toAddress ?? \"none\",\n flow.heliusType,\n ].join(\":\");\n}\n\nexport function compareMintFlowsByCanonicalOrder(a: ExtractedMintFlow, b: ExtractedMintFlow): number {\n if (a.timestamp !== b.timestamp) return a.timestamp - b.timestamp;\n if ((a.slot ?? 0) !== (b.slot ?? 0)) return (a.slot ?? 0) - (b.slot ?? 0);\n\n if (a.signature === b.signature && a.transferIndex !== b.transferIndex) {\n return a.transferIndex - b.transferIndex;\n }\n\n if (a.toAddress && a.toAddress === b.fromAddress && b.toAddress !== a.fromAddress) return -1;\n if (b.toAddress && b.toAddress === a.fromAddress && a.toAddress !== b.fromAddress) return 1;\n\n return 0;\n}\n\nexport function canonicalizeMintFlows(flows: ExtractedMintFlow[]): ExtractedMintFlow[] {\n const deduped = new Map<string, ExtractedMintFlow>();\n\n for (const flow of flows) {\n const key = buildMintFlowCanonicalKey(flow);\n if (!deduped.has(key)) {\n deduped.set(key, flow);\n }\n }\n\n return Array.from(deduped.values())\n .map((flow, index) => ({ flow, index }))\n .sort((left, right) => compareMintFlowsByCanonicalOrder(left.flow, right.flow) || left.index - right.index)\n .map(({ flow }) => flow);\n}\n\nexport function buildValueMovementCanonicalKey(movement: ExtractedValueMovement): string {\n return [\n movement.signature,\n movement.movementKind,\n movement.currency,\n movement.rawAmount ?? \"noraw\",\n movement.amount,\n movement.fromAddress ?? \"none\",\n movement.toAddress ?? \"none\",\n movement.role,\n movement.isSynthetic ? \"synthetic\" : \"observed\",\n ].join(\":\");\n}\n\nexport function compareValueMovementsByCanonicalOrder(a: ExtractedValueMovement, b: ExtractedValueMovement): number {\n if (a.timestamp !== b.timestamp) return a.timestamp - b.timestamp;\n if ((a.slot ?? 0) !== (b.slot ?? 0)) return (a.slot ?? 0) - (b.slot ?? 0);\n return a.movementIndex - b.movementIndex;\n}\n\nexport function canonicalizeValueMovements(movements: ExtractedValueMovement[]): ExtractedValueMovement[] {\n const deduped = new Map<string, ExtractedValueMovement>();\n\n for (const movement of movements) {\n const key = buildValueMovementCanonicalKey(movement);\n if (!deduped.has(key)) {\n deduped.set(key, movement);\n }\n }\n\n return Array.from(deduped.values())\n .map((movement, index) => ({ movement, index }))\n .sort(\n (left, right) => compareValueMovementsByCanonicalOrder(left.movement, right.movement) || left.index - right.index,\n )\n .map(({ movement }) => movement);\n}\n","import type { ExtractedMintFlow } from \"../types.js\";\n\nfunction isCustodyOnlyFlow(flow: Pick<ExtractedMintFlow, \"derivedType\">): boolean {\n return (\n flow.derivedType === \"LIST\" ||\n flow.derivedType === \"DELIST\" ||\n flow.derivedType === \"LOCK\" ||\n flow.derivedType === \"UNLOCK\"\n );\n}\n\nfunction isSameAddressCustodyMarker(flow: ExtractedMintFlow): boolean {\n return isCustodyOnlyFlow(flow) && Boolean(flow.fromAddress) && flow.fromAddress === flow.toAddress;\n}\n\nfunction isSaleLocalSyntheticListing(flow: ExtractedMintFlow, nextFlow: ExtractedMintFlow | undefined): boolean {\n return (\n flow.derivedType === \"LIST\" &&\n nextFlow?.signature === flow.signature &&\n nextFlow.derivedType === \"SALE\" &&\n nextFlow.fromAddress === flow.toAddress\n );\n}\n\nfunction resolveSaleLocalSyntheticListingOrigin(params: {\n flow: ExtractedMintFlow;\n nextFlow: ExtractedMintFlow | undefined;\n currentAddress: string | null;\n lastOwnerAddress: string | null;\n}): string | null {\n const { flow, nextFlow, currentAddress, lastOwnerAddress } = params;\n if (!isSaleLocalSyntheticListing(flow, nextFlow)) {\n return null;\n }\n\n if (currentAddress && currentAddress !== flow.toAddress) {\n return currentAddress;\n }\n\n // NFT is already in escrow from a prior custody transition (LIST/LOCK).\n // Keep the SALE from=escrow — the real custody flow already explains how\n // the NFT got there. Resolving back to the beneficial owner would make the\n // prior LIST look orphaned and hide the escrow step.\n if (currentAddress) {\n return null;\n }\n\n return lastOwnerAddress ?? flow.fromAddress ?? null;\n}\n\nfunction shouldDropRedundantCustodyFlow(params: { flow: ExtractedMintFlow; currentAddress: string | null }): boolean {\n const { flow, currentAddress } = params;\n\n return (\n !isSameAddressCustodyMarker(flow) &&\n isCustodyOnlyFlow(flow) &&\n Boolean(currentAddress) &&\n Boolean(flow.toAddress) &&\n flow.toAddress === currentAddress\n );\n}\n\nexport function collapseRedundantCustodyFlows(flows: ExtractedMintFlow[]): ExtractedMintFlow[] {\n const normalizedFlows = flows.map((flow) => ({ ...flow }));\n const collapsed: ExtractedMintFlow[] = [];\n let currentAddress: string | null = null;\n let lastOwnerAddress: string | null = null;\n\n for (let index = 0; index < normalizedFlows.length; index += 1) {\n const flow = normalizedFlows[index]!;\n const nextFlow = normalizedFlows[index + 1];\n const saleLocalOrigin = resolveSaleLocalSyntheticListingOrigin({\n flow,\n nextFlow,\n currentAddress,\n lastOwnerAddress,\n });\n\n if (isSaleLocalSyntheticListing(flow, nextFlow)) {\n if (saleLocalOrigin && nextFlow) {\n nextFlow.fromAddress = saleLocalOrigin;\n }\n continue;\n }\n\n if (shouldDropRedundantCustodyFlow({ flow, currentAddress })) {\n continue;\n }\n\n collapsed.push(flow);\n currentAddress = flow.toAddress ?? currentAddress;\n if (!isCustodyOnlyFlow(flow)) {\n lastOwnerAddress = flow.toAddress ?? lastOwnerAddress;\n }\n }\n\n return collapsed;\n}\n","import type { ExtractedMintFlow, ReconstructedOwnershipPeriod } from \"../types.js\";\n\nexport function affectsBeneficialOwnership(flow: Pick<ExtractedMintFlow, \"derivedType\">): boolean {\n return (\n flow.derivedType === \"MINT\" ||\n flow.derivedType === \"TRANSFER\" ||\n flow.derivedType === \"SALE\" ||\n flow.derivedType === \"SWAP\" ||\n flow.derivedType === \"FORECLOSURE\"\n );\n}\n\nexport function selectBeneficialOwnershipFlows(flows: ExtractedMintFlow[]): ExtractedMintFlow[] {\n return flows.filter((flow) => affectsBeneficialOwnership(flow) && Boolean(flow.toAddress));\n}\n\nexport function reconstructOwnershipPeriods(flows: ExtractedMintFlow[]): ReconstructedOwnershipPeriod[] {\n const periods: ReconstructedOwnershipPeriod[] = [];\n let current: ReconstructedOwnershipPeriod | null = null;\n\n for (const flow of selectBeneficialOwnershipFlows(flows)) {\n const nextOwner = flow.toAddress!;\n\n if (!current) {\n current = {\n ownerAddress: nextOwner,\n startTimestamp: flow.timestamp,\n endTimestamp: null,\n };\n continue;\n }\n\n if (current.ownerAddress === nextOwner) continue;\n\n current.endTimestamp = flow.timestamp;\n periods.push(current);\n current = {\n ownerAddress: nextOwner,\n startTimestamp: flow.timestamp,\n endTimestamp: null,\n };\n }\n\n if (current) periods.push(current);\n return periods;\n}\n","import type { AssetFlowDerivedType, ExtractedValueMovement, HeliusEnhancedTx } from \"../types.js\";\nimport { isNonFungibleTokenStandard, normalizeEnhancedType, toNullableNumber } from \"../chains/solana/utils.js\";\n\nconst LAMPORTS_PER_SOL = 1_000_000_000;\n\ninterface ObservedValueMovementCollectionParams {\n tx: HeliusEnhancedTx;\n mint: string;\n derivedType: AssetFlowDerivedType;\n}\n\nfunction toBigIntString(value: unknown): string | null {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.trunc(value).toString();\n }\n\n if (typeof value === \"string\" && value.trim().length > 0) {\n try {\n return BigInt(value).toString();\n } catch {\n return null;\n }\n }\n\n return null;\n}\n\nfunction buildMovementBase(\n tx: HeliusEnhancedTx,\n timestamp: number,\n movementIndex: number,\n): Omit<\n ExtractedValueMovement,\n \"movementKind\" | \"currency\" | \"amount\" | \"rawAmount\" | \"decimals\" | \"fromAddress\" | \"toAddress\" | \"tokenStandard\"\n> {\n return {\n signature: tx.signature,\n slot: tx.slot ?? null,\n timestamp,\n heliusType: tx.type ?? \"UNKNOWN\",\n source: tx.source ?? \"UNKNOWN\",\n movementIndex,\n role: \"UNKNOWN\",\n confidence: \"HIGH\",\n isSynthetic: false,\n };\n}\n\nexport function collectObservedValueMovements(params: ObservedValueMovementCollectionParams): ExtractedValueMovement[] {\n const { tx, mint, derivedType } = params;\n const timestamp = tx.timestamp;\n if (typeof timestamp !== \"number\" || !Number.isFinite(timestamp) || timestamp <= 0) {\n return [];\n }\n\n const movements: ExtractedValueMovement[] = [];\n\n (tx.nativeTransfers ?? []).forEach((transfer, movementIndex) => {\n const rawAmount = toBigIntString(transfer.amount);\n if (!rawAmount) return;\n\n const amountLamports = Number(rawAmount);\n if (!Number.isFinite(amountLamports) || amountLamports <= 0) return;\n\n movements.push({\n ...buildMovementBase(tx, timestamp, movementIndex),\n movementKind: \"NATIVE\",\n currency: \"SOL\",\n amount: amountLamports / LAMPORTS_PER_SOL,\n rawAmount,\n decimals: 9,\n fromAddress: transfer.fromUserAccount ?? null,\n toAddress: transfer.toUserAccount ?? null,\n tokenStandard: null,\n });\n });\n\n (tx.tokenTransfers ?? []).forEach((transfer, movementIndex) => {\n const numericAmount =\n typeof transfer.tokenAmount === \"number\" ? transfer.tokenAmount : Number(transfer.tokenAmount ?? NaN);\n if (!Number.isFinite(numericAmount) || numericAmount <= 0) return;\n if (isNonFungibleTokenStandard(transfer.tokenStandard)) return;\n if (!transfer.mint) return;\n\n movements.push({\n ...buildMovementBase(tx, timestamp, movementIndex),\n movementKind: \"TOKEN\",\n currency: transfer.mint,\n amount: numericAmount,\n rawAmount: null,\n decimals: null,\n fromAddress: transfer.fromUserAccount ?? null,\n toAddress: transfer.toUserAccount ?? null,\n tokenStandard: transfer.tokenStandard ?? null,\n });\n });\n\n (tx.actions ?? []).forEach((action, movementIndex) => {\n const normalizedActionType = normalizeEnhancedType(action.actionType);\n const numericAmount = toNullableNumber(action.amount);\n if (!numericAmount || numericAmount <= 0) return;\n\n if (normalizedActionType === \"PAID\") {\n const rawAmount = toBigIntString(action.amount);\n if (!rawAmount) return;\n\n movements.push({\n ...buildMovementBase(tx, timestamp, movementIndex),\n movementKind: \"NATIVE\",\n currency: \"SOL\",\n amount: numericAmount / LAMPORTS_PER_SOL,\n rawAmount,\n decimals: 9,\n fromAddress: action.from ?? null,\n toAddress: action.to ?? null,\n tokenStandard: null,\n });\n return;\n }\n\n if (derivedType === \"SWAP\" && action.mint && action.mint !== mint && normalizedActionType !== \"NFT_BID\") {\n movements.push({\n ...buildMovementBase(tx, timestamp, movementIndex),\n movementKind: \"TOKEN\",\n currency: action.mint,\n amount: numericAmount,\n rawAmount: toBigIntString(action.amount),\n decimals: action.decimals ?? null,\n fromAddress: action.from ?? null,\n toAddress: action.to ?? null,\n tokenStandard: null,\n });\n }\n });\n\n return movements;\n}\n","import type { AssetFlowDerivedType, ExtractedValueMovement } from \"../types.js\";\n\ninterface GenericValueMovementTaggingParams {\n movements: ExtractedValueMovement[];\n mint: string;\n derivedType: AssetFlowDerivedType | \"NON_SETTLEMENT\";\n rentThreshold: number;\n}\n\nfunction normalizeMovementDefaults(movement: ExtractedValueMovement): ExtractedValueMovement {\n return {\n ...movement,\n role: movement.role ?? \"UNKNOWN\",\n confidence: movement.confidence ?? \"HIGH\",\n isSynthetic: movement.isSynthetic ?? false,\n };\n}\n\nfunction annotateRentValueMovements(movements: ExtractedValueMovement[], rentThreshold: number): void {\n for (const movement of movements) {\n if (movement.currency === \"SOL\" && movement.movementKind === \"NATIVE\" && movement.amount < rentThreshold) {\n movement.role = \"RENT\";\n movement.confidence = \"HIGH\";\n }\n }\n}\n\nfunction annotateSwapConsiderationValueMovements(params: {\n movements: ExtractedValueMovement[];\n mint: string;\n rentThreshold: number;\n}): void {\n const { movements, mint, rentThreshold } = params;\n\n for (const movement of movements) {\n if (movement.role !== \"UNKNOWN\" || movement.amount < rentThreshold) {\n continue;\n }\n\n if (movement.movementKind === \"TOKEN\" && movement.currency !== mint) {\n movement.role = \"SWAP_CONSIDERATION\";\n movement.confidence = \"HIGH\";\n continue;\n }\n\n if (movement.movementKind === \"NATIVE\") {\n movement.role = \"SWAP_CONSIDERATION\";\n movement.confidence = \"HIGH\";\n }\n }\n}\n\nexport function annotateGenericValueMovements(params: GenericValueMovementTaggingParams): ExtractedValueMovement[] {\n const movements = params.movements.map(normalizeMovementDefaults);\n\n annotateRentValueMovements(movements, params.rentThreshold);\n\n if (params.derivedType === \"SWAP\") {\n annotateSwapConsiderationValueMovements({\n movements,\n mint: params.mint,\n rentThreshold: params.rentThreshold,\n });\n }\n\n return movements;\n}\n","import { classifyEnhancedTransactionForMint } from \"./classifier.js\";\nimport { PERSIST_DERIVED_TYPES } from \"./matchers/classify.js\";\nimport { interpretMintFlowProtocolEvent } from \"./protocol-events.js\";\nimport { canonicalizeMintFlows, canonicalizeValueMovements } from \"../../semantics/canonicalize.js\";\nimport { collapseRedundantCustodyFlows } from \"../../semantics/custody.js\";\nimport { reconstructOwnershipPeriods as buildOwnershipPeriods } from \"../../semantics/ownership.js\";\nimport { annotateSaleValueMovements } from \"../../semantics/sale.js\";\nimport { collectObservedValueMovements } from \"../../semantics/value-movement-extraction.js\";\nimport { annotateGenericValueMovements } from \"../../semantics/value-movements.js\";\nimport type {\n AssetFlowTxClassification,\n ExtractedMintFlow,\n ExtractedValueMovement,\n HeliusEnhancedTx,\n HeliusTokenTransfer,\n NormalizedMintHistory,\n} from \"./types.js\";\nimport { isNonFungibleTokenStandard, normalizeEnhancedType } from \"./utils.js\";\n\nexport { reconstructOwnershipPeriods } from \"../../semantics/ownership.js\";\n\nconst SOL_RENT_NOISE_MAX = 0.01;\n\nfunction isNftMintCandidate(transfer: HeliusTokenTransfer): boolean {\n const numericAmount =\n typeof transfer.tokenAmount === \"number\" ? transfer.tokenAmount : Number(transfer.tokenAmount ?? NaN);\n return (\n Boolean(transfer.mint) &&\n Number.isFinite(numericAmount) &&\n numericAmount > 0 &&\n isNonFungibleTokenStandard(transfer.tokenStandard)\n );\n}\n\nfunction annotateValueMovementsForTx(params: {\n tx: HeliusEnhancedTx;\n mint: string;\n movements: ExtractedValueMovement[];\n derivedType: NormalizedMintHistory[\"flows\"][number][\"derivedType\"] | \"NON_SETTLEMENT\";\n}): ExtractedValueMovement[] {\n const { tx, mint, derivedType } = params;\n const movements = annotateGenericValueMovements({\n movements: params.movements,\n mint,\n derivedType,\n rentThreshold: SOL_RENT_NOISE_MAX,\n });\n\n if (derivedType !== \"SALE\") {\n return movements;\n }\n\n return annotateSaleValueMovements({\n tx,\n movements,\n rentThreshold: SOL_RENT_NOISE_MAX,\n });\n}\n\nfunction classifyWithCache(\n tx: HeliusEnhancedTx,\n mint: string,\n cache: Map<string, AssetFlowTxClassification>,\n): AssetFlowTxClassification {\n const cached = cache.get(tx.signature);\n if (cached) return cached;\n const result = classifyEnhancedTransactionForMint(tx, mint);\n cache.set(tx.signature, result);\n return result;\n}\n\nexport function extractCandidateMintsFromEnhancedTx(tx: HeliusEnhancedTx): string[] {\n const mints = new Set<string>();\n\n for (const transfer of tx.tokenTransfers ?? []) {\n if (isNftMintCandidate(transfer) && transfer.mint) {\n mints.add(transfer.mint);\n }\n }\n\n for (const action of tx.actions ?? []) {\n const normalizedActionType = normalizeEnhancedType(action.actionType);\n if (\n action.mint &&\n [\"NFT_SALE\", \"NFT_TRANSFER\", \"NFT_MINT\", \"NFT_LISTING\", \"NFT_CANCEL_LISTING\", \"TRANSFER\"].includes(\n normalizedActionType,\n )\n ) {\n mints.add(action.mint);\n }\n }\n\n return [...mints];\n}\n\nfunction buildFlow(\n tx: HeliusEnhancedTx,\n timestamp: number,\n params: {\n fromAddress: string | null;\n toAddress: string | null;\n transferIndex: number;\n tokenStandard: string | null;\n derivedType: ExtractedMintFlow[\"derivedType\"];\n },\n): ExtractedMintFlow {\n return {\n signature: tx.signature,\n slot: tx.slot ?? null,\n timestamp,\n heliusType: tx.type ?? \"UNKNOWN\",\n source: tx.source ?? \"UNKNOWN\",\n fromAddress: params.fromAddress,\n toAddress: params.toAddress,\n transferIndex: params.transferIndex,\n tokenStandard: params.tokenStandard,\n derivedType: params.derivedType,\n };\n}\n\nexport function extractMintFlows(\n transactions: HeliusEnhancedTx[],\n mint: string,\n classificationCache: Map<string, AssetFlowTxClassification> = new Map(),\n): ExtractedMintFlow[] {\n const rawFlows: ExtractedMintFlow[] = [];\n\n for (const tx of transactions) {\n const event = interpretMintFlowProtocolEvent({\n tx,\n mint,\n getClassification: (targetTx) => classifyWithCache(targetTx, mint, classificationCache),\n });\n if (!event) continue;\n\n rawFlows.push(\n ...event.flows.map((flow) =>\n buildFlow(event.tx, event.timestamp, {\n fromAddress: flow.fromAddress,\n toAddress: flow.toAddress,\n transferIndex: flow.transferIndex,\n tokenStandard: flow.tokenStandard,\n derivedType: flow.derivedType,\n }),\n ),\n );\n }\n\n return canonicalizeMintFlows(rawFlows);\n}\n\nexport function extractValueMovements(\n transactions: HeliusEnhancedTx[],\n mint: string,\n classificationCache: Map<string, AssetFlowTxClassification> = new Map(),\n): ExtractedValueMovement[] {\n const rawMovements: ExtractedValueMovement[] = [];\n\n for (const tx of transactions) {\n const timestamp = tx.timestamp;\n if (typeof timestamp !== \"number\" || !Number.isFinite(timestamp) || timestamp <= 0) continue;\n const classification = classifyWithCache(tx, mint, classificationCache);\n if (classification.materialization !== \"PERSIST_FLOW\") continue;\n if (!classification.shouldExtractValueMovements) continue;\n const txMovements = collectObservedValueMovements({\n tx,\n mint,\n derivedType: classification.derivedType,\n });\n\n rawMovements.push(\n ...annotateValueMovementsForTx({\n tx,\n mint,\n movements: txMovements,\n derivedType: classification.derivedType,\n }),\n );\n }\n\n return canonicalizeValueMovements(rawMovements);\n}\n\nexport function normalizeMintHistory(transactions: HeliusEnhancedTx[], mint: string): NormalizedMintHistory {\n const classificationCache = new Map<string, AssetFlowTxClassification>();\n const flows = collapseRedundantCustodyFlows(extractMintFlows(transactions, mint, classificationCache));\n const valueMovements = extractValueMovements(transactions, mint, classificationCache);\n const periods = buildOwnershipPeriods(flows);\n\n return {\n flows,\n valueMovements,\n periods,\n };\n}\n","import type {\n HeliusEnhancedAction,\n HeliusEnhancedTx,\n RawAssetFlowAccountKey,\n RawAssetFlowTokenBalance,\n RawAssetFlowTransaction,\n} from \"./types.js\";\nimport { getMintNftTransfers, hasMeaningfulNativeSettlement, normalizeEnhancedType } from \"./utils.js\";\n\nconst MEANINGFUL_SETTLEMENT_LAMPORTS = 10_000_000;\nconst INSTRUCTION_LOG_PREFIX = \"Program log: Instruction: \";\nconst CLAY_STAKING_PROGRAM_ID = \"CLAYVLFC58dsDXcYTy4vD6uK4Gu6xy6UNhUHkXsBkRfu\";\nconst CLAY_STAKING_INSTRUCTION_LABELS = new Set([\"Stake\", \"Unstake\"]);\nconst RAW_OWNERSHIP_OVERRIDE_SOURCES = new Set([\"CITRUS\", \"SHARKY_FI\", \"FRAKT\", \"CARDINAL_RENT\", \"SQUADS_MPL\"]);\nconst RAW_OWNERSHIP_OVERRIDE_PROGRAMS = new Set([\n \"A66HabVL3DzNzeJgcHYtRRNW1ZRMKwBfrdSR4kLsZ9DJ\", // RainFi liquidation raffles\n \"RainEraPU5yDoJmTrHdYynK9739GkEfDsE4ffqce2BR\", // RainFi lending (Helius reports as SYSTEM_PROGRAM)\n \"mid36PV7Tk5j2cZjBYArGcjMS85pHm9geYN97HsSLtg\", // Midgard lending (LiquidateNft)\n \"SNPRohhBurQwrpwAptw1QYtpFdfEKitr4WSJ125cN1g\", // Sniper Market (Helius reports as UNKNOWN)\n \"hgednk3XtQcyz8wFSEAN8fzLqupQB4AVor1NGbGwfwf\", // Yawww marketplace (Helius reports as UNKNOWN)\n \"5pBn2Sxa41SUuTxKR8s91kMn9LHptd7Q9AA7nP6mqa4W\", // Unknown transfer proxy (Helius reports as UNKNOWN)\n \"8NvmvWEAw89HnE8Gjo4kHhbHy2PGyeuU9y9QJ1HKiLoR\", // Squads v3 multisig (Helius reports as UNKNOWN)\n \"Rewv3coebx3zMsZNt1ogsaQhJoCix1dTYMnzvDJeZTi\", // P2P escrow (AdminCallback — Helius reports self-transfers)\n \"LendY9EXmeiJLHipx1giNrpRVpqo68oWvzTjVYrKxQe\", // Lending protocol (delegate sales report intermediary as from)\n \"M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K\", // Magic Eden v2 (old Sell+SetAuthority has no token transfers)\n \"CrUptMreyezRbdHJbeZ5sMJ9idiSuMUJpdchQzY6NFjL\", // Corrupt program (Unwind — Helius reports intermediary as from)\n \"hgopH9G1FRn37oqjJJ83o9RDpUCcQXL9ZDcAZ5Pg7xB\", // Early marketplace (NativeSale — Helius reports escrow as from)\n \"mrkTzoWMVEBJ3AUrgd2eXNLXrnBuhhQRQyxahtaeTie\", // Marketplace (FillSellOrder — Helius reports intermediary as from)\n \"8guzmt92HbM7yQ69UJg564hRRX6N4nCdxWE5L6ENrA8P\", // Foxy swap (SWAP reports counterparty as from instead of escrow)\n CLAY_STAKING_PROGRAM_ID, // Claynosaurz staking (Stake/Unstake — Helius reports no token transfers)\n]);\nconst RAW_REQUIRED_SOURCES = new Set([\"CITRUS\", \"RAINFI\", \"SHARKY_FI\", \"FRAKT\", \"CARDINAL_RENT\", \"SQUADS_MPL\", \"FOXY\"]);\nconst RAW_SENSITIVE_TYPES = new Set([\"UNKNOWN\", \"TRANSFER\", \"SWAP\", \"NFT_TRANSFER\"]);\n\ninterface RawMintOwnerChange {\n mint: string;\n fromOwner: string;\n toOwner: string;\n}\n\ninterface RawStableMintOwner {\n mint: string;\n owner: string;\n}\n\nfunction normalizeAccountKeys(accountKeys: RawAssetFlowAccountKey[] | undefined): string[] {\n return (accountKeys ?? []).map((key) => (typeof key === \"string\" ? key : key.pubkey));\n}\n\nfunction extractSignature(tx: RawAssetFlowTransaction): string | null {\n if (tx.signature) {\n return tx.signature;\n }\n\n if (tx.transaction?.signatures?.length) {\n return tx.transaction.signatures[0] ?? null;\n }\n\n return null;\n}\n\nfunction getPositiveOwners(balances: RawAssetFlowTokenBalance[] | undefined, mint: string): Set<string> {\n const owners = new Set<string>();\n\n for (const balance of balances ?? []) {\n if (balance.mint !== mint) continue;\n const amount = Number(balance.uiTokenAmount?.amount ?? NaN);\n if (!Number.isFinite(amount) || amount <= 0) continue;\n if (balance.owner) {\n owners.add(balance.owner);\n }\n }\n\n return owners;\n}\n\nfunction getOwnerBalanceMap(balances: RawAssetFlowTokenBalance[] | undefined, mint: string): Map<string, number> {\n const owners = new Map<string, number>();\n\n for (const balance of balances ?? []) {\n if (balance.mint !== mint || !balance.owner) continue;\n const amount = Number(balance.uiTokenAmount?.amount ?? NaN);\n if (!Number.isFinite(amount) || amount < 0) continue;\n owners.set(balance.owner, amount);\n }\n\n return owners;\n}\n\nfunction getCandidateMints(tx: RawAssetFlowTransaction): string[] {\n const mints = new Set<string>();\n\n for (const balance of tx.meta?.preTokenBalances ?? []) {\n if (balance.mint) mints.add(balance.mint);\n }\n\n for (const balance of tx.meta?.postTokenBalances ?? []) {\n if (balance.mint) mints.add(balance.mint);\n }\n\n return [...mints];\n}\n\nexport function extractCandidateMintsFromRawTransaction(tx: RawAssetFlowTransaction): string[] {\n return getCandidateMints(tx);\n}\n\nfunction getBalanceDelta(\n account: string,\n accountKeys: string[],\n preBalances: number[],\n postBalances: number[],\n): number | null {\n const accountIndex = accountKeys.findIndex((key) => key === account);\n if (accountIndex === -1) return null;\n const pre = preBalances[accountIndex];\n const post = postBalances[accountIndex];\n if (typeof pre !== \"number\" || typeof post !== \"number\") return null;\n return post - pre;\n}\n\nfunction extractProgramIds(tx: RawAssetFlowTransaction): string[] {\n const ids = new Set<string>();\n\n for (const instruction of tx.transaction?.message?.instructions ?? []) {\n if (instruction.programId) {\n ids.add(instruction.programId);\n }\n }\n\n return [...ids];\n}\n\nfunction extractInstructionLabels(tx: RawAssetFlowTransaction): string[] {\n const labels = new Set<string>();\n\n for (const message of tx.meta?.logMessages ?? []) {\n const markerIndex = message.indexOf(INSTRUCTION_LOG_PREFIX);\n if (markerIndex === -1) continue;\n const label = message.slice(markerIndex + INSTRUCTION_LOG_PREFIX.length).trim();\n if (label) {\n labels.add(label);\n }\n }\n\n return [...labels];\n}\n\nfunction extractMintOwnerChanges(tx: RawAssetFlowTransaction): RawMintOwnerChange[] {\n const ownerChanges: RawMintOwnerChange[] = [];\n\n for (const mint of getCandidateMints(tx)) {\n const preOwners = getOwnerBalanceMap(tx.meta?.preTokenBalances, mint);\n const postOwners = getOwnerBalanceMap(tx.meta?.postTokenBalances, mint);\n if (preOwners.size === 0 && postOwners.size === 0) {\n continue;\n }\n\n const fromOwners = [...preOwners.entries()]\n .filter(([owner, preAmount]) => preAmount > 0 && (postOwners.get(owner) ?? 0) <= 0)\n .map(([owner]) => owner);\n const toOwners = [...postOwners.entries()]\n .filter(([owner, postAmount]) => postAmount > 0 && (preOwners.get(owner) ?? 0) <= 0)\n .map(([owner]) => owner);\n\n if (fromOwners.length !== 1 || toOwners.length !== 1) {\n continue;\n }\n\n const fromOwner = fromOwners[0];\n const toOwner = toOwners[0];\n if (!fromOwner || !toOwner || fromOwner === toOwner) {\n continue;\n }\n\n ownerChanges.push({ mint, fromOwner, toOwner });\n }\n\n return ownerChanges;\n}\n\nfunction extractStableMintOwners(tx: RawAssetFlowTransaction): RawStableMintOwner[] {\n const stableOwners: RawStableMintOwner[] = [];\n\n for (const mint of getCandidateMints(tx)) {\n const preOwners = getPositiveOwners(tx.meta?.preTokenBalances, mint);\n const postOwners = getPositiveOwners(tx.meta?.postTokenBalances, mint);\n if (preOwners.size !== 1 || postOwners.size !== 1) {\n continue;\n }\n\n const preOwner = [...preOwners][0];\n const postOwner = [...postOwners][0];\n if (!preOwner || !postOwner || preOwner !== postOwner) {\n continue;\n }\n\n stableOwners.push({ mint, owner: preOwner });\n }\n\n return stableOwners;\n}\n\nfunction buildPaidAction(buyer: string, seller: string, amount: number): HeliusEnhancedAction | null {\n if (!Number.isFinite(amount) || amount < MEANINGFUL_SETTLEMENT_LAMPORTS) {\n return null;\n }\n\n return {\n actionType: \"PAID\",\n from: buyer,\n to: seller,\n amount,\n };\n}\n\nexport function synthesizeEnhancedTransactionsFromRaw(tx: RawAssetFlowTransaction): HeliusEnhancedTx[] {\n const signature = extractSignature(tx);\n if (!signature) {\n return [];\n }\n\n const accountKeys = normalizeAccountKeys(tx.transaction?.message?.accountKeys);\n const preBalances = tx.meta?.preBalances ?? [];\n const postBalances = tx.meta?.postBalances ?? [];\n const timestamp = tx.blockTime;\n if (typeof timestamp !== \"number\" || !Number.isFinite(timestamp) || timestamp <= 0) {\n return [];\n }\n\n const synthetic: HeliusEnhancedTx[] = [];\n const programIds = extractProgramIds(tx);\n const instructionLabels = extractInstructionLabels(tx);\n\n for (const mint of getCandidateMints(tx)) {\n const preOwners = getPositiveOwners(tx.meta?.preTokenBalances, mint);\n const postOwners = getPositiveOwners(tx.meta?.postTokenBalances, mint);\n if (!preOwners.size && !postOwners.size) continue;\n\n const fromOwners = [...preOwners].filter((owner) => !postOwners.has(owner));\n const toOwners = [...postOwners].filter((owner) => !preOwners.has(owner));\n\n if (fromOwners.length !== 1 || toOwners.length !== 1) {\n continue;\n }\n\n const seller = fromOwners[0];\n const buyer = toOwners[0];\n if (!seller || !buyer || seller === buyer) {\n continue;\n }\n\n const sellerGain = getBalanceDelta(seller, accountKeys, preBalances, postBalances);\n const buyerDelta = getBalanceDelta(buyer, accountKeys, preBalances, postBalances);\n const buyerSpend = typeof buyerDelta === \"number\" && buyerDelta < 0 ? Math.abs(buyerDelta) : null;\n const candidateAmounts = [sellerGain, buyerSpend].filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value) && value > 0,\n );\n const settlementAmount = candidateAmounts.length > 0 ? Math.min(...candidateAmounts) : null;\n const paidAction = settlementAmount ? buildPaidAction(buyer, seller, settlementAmount) : null;\n\n synthetic.push({\n signature,\n slot: tx.slot,\n timestamp,\n type: paidAction ? \"UNKNOWN\" : \"NFT_TRANSFER\",\n source: \"RAW_WEBHOOK\",\n programIds,\n instructionLabels,\n tokenTransfers: [\n {\n mint,\n fromUserAccount: seller,\n toUserAccount: buyer,\n tokenAmount: 1,\n tokenStandard: \"NonFungible\",\n },\n ],\n actions: paidAction ? [paidAction] : [],\n nativeTransfers: [],\n transactionError: null,\n });\n }\n\n const hasClayvStaking =\n programIds.includes(CLAY_STAKING_PROGRAM_ID) &&\n instructionLabels.some((label) => CLAY_STAKING_INSTRUCTION_LABELS.has(label));\n\n if (hasClayvStaking) {\n for (const stableOwner of extractStableMintOwners(tx)) {\n const alreadySynthesized = synthetic.some((s) => s.tokenTransfers?.some((t) => t.mint === stableOwner.mint));\n if (alreadySynthesized) continue;\n\n synthetic.push({\n signature,\n slot: tx.slot,\n timestamp,\n type: \"UNKNOWN\",\n source: \"RAW_WEBHOOK\",\n programIds,\n instructionLabels,\n tokenTransfers: [\n {\n mint: stableOwner.mint,\n fromUserAccount: stableOwner.owner,\n toUserAccount: stableOwner.owner,\n tokenAmount: 1,\n tokenStandard: \"ProgrammableNonFungible\",\n },\n ],\n actions: [],\n nativeTransfers: [],\n transactionError: null,\n });\n }\n }\n\n return synthetic;\n}\n\nexport function mergeRawProgramEvidence(tx: HeliusEnhancedTx, rawTx: RawAssetFlowTransaction): HeliusEnhancedTx {\n const rawProgramIds = extractProgramIds(rawTx);\n const rawInstructionLabels = extractInstructionLabels(rawTx);\n if (rawProgramIds.length === 0 && rawInstructionLabels.length === 0) {\n return tx;\n }\n\n return {\n ...tx,\n programIds: [...new Set([...(tx.programIds ?? []), ...rawProgramIds])],\n instructionLabels: [...new Set([...(tx.instructionLabels ?? []), ...rawInstructionLabels])],\n };\n}\n\nexport function shouldApplyRawOwnerOverrides(tx: HeliusEnhancedTx, rawTx: RawAssetFlowTransaction): boolean {\n if (RAW_OWNERSHIP_OVERRIDE_SOURCES.has(tx.source ?? \"\")) {\n return true;\n }\n\n const rawInstructions = rawTx.transaction?.message?.instructions ?? [];\n if (rawInstructions.some((ix) => ix.programId && RAW_OWNERSHIP_OVERRIDE_PROGRAMS.has(ix.programId))) {\n return true;\n }\n\n return hasPhantomSenderInEnhanced(tx, rawTx);\n}\n\nfunction hasPhantomSenderInEnhanced(tx: HeliusEnhancedTx, rawTx: RawAssetFlowTransaction): boolean {\n for (const transfer of tx.tokenTransfers ?? []) {\n if (!transfer.mint || !transfer.fromUserAccount) continue;\n const preOwners = getPositiveOwners(rawTx.meta?.preTokenBalances, transfer.mint);\n if (preOwners.size > 0 && !preOwners.has(transfer.fromUserAccount)) {\n return true;\n }\n }\n return false;\n}\n\nexport function augmentEnhancedTransactionWithRaw(\n tx: HeliusEnhancedTx,\n rawTx: RawAssetFlowTransaction,\n): HeliusEnhancedTx {\n if (shouldApplyRawOwnerOverrides(tx, rawTx)) {\n return applyRawOwnerOverridesToEnhanced(tx, rawTx);\n }\n\n return mergeRawProgramEvidence(tx, rawTx);\n}\n\nexport function applyRawOwnerOverridesToEnhanced(\n tx: HeliusEnhancedTx,\n rawTx: RawAssetFlowTransaction,\n): HeliusEnhancedTx {\n const mergedProgramIds = [...new Set([...(tx.programIds ?? []), ...extractProgramIds(rawTx)])];\n const mergedInstructionLabels = [...new Set([...(tx.instructionLabels ?? []), ...extractInstructionLabels(rawTx)])];\n const ownerChangeByMint = new Map(extractMintOwnerChanges(rawTx).map((change) => [change.mint, change]));\n\n const existingTransfers = tx.tokenTransfers ?? [];\n const tokenTransfers = existingTransfers.map((transfer) => {\n if (!transfer.mint) {\n return transfer;\n }\n\n const ownerChange = ownerChangeByMint.get(transfer.mint);\n if (!ownerChange) {\n return transfer;\n }\n\n return {\n ...transfer,\n fromUserAccount: ownerChange.fromOwner,\n toUserAccount: ownerChange.toOwner,\n };\n });\n\n // Synthesize token transfers from raw balances when enhanced data is empty\n if (existingTransfers.length === 0 && ownerChangeByMint.size > 0) {\n for (const change of ownerChangeByMint.values()) {\n tokenTransfers.push({\n mint: change.mint,\n fromUserAccount: change.fromOwner,\n toUserAccount: change.toOwner,\n tokenAmount: 1,\n tokenStandard: \"NonFungible\",\n });\n }\n }\n\n for (const stableOwner of extractStableMintOwners(rawTx)) {\n let i = tokenTransfers.length;\n while (i--) {\n if (tokenTransfers[i]?.mint === stableOwner.mint) {\n tokenTransfers.splice(i, 1);\n }\n }\n\n tokenTransfers.push({\n mint: stableOwner.mint,\n fromUserAccount: stableOwner.owner,\n toUserAccount: stableOwner.owner,\n tokenAmount: 1,\n tokenStandard: \"ProgrammableNonFungible\",\n });\n }\n\n return {\n ...tx,\n programIds: mergedProgramIds,\n instructionLabels: mergedInstructionLabels,\n tokenTransfers,\n };\n}\n\nconst LISTING_TYPES_NEEDING_RAW = new Set([\"NFT_LISTING\", \"NFT_CANCEL_LISTING\"]);\n\nexport function shouldFetchRawForMintTx(tx: HeliusEnhancedTx, mint: string): boolean {\n const nftTransfers = getMintNftTransfers(tx, mint);\n if (nftTransfers.length === 0) {\n const normalizedType = normalizeEnhancedType(tx.type);\n if (LISTING_TYPES_NEEDING_RAW.has(normalizedType)) return true;\n const hasClayStakingProgram =\n tx.programIds?.includes(CLAY_STAKING_PROGRAM_ID) ||\n tx.instructions?.some((ix) => ix.programId === CLAY_STAKING_PROGRAM_ID);\n return Boolean(hasClayStakingProgram);\n }\n\n const source = normalizeEnhancedType(tx.source);\n if (RAW_REQUIRED_SOURCES.has(source)) {\n return true;\n }\n\n if (\n nftTransfers.some(\n (transfer) =>\n !transfer.fromUserAccount || !transfer.toUserAccount || transfer.fromUserAccount === transfer.toUserAccount,\n )\n ) {\n return true;\n }\n\n if (nftTransfers.length > 1) {\n return true;\n }\n\n const normalizedType = normalizeEnhancedType(tx.type);\n if (normalizedType === \"UNKNOWN\") {\n return true;\n }\n\n if (RAW_SENSITIVE_TYPES.has(normalizedType) && !hasMeaningfulNativeSettlement(tx, mint)) {\n return true;\n }\n\n return false;\n}\n","export * from \"./types.js\";\nexport * from \"./helpers.js\";\nexport * from \"./classifier.js\";\nexport * from \"./normalize.js\";\n\nexport { classifySuiTransactionForAsset as classify } from \"./classifier.js\";\nexport { extractAssetFlows as buildFlows } from \"./normalize.js\";\nexport { normalizeAssetHistory as buildAssetHistory } from \"./normalize.js\";\nexport { reconstructOwnershipPeriods as buildOwnershipPeriods } from \"./normalize.js\";\n","import type {\n SuiAssetOwnerChange,\n SuiBalanceChangeLike,\n SuiEventLike,\n SuiObjectChangeLike,\n SuiObjectOwnerLike,\n SuiTransactionBlockLike,\n} from \"./types.js\";\n\nexport const SUI_COIN_TYPE = \"0x2::sui::SUI\";\n\nexport const POPKINS_MINTED_EVENT_SUFFIX = \"::popkins_nft::PopkinsMinted\";\nexport const POPKINS_STAKED_EVENT_SUFFIX = \"::events::PopkinsStakedEvent\";\nexport const POPKINS_UNSTAKED_EVENT_SUFFIX = \"::events::PopkinsUnstakedEvent\";\nexport const TRADEPORT_BUY_SIMPLE_EVENT_SUFFIX = \"::tradeport_listings::BuySimpleListingEvent\";\nexport const TRADEPORT_MATCH_SINGLE_BID_EVENT_SUFFIX = \"::tradeport_biddings::MatchSingleBidEvent\";\nexport const TRADEPORT_KIOSK_BUY_EVENT_SUFFIX = \"::kiosk_listings::BuyEvent\";\nexport const TRADEPORT_ADD_LISTING_EVENT_SUFFIX = \"::tradeport_orderbook::AddListingEvent\";\nexport const TRADEPORT_RELIST_SIMPLE_EVENT_SUFFIX = \"::tradeport_listings::RelistSimpleListingEvent\";\nexport const TRADEPORT_REMOVE_LISTING_EVENT_SUFFIX = \"::tradeport_orderbook::RemoveListingEvent\";\nexport const TRADEPORT_CANCEL_SIMPLE_EVENT_SUFFIX = \"::tradeport_listings::CancelSimpleListingEvent\";\nexport const TRADEPORT_CREATE_SINGLE_BID_EVENT_SUFFIX = \"::tradeport_biddings::CreateSingleBidEvent\";\nexport const KIOSK_LIST_EVENT_SUFFIX = \"::kiosk_listings::ListEvent\";\nexport const KIOSK_UNLIST_EVENT_SUFFIX = \"::kiosk_listings::UnlistEvent\";\nexport const KIOSK_TRANSFER_EVENT_SUFFIX = \"::kiosk_transfers::TransferWithPurchaseCapEvent\";\nexport const KIOSK_CLAIM_EVENT_SUFFIX = \"::kiosk_transfers::ClaimWithPurchaseCapEvent\";\nexport const PERSONAL_KIOSK_CREATED_EVENT_SUFFIX = \"::personal_kiosk::NewPersonalKiosk\";\nexport const KIOSK_BIDDING_CLAIM_EVENT_SUFFIX = \"::kiosk_biddings::ClaimWithPurchaseCapEvent\";\n\nexport type SuiAssetOwnerRefKind = \"address\" | \"object\" | \"shared\" | \"immutable\" | \"consensus\";\n\nexport interface SuiAssetOwnerRef {\n value: string;\n kind: SuiAssetOwnerRefKind;\n}\n\nexport interface SuiAssetOwnerChangeDetails {\n sender: string | null;\n nextOwner: SuiAssetOwnerRef | null;\n objectType: string | null;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function getString(value: unknown): string | null {\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nexport function getRecordString(record: Record<string, unknown>, key: string): string | null {\n return getString(record[key]);\n}\n\nexport function getRecordStringArray(record: Record<string, unknown>, key: string): string[] {\n const value = record[key];\n return Array.isArray(value) ? value.flatMap((entry) => (typeof entry === \"string\" ? [entry] : [])) : [];\n}\n\nexport function eventTypeMatches(event: Pick<SuiEventLike, \"type\">, suffixes: readonly string[]): boolean {\n return suffixes.some((suffix) => event.type.endsWith(suffix));\n}\n\nexport function normalizeOwnerRef(owner: SuiObjectOwnerLike): SuiAssetOwnerRef | null {\n if (!owner) {\n return null;\n }\n\n if (owner === \"Immutable\") {\n return { value: \"Immutable\", kind: \"immutable\" };\n }\n\n if (\"AddressOwner\" in owner) {\n return { value: owner.AddressOwner, kind: \"address\" };\n }\n\n if (\"ObjectOwner\" in owner) {\n return { value: owner.ObjectOwner, kind: \"object\" };\n }\n\n if (\"Shared\" in owner) {\n return {\n value: `Shared:${owner.Shared.initial_shared_version}`,\n kind: \"shared\",\n };\n }\n\n if (\"ConsensusV2\" in owner) {\n return { value: \"ConsensusV2\", kind: \"consensus\" };\n }\n\n return null;\n}\n\nexport function getAssetObjectChange(tx: SuiTransactionBlockLike, assetId: string): SuiObjectChangeLike | null {\n const changes = tx.objectChanges ?? [];\n const matches = changes.filter((change) => change.objectId === assetId);\n return matches[matches.length - 1] ?? null;\n}\n\nexport function getAssetOwnerChangeDetails(\n tx: SuiTransactionBlockLike,\n assetId: string,\n): SuiAssetOwnerChangeDetails | null {\n const change = getAssetObjectChange(tx, assetId);\n if (!change) {\n return null;\n }\n\n return {\n sender: getString(change.sender) ?? getString(tx.transaction?.data?.sender),\n nextOwner: normalizeOwnerRef(change.owner ?? change.recipient),\n objectType: getString(change.objectType),\n };\n}\n\nexport function getAssetOwnerChange(tx: SuiTransactionBlockLike, assetId: string): SuiAssetOwnerChange | null {\n const ownerChange = getAssetOwnerChangeDetails(tx, assetId);\n if (!ownerChange) {\n return null;\n }\n\n return {\n sender: ownerChange.sender,\n nextOwner: ownerChange.nextOwner?.value ?? null,\n nextOwnerKind: ownerChange.nextOwner?.kind ?? null,\n objectType: ownerChange.objectType,\n };\n}\n\nexport function eventTouchesAsset(event: SuiEventLike, assetId: string): boolean {\n if (!isRecord(event.parsedJson)) {\n return false;\n }\n\n const parsedJson = event.parsedJson;\n const directMatches = [\"nft_id\", \"maybe_nft_id\", \"popkins_id\", \"object_id\"]\n .map((key) => getRecordString(parsedJson, key))\n .filter((value): value is string => value !== null);\n\n if (directMatches.includes(assetId)) {\n return true;\n }\n\n return (\n getRecordStringArray(parsedJson, \"proposer_nft_ids\").includes(assetId) ||\n getRecordStringArray(parsedJson, \"counterparty_nft_ids\").includes(assetId)\n );\n}\n\nexport function getAssetEvents(tx: SuiTransactionBlockLike, assetId: string): SuiEventLike[] {\n return (tx.events ?? []).filter((event) => eventTouchesAsset(event, assetId));\n}\n\nexport function getEventTypes(events: SuiEventLike[]): string[] {\n return [...new Set(events.map((event) => event.type))];\n}\n\nexport function findFirstEvent(events: SuiEventLike[], suffixes: readonly string[]): SuiEventLike | null {\n for (const event of events) {\n if (eventTypeMatches(event, suffixes)) {\n return event;\n }\n }\n\n return null;\n}\n\nexport function getPriceRaw(event: SuiEventLike | null): string | null {\n if (!event || !isRecord(event.parsedJson)) {\n return null;\n }\n\n return getRecordString(event.parsedJson, \"price\") ?? getRecordString(event.parsedJson, \"new_price\");\n}\n\nexport function getMarket(event: SuiEventLike | null, fallback: string | null = null): string | null {\n if (!event || !isRecord(event.parsedJson)) {\n return fallback;\n }\n\n return getRecordString(event.parsedJson, \"market\") ?? fallback;\n}\n\nexport function hasMeaningfulSuiSettlement(balanceChanges: SuiBalanceChangeLike[] | null | undefined): boolean {\n return (balanceChanges ?? []).some((change) => {\n const amount = change.amount ?? \"0\";\n return change.coinType === SUI_COIN_TYPE && amount !== \"0\";\n });\n}\n","import type { SuiAssetFlowClassification, SuiTransactionBlockLike } from \"./types.js\";\nimport {\n findFirstEvent,\n getAssetEvents,\n getAssetOwnerChange,\n getEventTypes,\n getMarket,\n getPriceRaw,\n hasMeaningfulSuiSettlement,\n KIOSK_BIDDING_CLAIM_EVENT_SUFFIX,\n KIOSK_CLAIM_EVENT_SUFFIX,\n KIOSK_LIST_EVENT_SUFFIX,\n KIOSK_TRANSFER_EVENT_SUFFIX,\n KIOSK_UNLIST_EVENT_SUFFIX,\n PERSONAL_KIOSK_CREATED_EVENT_SUFFIX,\n POPKINS_MINTED_EVENT_SUFFIX,\n POPKINS_STAKED_EVENT_SUFFIX,\n POPKINS_UNSTAKED_EVENT_SUFFIX,\n SUI_COIN_TYPE,\n TRADEPORT_ADD_LISTING_EVENT_SUFFIX,\n TRADEPORT_BUY_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_CANCEL_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_CREATE_SINGLE_BID_EVENT_SUFFIX,\n TRADEPORT_KIOSK_BUY_EVENT_SUFFIX,\n TRADEPORT_MATCH_SINGLE_BID_EVENT_SUFFIX,\n TRADEPORT_RELIST_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_REMOVE_LISTING_EVENT_SUFFIX,\n} from \"./helpers.js\";\n\nfunction buildClassification(\n tx: SuiTransactionBlockLike,\n assetId: string,\n overrides: Omit<SuiAssetFlowClassification, \"assetId\" | \"eventTypes\" | \"ownerChange\">,\n): SuiAssetFlowClassification {\n const assetEvents = getAssetEvents(tx, assetId);\n\n return {\n assetId,\n eventTypes: getEventTypes(assetEvents),\n ownerChange: getAssetOwnerChange(tx, assetId),\n ...overrides,\n };\n}\n\nexport function classifySuiTransactionForAsset(\n tx: SuiTransactionBlockLike,\n assetId: string,\n): SuiAssetFlowClassification {\n const assetEvents = getAssetEvents(tx, assetId);\n const ownerChange = getAssetOwnerChange(tx, assetId);\n const eventTypes = getEventTypes(assetEvents);\n\n const mintEvent = findFirstEvent(assetEvents, [POPKINS_MINTED_EVENT_SUFFIX]);\n if (mintEvent) {\n return {\n assetId,\n family: \"NFT_MINT\",\n effect: \"OWNERSHIP_CHANGE_ONLY\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"MINT\",\n matcherId: \"sui.popkins-mint\",\n reason: \"matched_popkins_minted_event\",\n hasOwnershipChange: true,\n shouldExtractValueMovements: false,\n eventTypes,\n market: null,\n priceRaw: null,\n currency: null,\n ownerChange,\n };\n }\n\n const saleEvent = findFirstEvent(assetEvents, [\n TRADEPORT_BUY_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_MATCH_SINGLE_BID_EVENT_SUFFIX,\n TRADEPORT_KIOSK_BUY_EVENT_SUFFIX,\n ]);\n if (saleEvent) {\n return {\n assetId,\n family: \"TRADEPORT_SALE\",\n effect: \"OWNERSHIP_CHANGE_AND_SETTLEMENT\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"SALE\",\n matcherId: \"sui.tradeport-sale\",\n reason: \"matched_tradeport_sale_event\",\n hasOwnershipChange: true,\n shouldExtractValueMovements: true,\n eventTypes,\n market: getMarket(saleEvent, \"tradeport\"),\n priceRaw: getPriceRaw(saleEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n const swapEvent = assetEvents.find((event) => event.type.includes(\"SwapExecuted\"));\n if (swapEvent) {\n return {\n assetId,\n family: \"POPSWAP\",\n effect: \"OWNERSHIP_CHANGE_AND_SETTLEMENT\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"SWAP\",\n matcherId: \"sui.popswap-swap-executed\",\n reason: \"matched_popswap_swap_executed_event\",\n hasOwnershipChange: true,\n shouldExtractValueMovements: true,\n eventTypes,\n market: \"popswap\",\n priceRaw: null,\n currency: hasMeaningfulSuiSettlement(tx.balanceChanges) ? SUI_COIN_TYPE : null,\n ownerChange,\n };\n }\n\n const stakedEvent = findFirstEvent(assetEvents, [POPKINS_STAKED_EVENT_SUFFIX]);\n if (stakedEvent) {\n return {\n assetId,\n family: \"POPKINS_STAKING\",\n effect: \"NO_MINT_EFFECT\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"LOCK\",\n matcherId: \"sui.popkins-staking-lock\",\n reason: \"matched_popkins_staked_event\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: null,\n priceRaw: null,\n currency: null,\n ownerChange,\n };\n }\n\n const unstakedEvent = findFirstEvent(assetEvents, [POPKINS_UNSTAKED_EVENT_SUFFIX]);\n if (unstakedEvent) {\n return {\n assetId,\n family: \"POPKINS_STAKING\",\n effect: \"OWNERSHIP_CHANGE_ONLY\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"UNLOCK\",\n matcherId: \"sui.popkins-staking-unlock\",\n reason: \"matched_popkins_unstaked_event\",\n hasOwnershipChange: true,\n shouldExtractValueMovements: false,\n eventTypes,\n market: null,\n priceRaw: null,\n currency: null,\n ownerChange,\n };\n }\n\n const relistEvent = findFirstEvent(assetEvents, [TRADEPORT_RELIST_SIMPLE_EVENT_SUFFIX]);\n if (relistEvent) {\n return {\n assetId,\n family: \"TRADEPORT_LISTING\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"SKIP_FLOW\",\n confidence: \"high\",\n derivedType: \"LIST\",\n matcherId: \"sui.tradeport-relist\",\n reason: \"matched_tradeport_relist_price_change\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: getMarket(relistEvent, \"tradeport\"),\n priceRaw: getPriceRaw(relistEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n const listingEvent = findFirstEvent(assetEvents, [TRADEPORT_ADD_LISTING_EVENT_SUFFIX]);\n if (listingEvent) {\n return {\n assetId,\n family: \"TRADEPORT_LISTING\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"LIST\",\n matcherId: \"sui.tradeport-listing\",\n reason: \"matched_tradeport_listing_event\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: getMarket(listingEvent, \"tradeport\"),\n priceRaw: getPriceRaw(listingEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n const delistEvent = findFirstEvent(assetEvents, [\n TRADEPORT_CANCEL_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_REMOVE_LISTING_EVENT_SUFFIX,\n ]);\n if (delistEvent) {\n return {\n assetId,\n family: \"TRADEPORT_LISTING\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"DELIST\",\n matcherId: \"sui.tradeport-delist\",\n reason: \"matched_tradeport_cancel_listing_event\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: getMarket(delistEvent, \"tradeport\"),\n priceRaw: getPriceRaw(delistEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n const kioskListEvent = findFirstEvent(assetEvents, [KIOSK_LIST_EVENT_SUFFIX]);\n const kioskUnlistEvent = findFirstEvent(assetEvents, [KIOSK_UNLIST_EVENT_SUFFIX]);\n\n if (kioskListEvent && kioskUnlistEvent) {\n return {\n assetId,\n family: \"KIOSK_LISTING\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"SKIP_FLOW\",\n confidence: \"high\",\n derivedType: \"LIST\",\n matcherId: \"sui.kiosk-price-change\",\n reason: \"matched_kiosk_unlist_and_list_in_same_tx_price_change\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: getMarket(kioskListEvent),\n priceRaw: getPriceRaw(kioskListEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n if (kioskListEvent) {\n return {\n assetId,\n family: \"KIOSK_LISTING\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"LIST\",\n matcherId: \"sui.kiosk-listing\",\n reason: \"matched_kiosk_list_event\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: getMarket(kioskListEvent),\n priceRaw: getPriceRaw(kioskListEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n if (kioskUnlistEvent) {\n return {\n assetId,\n family: \"KIOSK_LISTING\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"DELIST\",\n matcherId: \"sui.kiosk-delist\",\n reason: \"matched_kiosk_unlist_event\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: getMarket(kioskUnlistEvent),\n priceRaw: getPriceRaw(kioskUnlistEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n const kioskTransferEvent = findFirstEvent(assetEvents, [KIOSK_TRANSFER_EVENT_SUFFIX, KIOSK_CLAIM_EVENT_SUFFIX]);\n if (kioskTransferEvent) {\n return {\n assetId,\n family: \"KIOSK_CUSTODY\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"SKIP_FLOW\",\n confidence: \"high\",\n derivedType: \"TRANSFER\",\n matcherId: \"sui.kiosk-custody-transfer\",\n reason: \"matched_kiosk_transfer_or_claim_custody_operation\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: null,\n priceRaw: null,\n currency: null,\n ownerChange,\n };\n }\n\n const allEvents = tx.events ?? [];\n const personalKioskEvent = findFirstEvent(allEvents, [PERSONAL_KIOSK_CREATED_EVENT_SUFFIX]);\n const kioskBiddingClaimEvent = findFirstEvent(assetEvents, [KIOSK_BIDDING_CLAIM_EVENT_SUFFIX]);\n if (personalKioskEvent && kioskBiddingClaimEvent && !hasMeaningfulSuiSettlement(tx.balanceChanges)) {\n return {\n assetId,\n family: \"KIOSK_CUSTODY\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"SKIP_FLOW\",\n confidence: \"high\",\n derivedType: \"TRANSFER\",\n matcherId: \"sui.personal-kiosk-claim\",\n reason: \"matched_personal_kiosk_creation_with_claim_no_settlement\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: null,\n priceRaw: null,\n currency: null,\n ownerChange,\n };\n }\n\n const bidIntentEvent = findFirstEvent(assetEvents, [TRADEPORT_CREATE_SINGLE_BID_EVENT_SUFFIX]);\n if (bidIntentEvent) {\n return {\n assetId,\n family: \"TRADEPORT_BID_INTENT\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"SKIP_FLOW\",\n confidence: \"high\",\n derivedType: \"UNKNOWN\",\n matcherId: \"sui.tradeport-bid-intent\",\n reason: \"matched_tradeport_bid_intent_event\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: \"tradeport\",\n priceRaw: getPriceRaw(bidIntentEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n if (ownerChange?.nextOwner) {\n return {\n assetId,\n family: \"GENERIC_OBJECT_TRANSFER\",\n effect: \"OWNERSHIP_CHANGE_ONLY\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"medium\",\n derivedType: \"TRANSFER\",\n matcherId: \"sui.generic-object-transfer\",\n reason: \"matched_asset_object_change_without_protocol_event\",\n hasOwnershipChange: true,\n shouldExtractValueMovements: false,\n eventTypes,\n market: null,\n priceRaw: null,\n currency: null,\n ownerChange,\n };\n }\n\n return buildClassification(tx, assetId, {\n family: \"UNKNOWN\",\n effect: \"UNKNOWN\",\n materialization: \"REVIEW\",\n confidence: \"low\",\n derivedType: \"UNKNOWN\",\n matcherId: \"sui.unknown\",\n reason: \"no_supported_sui_asset_flow_matcher\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n market: null,\n priceRaw: null,\n currency: null,\n });\n}\n","import { canonicalizeMintFlows } from \"../../semantics/canonicalize.js\";\nimport { collapseRedundantCustodyFlows } from \"../../semantics/custody.js\";\nimport { reconstructOwnershipPeriods as buildOwnershipPeriods } from \"../../semantics/ownership.js\";\nimport type { ExtractedMintFlow, ReconstructedOwnershipPeriod } from \"../../types.js\";\nimport { classifySuiTransactionForAsset } from \"./classifier.js\";\nimport {\n findFirstEvent,\n getAssetEvents,\n getAssetOwnerChangeDetails,\n getString,\n getRecordStringArray,\n SUI_COIN_TYPE,\n TRADEPORT_BUY_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_KIOSK_BUY_EVENT_SUFFIX,\n TRADEPORT_MATCH_SINGLE_BID_EVENT_SUFFIX,\n} from \"./helpers.js\";\nimport type { SuiAssetFlowClassification, SuiEventLike, SuiTransactionBlockLike } from \"./types.js\";\n\nexport { reconstructOwnershipPeriods } from \"../../semantics/ownership.js\";\n\nfunction parseSaleParticipants(saleEvent: SuiEventLike | null): {\n buyer: string | null;\n seller: string | null;\n} {\n if (!saleEvent || typeof saleEvent.parsedJson !== \"object\" || saleEvent.parsedJson === null) {\n return {\n buyer: null,\n seller: null,\n };\n }\n\n const parsedJson = saleEvent.parsedJson as Record<string, unknown>;\n return {\n buyer: getString(parsedJson.buyer),\n seller: getString(parsedJson.seller),\n };\n}\n\nfunction parseSwapParticipants(\n swapEvent: SuiEventLike | null,\n assetId: string,\n): {\n fromAddress: string | null;\n toAddress: string | null;\n} {\n if (!swapEvent || typeof swapEvent.parsedJson !== \"object\" || swapEvent.parsedJson === null) {\n return {\n fromAddress: null,\n toAddress: null,\n };\n }\n\n const parsedJson = swapEvent.parsedJson as Record<string, unknown>;\n const proposer = getString(parsedJson.proposer);\n const counterparty = getString(parsedJson.counterparty);\n const proposerAssetIds = getRecordStringArray(parsedJson, \"proposer_nft_ids\");\n const counterpartyAssetIds = getRecordStringArray(parsedJson, \"counterparty_nft_ids\");\n\n if (proposerAssetIds.includes(assetId)) {\n return {\n fromAddress: proposer,\n toAddress: counterparty,\n };\n }\n\n if (counterpartyAssetIds.includes(assetId)) {\n return {\n fromAddress: counterparty,\n toAddress: proposer,\n };\n }\n\n return {\n fromAddress: proposer,\n toAddress: counterparty,\n };\n}\n\nfunction sortTransactions(transactions: SuiTransactionBlockLike[]): SuiTransactionBlockLike[] {\n return [...transactions].sort((left, right) => {\n const leftTime = Number(left.timestampMs ?? 0) || 0;\n const rightTime = Number(right.timestampMs ?? 0) || 0;\n if (leftTime !== rightTime) {\n return leftTime - rightTime;\n }\n\n const leftSlot = Number(left.checkpoint ?? 0) || 0;\n const rightSlot = Number(right.checkpoint ?? 0) || 0;\n if (leftSlot !== rightSlot) {\n return leftSlot - rightSlot;\n }\n\n return left.digest.localeCompare(right.digest);\n });\n}\n\nfunction resolveTimestamp(tx: SuiTransactionBlockLike): number {\n const timestampMs = Number(tx.timestampMs ?? NaN);\n if (Number.isFinite(timestampMs) && timestampMs > 0) {\n return Math.trunc(timestampMs / 1000);\n }\n\n throw new Error(`Missing timestamp for Sui asset-flow tx ${tx.digest}`);\n}\n\nfunction resolveSlot(tx: SuiTransactionBlockLike): number | null {\n const checkpoint = Number(tx.checkpoint ?? NaN);\n return Number.isFinite(checkpoint) ? checkpoint : null;\n}\n\nfunction buildFlow(\n tx: SuiTransactionBlockLike,\n timestamp: number,\n params: {\n fromAddress: string | null;\n toAddress: string | null;\n derivedType: ExtractedMintFlow[\"derivedType\"];\n },\n): ExtractedMintFlow {\n return {\n signature: tx.digest,\n slot: resolveSlot(tx),\n timestamp,\n heliusType: \"SUI\",\n source: \"sui\",\n fromAddress: params.fromAddress,\n toAddress: params.toAddress,\n transferIndex: 0,\n tokenStandard: null,\n derivedType: params.derivedType,\n };\n}\n\nfunction buildSuiFlow(\n tx: SuiTransactionBlockLike,\n assetId: string,\n classification: SuiAssetFlowClassification,\n currentBeneficialOwner: string | null,\n): ExtractedMintFlow | null {\n if (classification.materialization !== \"PERSIST_FLOW\") {\n return null;\n }\n\n const timestamp = resolveTimestamp(tx);\n const assetEvents = getAssetEvents(tx, assetId);\n const ownerChange = getAssetOwnerChangeDetails(tx, assetId);\n const sender = getString(tx.transaction?.data?.sender) ?? ownerChange?.sender ?? null;\n const addressOwner = ownerChange?.nextOwner?.kind === \"address\" ? ownerChange.nextOwner.value : null;\n\n let fromAddress: string | null = null;\n let toAddress: string | null = null;\n\n switch (classification.derivedType) {\n case \"MINT\":\n toAddress = addressOwner ?? sender ?? null;\n break;\n case \"SALE\": {\n const saleEvent = findFirstEvent(assetEvents, [\n TRADEPORT_BUY_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_MATCH_SINGLE_BID_EVENT_SUFFIX,\n TRADEPORT_KIOSK_BUY_EVENT_SUFFIX,\n ]);\n const sale = parseSaleParticipants(saleEvent);\n fromAddress = sale.seller ?? currentBeneficialOwner ?? sender ?? null;\n toAddress = sale.buyer ?? addressOwner ?? sender ?? null;\n break;\n }\n case \"SWAP\": {\n const swapEvent = assetEvents.find((event) => event.type.includes(\"SwapExecuted\")) ?? null;\n const swap = parseSwapParticipants(swapEvent, assetId);\n fromAddress = swap.fromAddress ?? currentBeneficialOwner ?? sender ?? null;\n toAddress = swap.toAddress ?? addressOwner ?? sender ?? null;\n break;\n }\n case \"TRANSFER\":\n fromAddress = currentBeneficialOwner ?? sender ?? null;\n toAddress =\n addressOwner ??\n (ownerChange?.nextOwner?.kind === \"object\" ? (currentBeneficialOwner ?? sender ?? null) : (sender ?? null));\n break;\n case \"LIST\": {\n const owner = currentBeneficialOwner ?? sender ?? addressOwner;\n fromAddress = owner;\n toAddress = owner;\n break;\n }\n case \"DELIST\":\n case \"LOCK\":\n case \"UNLOCK\": {\n const owner = addressOwner ?? sender ?? currentBeneficialOwner;\n if (owner && currentBeneficialOwner && owner !== currentBeneficialOwner) {\n fromAddress = currentBeneficialOwner;\n toAddress = owner;\n } else {\n const custodyOwner = currentBeneficialOwner ?? owner;\n fromAddress = custodyOwner;\n toAddress = custodyOwner;\n }\n break;\n }\n default:\n return null;\n }\n\n return buildFlow(tx, timestamp, {\n fromAddress,\n toAddress,\n derivedType: classification.derivedType,\n });\n}\n\nexport function extractAssetFlows(\n transactions: SuiTransactionBlockLike[],\n assetId: string,\n classificationCache: Map<string, SuiAssetFlowClassification> = new Map(),\n): ExtractedMintFlow[] {\n const flows: ExtractedMintFlow[] = [];\n let currentBeneficialOwner: string | null = null;\n\n for (const tx of sortTransactions(transactions)) {\n const classification = classificationCache.get(tx.digest) ?? classifySuiTransactionForAsset(tx, assetId);\n\n classificationCache.set(tx.digest, classification);\n\n const flow = buildSuiFlow(tx, assetId, classification, currentBeneficialOwner);\n\n if (!flow) {\n continue;\n }\n\n flows.push(flow);\n\n if (\n flow.toAddress &&\n (flow.derivedType === \"MINT\" ||\n flow.derivedType === \"TRANSFER\" ||\n flow.derivedType === \"SALE\" ||\n flow.derivedType === \"SWAP\" ||\n flow.derivedType === \"FORECLOSURE\") &&\n flow.toAddress !== currentBeneficialOwner\n ) {\n currentBeneficialOwner = flow.toAddress;\n }\n }\n\n return collapseRedundantCustodyFlows(canonicalizeMintFlows(flows));\n}\n\nexport function normalizeAssetHistory(\n transactions: SuiTransactionBlockLike[],\n assetId: string,\n): {\n flows: ExtractedMintFlow[];\n periods: ReconstructedOwnershipPeriod[];\n} {\n const classificationCache = new Map<string, SuiAssetFlowClassification>();\n const flows = extractAssetFlows(transactions, assetId, classificationCache);\n const periods = buildOwnershipPeriods(flows);\n\n return {\n flows,\n periods,\n };\n}\n"],"mappings":"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","names":["MEANINGFUL_SETTLEMENT_LAMPORTS","ASSOCIATED_TOKEN_PROGRAM_ID","classification","classification","LAMPORTS_PER_SOL","classification","MEANINGFUL_SETTLEMENT_LAMPORTS","CLAY_STAKING_INSTRUCTION_LABELS","normalizedType","buildFlow","classification"]}
1
+ {"version":3,"sources":["../src/chains/solana/index.ts","../src/chains/solana/utils.ts","../src/chains/solana/facts/build-facts.ts","../src/chains/solana/matchers/classify.ts","../src/chains/solana/matchers/core/direct-nft-transfer.ts","../src/chains/solana/matchers/core/explicit-nft-sale.ts","../src/chains/solana/matchers/core/nft-mint.ts","../src/semantics/marketplace.ts","../src/chains/solana/matchers/marketplace/magic-eden-buy-intent.ts","../src/chains/solana/matchers/marketplace/magic-eden-lucky-buy.ts","../src/chains/solana/matchers/marketplace/marketplace-bid.ts","../src/chains/solana/matchers/marketplace/marketplace-listing.ts","../src/chains/solana/matchers/marketplace/hyperspace-instant-sell.ts","../src/chains/solana/matchers/marketplace/tensor-unknown-sale.ts","../src/chains/solana/matchers/protocol/bet-program-activity.ts","../src/chains/solana/matchers/protocol/bubblegum-compressed-mint.ts","../src/chains/solana/matchers/protocol/candy-machine-route.ts","../src/chains/solana/matchers/protocol/clay-class-program-activity.ts","../src/chains/solana/matchers/protocol/corrupt-program-unwind.ts","../src/chains/solana/matchers/protocol/fungible-token-transfer-noise.ts","../src/chains/solana/matchers/protocol/foxy-cancel-swap.ts","../src/chains/solana/matchers/protocol/foxy-init-swap.ts","../src/chains/solana/matchers/protocol/foxy-raffle-transfer.ts","../src/chains/solana/matchers/protocol/foxy-swap.ts","../src/chains/solana/matchers/protocol/hadeswap-activity.ts","../src/semantics/loan.ts","../src/chains/solana/matchers/protocol/loan-collateral-transfer.ts","../src/chains/solana/matchers/protocol/loan-program-activity.ts","../src/chains/solana/matchers/protocol/metaplex-resize-activity.ts","../src/chains/solana/matchers/protocol/migrate-to-pnft.ts","../src/chains/solana/matchers/protocol/metaplex-metadata-update.ts","../src/chains/solana/matchers/protocol/sharky-repay-loan-sale.ts","../src/chains/solana/matchers/protocol/sharky-take-loan-transfer.ts","../src/chains/solana/matchers/protocol/tlock-legacy-claim.ts","../src/chains/solana/matchers/fallbacks.ts","../src/chains/solana/matchers/registry.ts","../src/chains/solana/matchers/select.ts","../src/chains/solana/observation.ts","../src/chains/solana/explain.ts","../src/chains/solana/classifier.ts","../src/chains/solana/coverage.ts","../src/semantics/sale.ts","../src/chains/solana/protocol-events.ts","../src/semantics/canonicalize.ts","../src/semantics/custody.ts","../src/semantics/ownership.ts","../src/semantics/value-movement-extraction.ts","../src/semantics/value-movements.ts","../src/chains/solana/normalize.ts","../src/chains/solana/raw.ts","../src/chains/sui/index.ts","../src/chains/sui/helpers.ts","../src/chains/sui/classifier.ts","../src/chains/sui/normalize.ts"],"sourcesContent":["export * from \"./classifier.js\";\nexport * from \"./coverage.js\";\nexport * from \"./explain.js\";\nexport * from \"./facts/build-facts.js\";\nexport * from \"./facts/types.js\";\nexport * from \"./matchers/classify.js\";\nexport * from \"./matchers/registry.js\";\nexport * from \"./matchers/select.js\";\nexport * from \"./matchers/types.js\";\nexport * from \"./normalize.js\";\nexport * from \"./observation.js\";\nexport * from \"./protocol-events.js\";\nexport * from \"./raw.js\";\nexport * from \"./utils.js\";\n\nexport { classifyEnhancedTransactionForMint as classify } from \"./classifier.js\";\nexport { explainEnhancedTransactionForMint as explain } from \"./explain.js\";\nexport { extractMintFlows as buildFlows } from \"./normalize.js\";\nexport { normalizeMintHistory as buildMintHistory } from \"./normalize.js\";\nexport { reconstructOwnershipPeriods as buildOwnershipPeriods } from \"./normalize.js\";\nexport { extractValueMovements as buildValueMovements } from \"./normalize.js\";\nexport { extractCandidateMintsFromEnhancedTx as extractMints } from \"./normalize.js\";\nexport { augmentEnhancedTransactionWithRaw as augmentWithRaw } from \"./raw.js\";\nexport { shouldFetchRawForMintTx as shouldFetchRaw } from \"./raw.js\";\n","import type { HeliusEnhancedAction, HeliusEnhancedTx, HeliusTokenTransfer } from \"./types.js\";\n\nconst MEANINGFUL_SETTLEMENT_LAMPORTS = 10_000_000;\n\nexport function normalizeEnhancedType(value: string | undefined): string {\n if (!value) return \"\";\n return value\n .trim()\n .replace(/[^\\w]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_|_$/g, \"\")\n .toUpperCase();\n}\n\nexport function toNullableNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === \"string\" && value.trim().length > 0) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n return null;\n}\n\nexport function isNonFungibleTokenStandard(tokenStandard: string | null | undefined): boolean {\n return tokenStandard === \"ProgrammableNonFungible\" || tokenStandard === \"NonFungible\";\n}\n\nexport function isMintNftTransfer(transfer: HeliusTokenTransfer, mint: string): boolean {\n const numericAmount =\n typeof transfer.tokenAmount === \"number\" ? transfer.tokenAmount : Number(transfer.tokenAmount ?? NaN);\n if (!Number.isFinite(numericAmount) || numericAmount <= 0) return false;\n if (transfer.mint !== mint) return false;\n return isNonFungibleTokenStandard(transfer.tokenStandard);\n}\n\nexport function getMintNftTransfers(tx: HeliusEnhancedTx, mint: string): HeliusTokenTransfer[] {\n return (tx.tokenTransfers ?? []).filter((transfer) => isMintNftTransfer(transfer, mint));\n}\n\nfunction isMeaningfulPaidAction(\n action: HeliusEnhancedAction,\n primaryBuyer: string | null,\n primarySeller: string | null,\n): boolean {\n if (normalizeEnhancedType(action.actionType) !== \"PAID\") return false;\n\n const amount = toNullableNumber(action.amount);\n if (!amount || amount < MEANINGFUL_SETTLEMENT_LAMPORTS) return false;\n\n const from = action.from ?? null;\n const to = action.to ?? null;\n return from === primaryBuyer || to === primarySeller || from === primarySeller || to === primaryBuyer;\n}\n\nexport function hasMeaningfulNativeSettlement(tx: HeliusEnhancedTx, mint: string): boolean {\n const nftTransfers = getMintNftTransfers(tx, mint);\n if (nftTransfers.length === 0) return false;\n\n const primaryBuyer = nftTransfers[nftTransfers.length - 1]?.toUserAccount ?? null;\n const primarySeller = nftTransfers[0]?.fromUserAccount ?? null;\n const largeNativeTransfers = (tx.nativeTransfers ?? []).filter((transfer) => {\n const amount = toNullableNumber(transfer.amount);\n return !!amount && amount >= MEANINGFUL_SETTLEMENT_LAMPORTS;\n });\n const hasMatchingNativeTransfer = largeNativeTransfers.some((transfer) => {\n const from = transfer.fromUserAccount ?? null;\n const to = transfer.toUserAccount ?? null;\n return from === primaryBuyer || to === primarySeller || from === primarySeller || to === primaryBuyer;\n });\n\n if (hasMatchingNativeTransfer) {\n return true;\n }\n\n return (tx.actions ?? []).some((action) => isMeaningfulPaidAction(action, primaryBuyer, primarySeller));\n}\n","import type { HeliusEnhancedInstruction, HeliusEnhancedTx } from \"../types.js\";\nimport { getMintNftTransfers, hasMeaningfulNativeSettlement, normalizeEnhancedType } from \"../utils.js\";\nimport type { AssetFlowTransactionFacts } from \"./types.js\";\n\nconst NOISY_OWNERSHIP_CHANGE_SOURCES = new Set([\n \"ASSOCIATED_TOKEN_PROGRAM\",\n \"SYSTEM_PROGRAM\",\n \"SOLANA_PROGRAM_LIBRARY\",\n \"UNKNOWN\",\n]);\n\nfunction collectInstructionProgramIds(\n instructions: HeliusEnhancedInstruction[] | undefined,\n programIds: Set<string>,\n): void {\n for (const instruction of instructions ?? []) {\n if (instruction.programId) {\n programIds.add(instruction.programId);\n }\n\n if (instruction.innerInstructions?.length) {\n collectInstructionProgramIds(instruction.innerInstructions, programIds);\n }\n }\n}\n\nfunction collectInstructionLabels(instructions: HeliusEnhancedInstruction[] | undefined, labels: Set<string>): void {\n for (const instruction of instructions ?? []) {\n if (instruction.name) {\n labels.add(instruction.name);\n }\n\n if (instruction.innerInstructions?.length) {\n collectInstructionLabels(instruction.innerInstructions, labels);\n }\n }\n}\n\nfunction getNetTransferEndpoints(nftTransfers: AssetFlowTransactionFacts[\"nftTransfers\"]): {\n from: string | null;\n to: string | null;\n} {\n const from = nftTransfers.find((transfer) => transfer.fromUserAccount)?.fromUserAccount ?? null;\n const to = [...nftTransfers].reverse().find((transfer) => transfer.toUserAccount)?.toUserAccount ?? null;\n return { from, to };\n}\n\nexport function buildTransactionFacts(tx: HeliusEnhancedTx, mint: string): AssetFlowTransactionFacts {\n const nftTransfers = getMintNftTransfers(tx, mint);\n const { from: primarySeller, to: primaryBuyer } = getNetTransferEndpoints(nftTransfers);\n const hasMeaningfulSettlement = hasMeaningfulNativeSettlement(tx, mint);\n const programIds = new Set((tx.programIds ?? []).filter(Boolean));\n const instructionLabels = new Set((tx.instructionLabels ?? []).filter(Boolean));\n\n collectInstructionProgramIds(tx.instructions, programIds);\n collectInstructionLabels(tx.instructions, instructionLabels);\n\n const hasProgramEvidence = programIds.size > 0 || instructionLabels.size > 0;\n const normalizedSource = normalizeEnhancedType(tx.source);\n const hasTransferTouch = nftTransfers.length > 0;\n const rawOwnershipChange = !!primaryBuyer && primarySeller !== primaryBuyer;\n const isNoisyOwnershipChange =\n rawOwnershipChange &&\n !hasMeaningfulSettlement &&\n hasTransferTouch &&\n NOISY_OWNERSHIP_CHANGE_SOURCES.has(normalizedSource) &&\n !hasProgramEvidence;\n const hasOwnershipChange = rawOwnershipChange && !isNoisyOwnershipChange;\n\n const nftTouchKind = !hasTransferTouch\n ? \"NONE\"\n : hasOwnershipChange\n ? \"OWNERSHIP_CHANGE\"\n : primarySeller === primaryBuyer\n ? \"SAME_OWNER\"\n : \"SAME_OWNER\";\n\n const ownershipKind = !hasTransferTouch\n ? \"NONE\"\n : isNoisyOwnershipChange\n ? \"AMBIGUOUS\"\n : hasOwnershipChange\n ? \"DIRECT\"\n : primarySeller && primaryBuyer && primarySeller === primaryBuyer\n ? \"SAME_OWNER\"\n : \"AMBIGUOUS\";\n\n const settlementKind = hasMeaningfulSettlement\n ? primaryBuyer && primarySeller\n ? \"NATIVE_SALE\"\n : \"POTENTIAL_SALE\"\n : hasOwnershipChange && !hasProgramEvidence\n ? \"AMBIGUOUS\"\n : \"NONE\";\n\n return {\n mint,\n tx,\n normalizedType: normalizeEnhancedType(tx.type),\n normalizedSource,\n nftTransfers,\n nftTouchKind,\n ownershipKind,\n settlementKind,\n hasOwnershipChange,\n hasMeaningfulSettlement,\n primaryBuyer,\n primarySeller,\n custodyEndpoint: hasTransferTouch ? primaryBuyer : null,\n hasProgramEvidence,\n isNoisyOwnershipChange,\n programIds: [...programIds],\n instructionLabels: [...instructionLabels],\n };\n}\n","import type {\n AssetFlowTxClassification,\n AssetFlowDerivedType,\n AssetFlowEffect,\n AssetFlowMaterialization,\n AssetFlowInterpreterConfidence,\n AssetFlowFamily,\n} from \"../types.js\";\n\ninterface ClassificationInput {\n family: AssetFlowFamily;\n derivedType: AssetFlowDerivedType;\n matcherId: string;\n reason: string;\n observation: {\n normalizedType: string;\n hasOwnershipChange: boolean;\n };\n overrides?: Partial<\n Pick<\n AssetFlowTxClassification,\n \"normalizedType\" | \"effect\" | \"materialization\" | \"confidence\" | \"shouldExtractValueMovements\"\n >\n >;\n}\n\nexport const PERSIST_DERIVED_TYPES: Set<AssetFlowDerivedType> = new Set([\n \"SALE\",\n \"SWAP\",\n \"TRANSFER\",\n \"MINT\",\n \"LIST\",\n \"DELIST\",\n \"LOCK\",\n \"UNLOCK\",\n \"FORECLOSURE\",\n]);\n\nfunction deriveEffect(derivedType: AssetFlowDerivedType): AssetFlowEffect {\n if (derivedType === \"SALE\" || derivedType === \"SWAP\") return \"OWNERSHIP_CHANGE_AND_SETTLEMENT\";\n if (derivedType === \"TRANSFER\" || derivedType === \"MINT\" || derivedType === \"FORECLOSURE\" || derivedType === \"UNLOCK\")\n return \"OWNERSHIP_CHANGE_ONLY\";\n if (derivedType === \"LIST\" || derivedType === \"DELIST\") return \"NON_SETTLEMENT_MARKETPLACE_ACTION\";\n if (derivedType === \"LOCK\" || derivedType === \"NON_SETTLEMENT\") return \"NO_MINT_EFFECT\";\n return \"UNKNOWN\";\n}\n\nfunction deriveMaterialization(derivedType: AssetFlowDerivedType): AssetFlowMaterialization {\n if (PERSIST_DERIVED_TYPES.has(derivedType)) return \"PERSIST_FLOW\";\n if (derivedType === \"NON_SETTLEMENT\") return \"SKIP_FLOW\";\n return \"REVIEW\";\n}\n\nfunction deriveConfidence(derivedType: AssetFlowDerivedType): AssetFlowInterpreterConfidence {\n if (derivedType === \"UNKNOWN\") return \"low\";\n return \"high\";\n}\n\nfunction deriveShouldExtractValueMovements(derivedType: AssetFlowDerivedType): boolean {\n return derivedType === \"SALE\" || derivedType === \"SWAP\";\n}\n\nexport function classification(input: ClassificationInput): AssetFlowTxClassification {\n return {\n family: input.family,\n derivedType: input.derivedType,\n matcherId: input.matcherId,\n reason: input.reason,\n normalizedType: input.overrides?.normalizedType ?? input.observation.normalizedType,\n hasOwnershipChange: input.observation.hasOwnershipChange,\n effect: input.overrides?.effect ?? deriveEffect(input.derivedType),\n materialization: input.overrides?.materialization ?? deriveMaterialization(input.derivedType),\n confidence: input.overrides?.confidence ?? deriveConfidence(input.derivedType),\n shouldExtractValueMovements:\n input.overrides?.shouldExtractValueMovements ?? deriveShouldExtractValueMovements(input.derivedType),\n };\n}\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst DIRECT_TRANSFER_TYPES = new Set([\"TRANSFER\", \"NFT_TRANSFER\"]);\nconst DIRECT_TRANSFER_SOURCES = new Set([\"METAPLEX\", \"PHANTOM\", \"SOLANA_PROGRAM_LIBRARY\"]);\n\nexport const directNftTransferMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.direct-nft-transfer\",\n matches(observation) {\n return (\n DIRECT_TRANSFER_SOURCES.has(observation.normalizedSource) &&\n DIRECT_TRANSFER_TYPES.has(observation.normalizedType) &&\n observation.nftTransfers.length > 0 &&\n observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_TRANSFER\",\n derivedType: \"TRANSFER\",\n matcherId: this.id,\n reason: \"matched_direct_nft_transfer_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const explicitNftSaleMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.explicit-nft-sale\",\n matches(observation) {\n return observation.normalizedType === \"NFT_SALE\" && observation.nftTransfers.length > 0;\n },\n classify(observation) {\n return classification({\n family: \"EXPLICIT_NFT_SALE\",\n derivedType: \"SALE\",\n matcherId: this.id,\n reason: \"explicit_sale_type\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const nftMintMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.nft-mint\",\n matches(observation) {\n return (\n observation.normalizedType === \"NFT_MINT\" && observation.nftTransfers.length > 0 && observation.hasOwnershipChange\n );\n },\n classify(observation) {\n return classification({\n family: \"NFT_MINT\",\n derivedType: \"MINT\",\n matcherId: this.id,\n reason: \"matched_nft_mint_family\",\n observation,\n });\n },\n};\n","import type { AssetFlowObservation } from \"../types.js\";\n\nconst MARKETPLACE_SOURCES = new Set([\"HADESWAP\", \"HYPERSPACE\", \"MAGIC_EDEN\", \"TENSOR\"]);\nconst LISTING_TYPES = new Set([\"NFT_LISTING\", \"NFT_CANCEL_LISTING\"]);\nconst BID_SOURCES = new Set([\"MAGIC_EDEN\", \"TENSOR\", \"HYPERSPACE\"]);\nconst BID_TYPES = new Set([\"NFT_BID\", \"NFT_BID_CANCELLED\"]);\nconst TENSOR_LEGACY_MARKETPLACE_PROGRAM_ID = \"TCMPhJdwDryooaGtiocG1u3xcYbRpiJzb283XfCZsDp\";\nconst MAGIC_EDEN_MMM_PROGRAM_ID = \"mmm3XBJg5gk8XJxEKBvdgptZz6SgK4tXvn36sodowMc\";\nconst TENSOR_BID_PROGRAM_ID = \"TB1Dqt8JeKQh7RLDzfYDJsq8KS4fS2yt87avRjyRxMv\";\nconst FOXY_RAFFLE_SOURCE = \"FOXY_RAFFLE\";\nconst FOXY_RAFFLE_CREATE_TYPE = \"CREATE_RAFFLE\";\nconst FOXY_RAFFLE_UNWIND_TYPE = \"UNKNOWN\";\nconst ASSOCIATED_TOKEN_PROGRAM_ID = \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\";\nconst HADESWAP_SOURCE = \"HADESWAP\";\nconst MAGIC_EDEN_M2_PROGRAM_ID = \"M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K\";\nconst BUY_INTENT_INSTRUCTION_LABEL = \"BuyV2\";\nconst MEANINGFUL_SETTLEMENT_LAMPORTS = 10_000_000;\n\nexport interface MarketplaceListingResolution {\n derivedType: \"LIST\" | \"DELIST\" | \"NON_SETTLEMENT\";\n hasTrackedMovement: boolean;\n}\n\nexport interface MarketplaceBidResolution {\n matchedBy: \"NORMALIZED_BID_ACTION\" | \"TENSOR_BID_PROGRAM\";\n}\n\nexport interface MagicEdenBuyIntentResolution {\n matchedBy: \"MAGIC_EDEN_PROGRAM\" | \"BUY_V2_INSTRUCTION\";\n}\n\nexport interface HadeswapActivityResolution {\n activityKind: \"SALE\" | \"MAINTENANCE\" | \"POOL_MOVEMENT\" | \"POOL_WITHDRAWAL\";\n}\n\nexport interface TensorUnknownSaleResolution {\n matchedBy: \"UNKNOWN_TENSOR_SETTLED_TRANSFER\";\n}\n\nexport interface RoutedSettlementResolution {\n intermediary: string;\n buyer: string;\n counterparty: string;\n matchedBy: \"INTERMEDIARY_OUTBOUND_SETTLEMENT\" | \"INTERMEDIARY_INBOUND_SETTLEMENT\";\n}\n\nexport interface MagicEdenLuckyBuyResolution {\n intermediary: string;\n buyer: string;\n settlement: RoutedSettlementResolution;\n}\n\nfunction isPureNonSettlementObservation(observation: AssetFlowObservation): boolean {\n return (\n observation.nftTransfers.length === 0 && !observation.hasOwnershipChange && !observation.hasMeaningfulSettlement\n );\n}\n\nfunction isUnknownSaleLikeMarketplaceObservation(observation: AssetFlowObservation, source: string): boolean {\n return (\n observation.normalizedType === \"UNKNOWN\" &&\n observation.normalizedSource === source &&\n observation.hasOwnershipChange &&\n observation.hasMeaningfulSettlement\n );\n}\n\nfunction isStandardMarketplaceListing(observation: AssetFlowObservation): boolean {\n return (\n !observation.hasMeaningfulSettlement &&\n ((MARKETPLACE_SOURCES.has(observation.normalizedSource) && LISTING_TYPES.has(observation.normalizedType)) ||\n observation.programIds.includes(TENSOR_LEGACY_MARKETPLACE_PROGRAM_ID) ||\n observation.programIds.includes(MAGIC_EDEN_MMM_PROGRAM_ID))\n );\n}\n\nfunction isFoxyRaffleListing(observation: AssetFlowObservation): boolean {\n return (\n observation.normalizedSource === FOXY_RAFFLE_SOURCE &&\n observation.hasOwnershipChange &&\n (observation.normalizedType === FOXY_RAFFLE_CREATE_TYPE ||\n (observation.normalizedType === FOXY_RAFFLE_UNWIND_TYPE &&\n !observation.hasMeaningfulSettlement &&\n !observation.programIds.includes(ASSOCIATED_TOKEN_PROGRAM_ID)))\n );\n}\n\nfunction isDelistLikeMarketplaceAction(observation: AssetFlowObservation): boolean {\n return (\n observation.normalizedType === \"NFT_CANCEL_LISTING\" ||\n (observation.normalizedSource === FOXY_RAFFLE_SOURCE && observation.normalizedType === FOXY_RAFFLE_UNWIND_TYPE)\n );\n}\n\nexport function resolveMarketplaceListing(observation: AssetFlowObservation): MarketplaceListingResolution | null {\n if (!isStandardMarketplaceListing(observation) && !isFoxyRaffleListing(observation)) {\n return null;\n }\n\n const hasTrackedMovement = observation.hasOwnershipChange && observation.nftTransfers.length > 0;\n if (!hasTrackedMovement) {\n return {\n derivedType: \"NON_SETTLEMENT\",\n hasTrackedMovement: false,\n };\n }\n\n return {\n derivedType: isDelistLikeMarketplaceAction(observation) ? \"DELIST\" : \"LIST\",\n hasTrackedMovement: true,\n };\n}\n\nexport function resolveMarketplaceBid(observation: AssetFlowObservation): MarketplaceBidResolution | null {\n if (!isPureNonSettlementObservation(observation)) {\n return null;\n }\n\n if (BID_SOURCES.has(observation.normalizedSource) && BID_TYPES.has(observation.normalizedType)) {\n return { matchedBy: \"NORMALIZED_BID_ACTION\" };\n }\n\n if (observation.programIds.includes(TENSOR_BID_PROGRAM_ID)) {\n return { matchedBy: \"TENSOR_BID_PROGRAM\" };\n }\n\n return null;\n}\n\nexport function resolveMagicEdenBuyIntent(observation: AssetFlowObservation): MagicEdenBuyIntentResolution | null {\n if (!isPureNonSettlementObservation(observation)) {\n return null;\n }\n\n if (observation.programIds.includes(MAGIC_EDEN_M2_PROGRAM_ID)) {\n return { matchedBy: \"MAGIC_EDEN_PROGRAM\" };\n }\n\n if (observation.instructionLabels.includes(BUY_INTENT_INSTRUCTION_LABEL)) {\n return { matchedBy: \"BUY_V2_INSTRUCTION\" };\n }\n\n return null;\n}\n\nexport function resolveHadeswapActivity(observation: AssetFlowObservation): HadeswapActivityResolution | null {\n if (observation.normalizedSource !== HADESWAP_SOURCE) {\n return null;\n }\n\n if (observation.hasOwnershipChange && observation.hasMeaningfulSettlement) {\n return { activityKind: \"SALE\" };\n }\n\n if (\n observation.normalizedType === \"UNKNOWN\" &&\n observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement\n ) {\n const isWithdrawal = observation.instructionLabels.some(\n (label) => label.startsWith(\"Withdraw\") || label.startsWith(\"withdraw\"),\n );\n return { activityKind: isWithdrawal ? \"POOL_WITHDRAWAL\" : \"POOL_MOVEMENT\" };\n }\n\n if (isPureNonSettlementObservation(observation)) {\n return { activityKind: \"MAINTENANCE\" };\n }\n\n return null;\n}\n\nexport interface HyperspaceInstantSellResolution {\n matchedBy: \"HYPERSPACE_LISTING_WITH_SETTLEMENT\";\n}\n\nexport function resolveHyperspaceInstantSell(\n observation: AssetFlowObservation,\n): HyperspaceInstantSellResolution | null {\n if (\n observation.normalizedSource !== \"HYPERSPACE\" ||\n observation.normalizedType !== \"NFT_LISTING\" ||\n !observation.hasMeaningfulSettlement ||\n !observation.hasOwnershipChange ||\n observation.nftTransfers.length === 0\n ) {\n return null;\n }\n\n return { matchedBy: \"HYPERSPACE_LISTING_WITH_SETTLEMENT\" };\n}\n\nexport function resolveTensorUnknownSale(observation: AssetFlowObservation): TensorUnknownSaleResolution | null {\n if (!isUnknownSaleLikeMarketplaceObservation(observation, \"TENSOR\")) {\n return null;\n }\n\n return {\n matchedBy: \"UNKNOWN_TENSOR_SETTLED_TRANSFER\",\n };\n}\n\nfunction resolveRoutedSettlement(\n observation: AssetFlowObservation,\n intermediary: string,\n buyer: string,\n): RoutedSettlementResolution | null {\n for (const transfer of observation.tx.nativeTransfers ?? []) {\n const amount = typeof transfer.amount === \"number\" ? transfer.amount : Number(transfer.amount ?? NaN);\n if (!Number.isFinite(amount) || amount < MEANINGFUL_SETTLEMENT_LAMPORTS) {\n continue;\n }\n\n const from = transfer.fromUserAccount ?? null;\n const to = transfer.toUserAccount ?? null;\n\n if (from === intermediary && to && to !== buyer && to !== intermediary) {\n return {\n intermediary,\n buyer,\n counterparty: to,\n matchedBy: \"INTERMEDIARY_OUTBOUND_SETTLEMENT\",\n };\n }\n\n if (to === intermediary && from && from !== buyer && from !== intermediary) {\n return {\n intermediary,\n buyer,\n counterparty: from,\n matchedBy: \"INTERMEDIARY_INBOUND_SETTLEMENT\",\n };\n }\n }\n\n return null;\n}\n\nexport function resolveMagicEdenLuckyBuy(observation: AssetFlowObservation): MagicEdenLuckyBuyResolution | null {\n if (\n observation.normalizedSource !== \"MAGIC_EDEN\" ||\n observation.normalizedType !== \"UNKNOWN\" ||\n !observation.hasOwnershipChange ||\n observation.nftTransfers.length < 2\n ) {\n return null;\n }\n\n const first = observation.nftTransfers[0];\n const last = observation.nftTransfers[observation.nftTransfers.length - 1];\n const intermediary = first?.toUserAccount ?? null;\n const buyer = last?.toUserAccount ?? null;\n\n if (\n !first?.fromUserAccount ||\n !intermediary ||\n !last?.fromUserAccount ||\n !buyer ||\n first.fromUserAccount === intermediary ||\n last.fromUserAccount !== intermediary ||\n buyer === intermediary\n ) {\n return null;\n }\n\n const settlement = resolveRoutedSettlement(observation, intermediary, buyer);\n if (!settlement) {\n return null;\n }\n\n return {\n intermediary,\n buyer,\n settlement,\n };\n}\n","import { classification } from \"../classify.js\";\nimport { resolveMagicEdenBuyIntent } from \"../../../../semantics/marketplace.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const magicEdenBuyIntentMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.magic-eden-buy-intent\",\n matches(observation) {\n return resolveMagicEdenBuyIntent(observation) !== null;\n },\n classify(observation) {\n if (!resolveMagicEdenBuyIntent(observation)) {\n throw new Error(\n `Magic Eden buy intent matcher classified a non-matching transaction: ${observation.tx.signature}`,\n );\n }\n\n return classification({\n family: \"MAGIC_EDEN_BUY_INTENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_magic_eden_buy_intent_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { resolveMagicEdenLuckyBuy } from \"../../../../semantics/marketplace.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const magicEdenLuckyBuyMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.magic-eden-lucky-buy\",\n matches(observation) {\n return resolveMagicEdenLuckyBuy(observation) !== null;\n },\n classify(observation) {\n if (!resolveMagicEdenLuckyBuy(observation)) {\n throw new Error(\n `Magic Eden lucky buy matcher classified a non-matching transaction: ${observation.tx.signature}`,\n );\n }\n\n return classification({\n family: \"MAGIC_EDEN_LUCKY_BUY\",\n derivedType: \"SALE\",\n matcherId: this.id,\n reason: \"matched_magic_eden_lucky_buy_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { resolveMarketplaceBid } from \"../../../../semantics/marketplace.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const marketplaceBidMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.marketplace-bid\",\n matches(observation) {\n return resolveMarketplaceBid(observation) !== null;\n },\n classify(observation) {\n if (!resolveMarketplaceBid(observation)) {\n throw new Error(`Marketplace bid matcher classified a non-matching transaction: ${observation.tx.signature}`);\n }\n\n return classification({\n family: \"MARKETPLACE_BID\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_marketplace_bid_family\",\n observation,\n overrides: { effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\" },\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { resolveMarketplaceListing } from \"../../../../semantics/marketplace.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const marketplaceListingMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.marketplace-listing\",\n matches(observation) {\n return resolveMarketplaceListing(observation) !== null;\n },\n classify(observation) {\n const resolution = resolveMarketplaceListing(observation);\n if (!resolution) {\n throw new Error(`Marketplace listing matcher classified a non-matching transaction: ${observation.tx.signature}`);\n }\n\n if (resolution.hasTrackedMovement) {\n return classification({\n family: \"MARKETPLACE_LISTING\",\n derivedType: resolution.derivedType,\n matcherId: this.id,\n reason: \"matched_marketplace_listing_family\",\n observation,\n });\n }\n\n return classification({\n family: \"MARKETPLACE_LISTING\",\n derivedType: resolution.derivedType,\n matcherId: this.id,\n reason: \"matched_marketplace_listing_family\",\n observation,\n overrides: { effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\" },\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { resolveHyperspaceInstantSell } from \"../../../../semantics/marketplace.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const hyperspaceInstantSellMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.hyperspace-instant-sell\",\n matches(observation) {\n return resolveHyperspaceInstantSell(observation) !== null;\n },\n classify(observation) {\n if (!resolveHyperspaceInstantSell(observation)) {\n throw new Error(\n `Hyperspace instant sell matcher classified a non-matching transaction: ${observation.tx.signature}`,\n );\n }\n\n return classification({\n family: \"EXPLICIT_NFT_SALE\",\n derivedType: \"SALE\",\n matcherId: this.id,\n reason: \"hyperspace_listing_matched_buy_order\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { resolveTensorUnknownSale } from \"../../../../semantics/marketplace.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const tensorUnknownSaleMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.tensor-unknown-sale\",\n matches(observation) {\n return resolveTensorUnknownSale(observation) !== null;\n },\n classify(observation) {\n if (!resolveTensorUnknownSale(observation)) {\n throw new Error(`Tensor unknown sale matcher classified a non-matching transaction: ${observation.tx.signature}`);\n }\n\n return classification({\n family: \"TENSOR_UNKNOWN_SALE\",\n derivedType: \"SALE\",\n matcherId: this.id,\n reason: \"matched_tensor_unknown_sale_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst BET_PROGRAM_ID = \"25c2ojUsK7i2AMJMmXg5F34waXTq4GcCP8r6DG7oY1Mn\";\n\nexport const betProgramActivityMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.bet-program-activity\",\n matches(observation) {\n return (\n observation.programIds.includes(BET_PROGRAM_ID) &&\n observation.nftTransfers.length === 0 &&\n !observation.hasOwnershipChange\n );\n },\n classify(observation) {\n return classification({\n family: \"BET_PROGRAM_ACTIVITY\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_bet_program_activity_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const bubblegumCompressedMintMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.bubblegum-compressed-mint\",\n matches(observation) {\n return (\n observation.normalizedType === \"COMPRESSED_NFT_MINT\" &&\n observation.normalizedSource === \"BUBBLEGUM\" &&\n observation.nftTransfers.length === 0 &&\n !observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement\n );\n },\n classify(observation) {\n return classification({\n family: \"BUBBLEGUM_COMPRESSED_MINT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_bubblegum_compressed_mint_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const candyMachineRouteMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.candy-machine-route\",\n matches(observation) {\n return (\n observation.normalizedType === \"CANDY_MACHINE_ROUTE\" &&\n observation.normalizedSource === \"CANDY_MACHINE_V3\" &&\n observation.nftTransfers.length === 0 &&\n !observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_candy_machine_route_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst CLAY_CLASS_PROGRAM_ID = \"CLAYVLFC58dsDXcYTy4vD6uK4Gu6xy6UNhUHkXsBkRfu\";\nconst CLAY_STAKING_INSTRUCTION_LABELS = new Set([\"Stake\", \"Unstake\"]);\n\nfunction getStakingDirection(instructionLabels: string[]): \"LOCK\" | \"UNLOCK\" | null {\n for (const label of instructionLabels) {\n if (label === \"Stake\") return \"LOCK\";\n if (label === \"Unstake\") return \"UNLOCK\";\n }\n return null;\n}\n\nexport const clayClassProgramActivityMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.clay-class-program-activity\",\n matches(observation) {\n if (!observation.programIds.includes(CLAY_CLASS_PROGRAM_ID)) return false;\n if (observation.hasOwnershipChange || observation.hasMeaningfulSettlement) return false;\n\n const isStaking = observation.instructionLabels.some((l) => CLAY_STAKING_INSTRUCTION_LABELS.has(l));\n if (isStaking) return true;\n\n return observation.nftTransfers.length === 0;\n },\n classify(observation) {\n const direction = getStakingDirection(observation.instructionLabels);\n\n if (direction) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: direction,\n matcherId: this.id,\n reason: direction === \"LOCK\" ? \"clay_staking_lock\" : \"clay_staking_unlock\",\n observation,\n overrides: {\n normalizedType: direction === \"LOCK\" ? \"STAKE\" : \"UNSTAKE\",\n ...(direction === \"LOCK\" ? { effect: \"NO_MINT_EFFECT\" as const } : {}),\n },\n });\n }\n\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_clay_class_program_activity_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst CORRUPT_PROGRAM_ID = \"CrUptMreyezRbdHJbeZ5sMJ9idiSuMUJpdchQzY6NFjL\";\n\nexport const corruptProgramUnwindMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.corrupt-program-unwind\",\n matches(observation) {\n return (\n observation.programIds.includes(CORRUPT_PROGRAM_ID) &&\n !observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement &&\n observation.nftTransfers.length === 0\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"non_settlement_type\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { isNonFungibleTokenStandard } from \"../../utils.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const fungibleTokenTransferNoiseMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.fungible-token-transfer-noise\",\n matches(observation) {\n return (\n observation.normalizedType === \"TRANSFER\" &&\n observation.nftTransfers.length === 0 &&\n !observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement &&\n (observation.tx.tokenTransfers ?? []).length > 0 &&\n (observation.tx.tokenTransfers ?? []).every((transfer) => !isNonFungibleTokenStandard(transfer.tokenStandard))\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_fungible_token_transfer_noise_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst FOXY_CANCEL_SWAP_LABELS = new Set([\"CancelSwapV2\", \"WithdrawPnft\"]);\n\nexport const foxyCancelSwapMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.foxy-cancel-swap\",\n matches(observation) {\n if (\n observation.normalizedSource !== \"FOXY\" ||\n observation.nftTransfers.length === 0 ||\n !observation.hasOwnershipChange\n ) {\n return false;\n }\n if (observation.normalizedType === \"CANCEL_SWAP\" || observation.normalizedType === \"REJECT_SWAP\") {\n return true;\n }\n if (\n observation.normalizedType === \"UNKNOWN\" &&\n observation.instructionLabels.some((l) => FOXY_CANCEL_SWAP_LABELS.has(l))\n ) {\n return true;\n }\n return false;\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"UNLOCK\",\n matcherId: this.id,\n reason: \"foxy_cancel_swap_escrow_return\",\n observation,\n overrides: { effect: \"NO_MINT_EFFECT\" },\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const foxyInitSwapMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.foxy-init-swap\",\n matches(observation) {\n return observation.normalizedType === \"INIT_SWAP\" && observation.normalizedSource === \"FOXY\";\n },\n classify(observation) {\n const trackedMintMoves = observation.nftTransfers.length > 0 && observation.hasOwnershipChange;\n\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: trackedMintMoves ? \"LOCK\" : \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: trackedMintMoves ? \"foxy_init_swap_escrow_deposit\" : \"matched_foxy_init_swap_family\",\n observation,\n overrides: trackedMintMoves ? { effect: \"NO_MINT_EFFECT\" } : undefined,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst FOXY_RAFFLE_PROGRAM_ID = \"9ehXDD5bnhSpFVRf99veikjgq8VajtRH7e3D9aVPLqYd\";\nconst ASSOCIATED_TOKEN_PROGRAM_ID = \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\";\n\nfunction hasRefundToPrimaryBuyer(observation: Parameters<AssetFlowClassificationMatcher[\"matches\"]>[0]): boolean {\n return (observation.tx.nativeTransfers ?? []).some(\n (transfer) => transfer.toUserAccount && transfer.toUserAccount === observation.primaryBuyer,\n );\n}\n\nexport const foxyRaffleTransferMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.foxy-raffle-transfer\",\n matches(observation) {\n return (\n observation.normalizedSource === \"ASSOCIATED_TOKEN_PROGRAM\" &&\n observation.normalizedType === \"INITIALIZE_ACCOUNT\" &&\n observation.programIds.includes(FOXY_RAFFLE_PROGRAM_ID) &&\n observation.programIds.includes(ASSOCIATED_TOKEN_PROGRAM_ID) &&\n observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement &&\n observation.nftTransfers.length > 0\n );\n },\n classify(observation) {\n if (hasRefundToPrimaryBuyer(observation)) {\n return classification({\n family: \"MARKETPLACE_LISTING\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_marketplace_listing_family\",\n observation,\n overrides: { effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\" },\n });\n }\n\n return classification({\n family: \"GENERIC_TRANSFER\",\n derivedType: \"TRANSFER\",\n matcherId: this.id,\n reason: \"ownership_change_without_settlement\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const foxySwapMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.foxy-swap\",\n matches(observation) {\n return (\n observation.normalizedType === \"SWAP\" &&\n observation.normalizedSource === \"FOXY\" &&\n observation.nftTransfers.length > 0 &&\n observation.hasOwnershipChange\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_SWAP\",\n derivedType: \"SWAP\",\n matcherId: this.id,\n reason: \"matched_foxy_swap_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { resolveHadeswapActivity } from \"../../../../semantics/marketplace.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const hadeswapActivityMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.hadeswap-activity\",\n matches(observation) {\n return resolveHadeswapActivity(observation) !== null;\n },\n classify(observation) {\n const resolution = resolveHadeswapActivity(observation);\n if (!resolution) {\n throw new Error(`Hadeswap activity matcher classified a non-matching transaction: ${observation.tx.signature}`);\n }\n\n if (resolution.activityKind === \"SALE\") {\n return classification({\n family: \"GENERIC_UNKNOWN_SALE\",\n derivedType: \"SALE\",\n matcherId: this.id,\n reason: \"derived_sale_from_unknown\",\n observation,\n });\n }\n\n if (resolution.activityKind === \"POOL_WITHDRAWAL\") {\n return classification({\n family: \"MARKETPLACE_LISTING\",\n derivedType: \"DELIST\",\n matcherId: this.id,\n reason: \"hadeswap_pool_withdrawal\",\n observation,\n });\n }\n\n if (resolution.activityKind === \"POOL_MOVEMENT\") {\n return classification({\n family: \"MARKETPLACE_LISTING\",\n derivedType: \"LIST\",\n matcherId: this.id,\n reason: \"hadeswap_pool_custody_change\",\n observation,\n });\n }\n\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"non_settlement_type\",\n observation,\n });\n },\n};\n","import type { AssetFlowObservation } from \"../types.js\";\nimport { normalizeEnhancedType } from \"../chains/solana/utils.js\";\n\nconst LOAN_PROGRAM_SOURCES = new Set([\"SHARKY_FI\", \"CITRUS\", \"RAINFI\", \"CARDINAL_RENT\", \"FRAKT\"]);\nconst LOAN_LOCK_TYPES = new Set([\"TAKE_LOAN\", \"BORROW_SOL_FOR_NFT\", \"REBORROW_SOL_FOR_NFT\", \"BORROW_PERPETUAL\"]);\nconst LOAN_UNLOCK_TYPES = new Set([\"REPAY_LOAN\", \"REPAY_PERPETUAL_LOAN\", \"REPAY\", \"UNFREEZE\"]);\nconst LOAN_UNLOCK_INSTRUCTION_LABELS = new Set([\n \"DelistCollateral\", // Citrus v2 repay\n \"Repay\", // Citrus v1 repay\n \"Repay2\", // Citrus v1 repay variant\n \"CancelRequest\", // Citrus cancel (returns NFT)\n]);\nconst LOAN_ACTIVITY_TYPES = new Set([...LOAN_LOCK_TYPES, ...LOAN_UNLOCK_TYPES, \"UNKNOWN\"]);\nconst RAW_LOAN_OVERRIDE_SOURCES = new Set([\"CITRUS\", \"SHARKY_FI\", \"FRAKT\", \"CARDINAL_RENT\"]);\nconst FORECLOSURE_SOURCES = new Set([\"SHARKY_FI\", \"CARDINAL_RENT\", \"RAINFI\"]);\nconst FORECLOSURE_TYPES = new Set([\"FORECLOSE_LOAN\", \"UNKNOWN\", \"BOT_LIQUIDATE\"]);\nconst FORECLOSURE_PROGRAM_INSTRUCTIONS = new Map<string, string>([\n [\"mid36PV7Tk5j2cZjBYArGcjMS85pHm9geYN97HsSLtg\", \"LiquidateNft\"], // Midgard lending\n [\"4tdmkuY6EStxbS6Y8s5ueznL3VPMSugrvQuDeAHGZhSt\", \"ClaimPerpetualLoanV2\"], // Banx Bonds perpetual loan claim\n]);\n\nexport interface LoanProgramActivityResolution {\n lifecycleDirection: \"LOCK\" | \"UNLOCK\";\n classificationDerivedType: \"LOCK\" | \"UNLOCK\" | \"NON_SETTLEMENT\";\n hasTrackedMintTouch: boolean;\n}\n\nexport interface LoanCollateralTransferResolution {\n derivedType: \"FORECLOSURE\" | \"UNLOCK\" | \"TRANSFER\";\n}\n\nfunction hasTrackedOwnershipChangeWithoutSettlement(observation: AssetFlowObservation): boolean {\n return observation.nftTransfers.length > 0 && observation.hasOwnershipChange && !observation.hasMeaningfulSettlement;\n}\n\nexport function isLoanLockType(type: string): boolean {\n return LOAN_LOCK_TYPES.has(type);\n}\n\nexport function isLoanUnlockType(type: string): boolean {\n return LOAN_UNLOCK_TYPES.has(type);\n}\n\nexport function isLoanActivityType(type: string): boolean {\n return LOAN_ACTIVITY_TYPES.has(type);\n}\n\nexport function isLoanProgramSource(source: string): boolean {\n return LOAN_PROGRAM_SOURCES.has(source);\n}\n\nexport function shouldAugmentRawLoanLifecycle(source: string | undefined, type: string | undefined): boolean {\n return (\n RAW_LOAN_OVERRIDE_SOURCES.has(normalizeEnhancedType(source)) && isLoanActivityType(normalizeEnhancedType(type))\n );\n}\n\nfunction hasUnlockInstructionLabel(observation: AssetFlowObservation): boolean {\n return observation.instructionLabels.some((label) => LOAN_UNLOCK_INSTRUCTION_LABELS.has(label));\n}\n\nfunction inferLoanLifecycleDirection(observation: AssetFlowObservation): \"LOCK\" | \"UNLOCK\" {\n if (isLoanUnlockType(observation.normalizedType)) return \"UNLOCK\";\n if (isLoanLockType(observation.normalizedType)) return \"LOCK\";\n if (hasUnlockInstructionLabel(observation)) return \"UNLOCK\";\n return \"LOCK\";\n}\n\nexport function resolveLoanProgramActivity(observation: AssetFlowObservation): LoanProgramActivityResolution | null {\n if (\n !isLoanProgramSource(observation.normalizedSource) ||\n !isLoanActivityType(observation.normalizedType) ||\n (observation.hasOwnershipChange && observation.hasMeaningfulSettlement)\n ) {\n return null;\n }\n\n const hasTrackedMintTouch = observation.nftTransfers.length > 0;\n const lifecycleDirection = inferLoanLifecycleDirection(observation);\n\n return {\n lifecycleDirection,\n hasTrackedMintTouch,\n classificationDerivedType: hasTrackedMintTouch ? lifecycleDirection : \"NON_SETTLEMENT\",\n };\n}\n\nexport function looksLikeProtocolCustodyRelease(observation: AssetFlowObservation): boolean {\n const transfers = observation.nftTransfers;\n if (transfers.length === 0) {\n return false;\n }\n\n if (observation.normalizedSource === \"CITRUS\" && observation.normalizedType === \"CLAIM_NFT\") {\n return true;\n }\n\n if (observation.normalizedSource !== \"FRAKT\" || observation.normalizedType !== \"UNKNOWN\" || transfers.length < 2) {\n return false;\n }\n\n const first = transfers[0];\n const last = transfers[transfers.length - 1];\n\n return Boolean(\n first?.fromUserAccount &&\n first.fromUserAccount === first.toUserAccount &&\n last?.fromUserAccount &&\n last.fromUserAccount === first.fromUserAccount &&\n last.toUserAccount &&\n last.toUserAccount !== last.fromUserAccount,\n );\n}\n\nfunction hasForeclosureProgramEvidence(observation: AssetFlowObservation): boolean {\n for (const [programId, instruction] of FORECLOSURE_PROGRAM_INSTRUCTIONS) {\n if (observation.programIds.includes(programId) && observation.instructionLabels.includes(instruction)) {\n return true;\n }\n }\n return false;\n}\n\nexport function resolveLoanCollateralTransfer(\n observation: AssetFlowObservation,\n): LoanCollateralTransferResolution | null {\n const isForeclosureLike =\n FORECLOSURE_SOURCES.has(observation.normalizedSource) && FORECLOSURE_TYPES.has(observation.normalizedType);\n const isForeclosureLikeByProgram = hasForeclosureProgramEvidence(observation);\n const isCustodyReleaseLike = looksLikeProtocolCustodyRelease(observation);\n\n if (\n !hasTrackedOwnershipChangeWithoutSettlement(observation) ||\n (!isForeclosureLike && !isForeclosureLikeByProgram && !isCustodyReleaseLike)\n ) {\n return null;\n }\n\n if (\n observation.normalizedType === \"FORECLOSE_LOAN\" ||\n observation.normalizedSource === \"CITRUS\" ||\n observation.normalizedType === \"BOT_LIQUIDATE\" ||\n isForeclosureLikeByProgram\n ) {\n return { derivedType: \"FORECLOSURE\" };\n }\n\n if (isCustodyReleaseLike) {\n return { derivedType: \"UNLOCK\" };\n }\n\n return { derivedType: \"TRANSFER\" };\n}\n","import { classification } from \"../classify.js\";\nimport { resolveLoanCollateralTransfer } from \"../../../../semantics/loan.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const loanCollateralTransferMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.loan-collateral-transfer\",\n matches(observation) {\n return resolveLoanCollateralTransfer(observation) !== null;\n },\n classify(observation) {\n const resolution = resolveLoanCollateralTransfer(observation);\n if (!resolution) {\n throw new Error(`Loan collateral matcher classified a non-matching transaction: ${observation.tx.signature}`);\n }\n\n return classification({\n family: \"GENERIC_TRANSFER\",\n derivedType: resolution.derivedType,\n matcherId: this.id,\n reason: \"matched_loan_collateral_transfer_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport { resolveLoanProgramActivity } from \"../../../../semantics/loan.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const loanProgramActivityMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.loan-program-activity\",\n matches(observation) {\n return resolveLoanProgramActivity(observation) !== null;\n },\n classify(observation) {\n const resolution = resolveLoanProgramActivity(observation);\n if (!resolution) {\n throw new Error(\n `Loan program activity matcher classified a non-matching transaction: ${observation.tx.signature}`,\n );\n }\n\n if (resolution.hasTrackedMintTouch) {\n return classification({\n family: \"LOAN_PROGRAM_ACTIVITY\",\n derivedType: resolution.classificationDerivedType,\n matcherId: this.id,\n reason: \"matched_loan_program_activity_family\",\n observation,\n overrides: { effect: \"NO_MINT_EFFECT\" },\n });\n }\n\n return classification({\n family: \"LOAN_PROGRAM_ACTIVITY\",\n derivedType: resolution.classificationDerivedType,\n matcherId: this.id,\n reason: \"matched_loan_program_activity_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst METADATA_PROGRAM_ID = \"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\";\nconst RESIZE_HELPER_PROGRAM_ID = \"F6fmDVCQfvnEq2KR8hhfZSEczfM9JK9fWbCsYJNbTGn7\";\n\nexport const metaplexResizeActivityMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.metaplex-resize-activity\",\n matches(observation) {\n return (\n observation.normalizedType === \"TRANSFER\" &&\n observation.normalizedSource === \"SYSTEM_PROGRAM\" &&\n observation.programIds.includes(METADATA_PROGRAM_ID) &&\n observation.programIds.includes(RESIZE_HELPER_PROGRAM_ID) &&\n observation.nftTransfers.length === 0 &&\n !observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_metaplex_resize_activity_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const migrateToPnftMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.migrate-to-pnft\",\n matches(observation) {\n return (\n observation.normalizedType === \"MIGRATE_TO_PNFT\" &&\n observation.normalizedSource === \"METAPLEX\" &&\n observation.nftTransfers.length === 0 &&\n !observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_migrate_to_pnft_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst TOKEN_METADATA_PROGRAM_ID = \"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\";\nconst UPDATE_INSTRUCTION_LABEL = \"Update\";\n\nexport const metaplexMetadataUpdateMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.metaplex-metadata-update\",\n matches(observation) {\n return (\n observation.normalizedType === \"UNKNOWN\" &&\n observation.normalizedSource === \"UNKNOWN\" &&\n !observation.hasOwnershipChange &&\n !observation.hasMeaningfulSettlement &&\n observation.programIds.includes(TOKEN_METADATA_PROGRAM_ID) &&\n (observation.instructionLabels.length === 0 || observation.instructionLabels.includes(UPDATE_INSTRUCTION_LABEL))\n );\n },\n classify(observation) {\n return classification({\n family: \"METAPLEX_METADATA_UPDATE\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"matched_metaplex_metadata_update_family\",\n observation,\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst SHARKY_REPAY_TYPES = new Set([\"REPAY_LOAN\", \"UNKNOWN\"]);\n\nexport const sharkyRepayLoanSaleMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.sharky-repay-loan-sale\",\n matches(observation) {\n return (\n observation.normalizedSource === \"SHARKY_FI\" &&\n SHARKY_REPAY_TYPES.has(observation.normalizedType) &&\n observation.hasOwnershipChange &&\n observation.hasMeaningfulSettlement &&\n observation.nftTransfers.length > 0\n );\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_TRANSFER\",\n derivedType: \"UNLOCK\",\n matcherId: this.id,\n reason: \"matched_loan_collateral_transfer_family\",\n observation,\n overrides: {\n normalizedType: \"REPAY_LOAN\",\n effect: \"OWNERSHIP_CHANGE_AND_SETTLEMENT\",\n shouldExtractValueMovements: true,\n },\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nexport const sharkyTakeLoanTransferMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.sharky-take-loan-transfer\",\n matches(observation) {\n return (\n observation.normalizedSource === \"SHARKY_FI\" &&\n observation.normalizedType === \"TAKE_LOAN\" &&\n observation.hasOwnershipChange &&\n observation.hasMeaningfulSettlement &&\n observation.nftTransfers.length > 0\n );\n },\n classify(observation) {\n return classification({\n family: \"LOAN_PROGRAM_ACTIVITY\",\n derivedType: \"TRANSFER\",\n matcherId: this.id,\n reason: \"sharky_take_loan_with_settlement\",\n observation,\n overrides: {\n normalizedType: \"TAKE_LOAN\",\n effect: \"OWNERSHIP_CHANGE_AND_SETTLEMENT\",\n shouldExtractValueMovements: false,\n },\n });\n },\n};\n","import { classification } from \"../classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"../types.js\";\n\nconst TLOCK_PROGRAM_ID = \"TLoCKic2wGJm7VhZKumih4Lc35fUhYqVMgA4j389Buk\";\nconst CLAIM_INSTRUCTION_LABEL = \"ClaimLegacyReceiveSol\";\n\nexport const tlockLegacyClaimMatcher: AssetFlowClassificationMatcher = {\n id: \"solana.tlock-legacy-claim\",\n matches(observation) {\n return (\n observation.hasOwnershipChange &&\n (observation.programIds.includes(TLOCK_PROGRAM_ID) ||\n observation.instructionLabels.includes(CLAIM_INSTRUCTION_LABEL))\n );\n },\n classify(observation) {\n return classification({\n family: \"TLOCK_LEGACY_CLAIM\",\n derivedType: \"TRANSFER\",\n matcherId: this.id,\n reason: \"matched_lock_claim_family\",\n observation,\n });\n },\n};\n","import { classification } from \"./classify.js\";\nimport type { AssetFlowClassificationMatcher } from \"./types.js\";\n\nconst EXPLICIT_SALE_TYPES = new Set([\"NFT_SALE\"]);\nconst EXPLICIT_SWAP_TYPES = new Set([\"SWAP\"]);\nconst NON_SETTLEMENT_TYPES = new Set([\"NFT_BID\", \"NFT_BID_CANCELLED\", \"NFT_LISTING\", \"NFT_CANCEL_LISTING\", \"NFT_MINT\"]);\n\nexport const fallbackMatchers: AssetFlowClassificationMatcher[] = [\n {\n id: \"fallback.no-nft-transfer\",\n matches(observation) {\n return observation.nftTransfers.length === 0;\n },\n classify(observation) {\n return classification({\n family: \"UNKNOWN\",\n derivedType: \"UNKNOWN\",\n matcherId: this.id,\n reason: \"no_nft_transfer\",\n observation,\n });\n },\n },\n {\n id: \"fallback.explicit-sale-type\",\n matches(observation) {\n return EXPLICIT_SALE_TYPES.has(observation.normalizedType);\n },\n classify(observation) {\n return classification({\n family: \"EXPLICIT_NFT_SALE\",\n derivedType: \"SALE\",\n matcherId: this.id,\n reason: \"explicit_sale_type\",\n observation,\n overrides: { confidence: \"medium\" },\n });\n },\n },\n {\n id: \"fallback.generic-swap\",\n matches(observation) {\n return EXPLICIT_SWAP_TYPES.has(observation.normalizedType);\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_SWAP\",\n derivedType: \"SWAP\",\n matcherId: this.id,\n reason: \"explicit_swap_type\",\n observation,\n overrides: { confidence: \"medium\" },\n });\n },\n },\n {\n id: \"fallback.non-settlement-type\",\n matches(observation) {\n return NON_SETTLEMENT_TYPES.has(observation.normalizedType);\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"non_settlement_type\",\n observation,\n overrides: {\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"REVIEW\",\n confidence: \"medium\",\n },\n });\n },\n },\n {\n id: \"fallback.no-ownership-change\",\n matches(observation) {\n return !observation.hasOwnershipChange;\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_NON_SETTLEMENT\",\n derivedType: \"NON_SETTLEMENT\",\n matcherId: this.id,\n reason: \"no_ownership_change\",\n observation,\n overrides: {\n effect: \"NO_MINT_EFFECT\",\n materialization: \"REVIEW\",\n confidence: \"low\",\n },\n });\n },\n },\n {\n id: \"fallback.derived-sale-from-unknown\",\n matches(observation) {\n return observation.hasMeaningfulSettlement;\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_UNKNOWN_SALE\",\n derivedType: \"SALE\",\n matcherId: this.id,\n reason: observation.normalizedType === \"NFT_SALE\" ? \"explicit_sale_type\" : \"derived_sale_from_unknown\",\n observation,\n overrides: { confidence: \"low\" },\n });\n },\n },\n {\n id: \"fallback.generic-transfer\",\n matches() {\n return true;\n },\n classify(observation) {\n return classification({\n family: \"GENERIC_TRANSFER\",\n derivedType: \"TRANSFER\",\n matcherId: this.id,\n reason: \"ownership_change_without_settlement\",\n observation,\n overrides: { confidence: \"low\" },\n });\n },\n },\n];\n","import type { AssetFlowClassificationMatcher, RegisteredAssetFlowClassificationMatcher } from \"./types.js\";\nimport { directNftTransferMatcher } from \"./core/direct-nft-transfer.js\";\nimport { explicitNftSaleMatcher } from \"./core/explicit-nft-sale.js\";\nimport { nftMintMatcher } from \"./core/nft-mint.js\";\nimport { magicEdenBuyIntentMatcher } from \"./marketplace/magic-eden-buy-intent.js\";\nimport { magicEdenLuckyBuyMatcher } from \"./marketplace/magic-eden-lucky-buy.js\";\nimport { marketplaceBidMatcher } from \"./marketplace/marketplace-bid.js\";\nimport { marketplaceListingMatcher } from \"./marketplace/marketplace-listing.js\";\nimport { hyperspaceInstantSellMatcher } from \"./marketplace/hyperspace-instant-sell.js\";\nimport { tensorUnknownSaleMatcher } from \"./marketplace/tensor-unknown-sale.js\";\nimport { betProgramActivityMatcher } from \"./protocol/bet-program-activity.js\";\nimport { bubblegumCompressedMintMatcher } from \"./protocol/bubblegum-compressed-mint.js\";\nimport { candyMachineRouteMatcher } from \"./protocol/candy-machine-route.js\";\nimport { clayClassProgramActivityMatcher } from \"./protocol/clay-class-program-activity.js\";\nimport { corruptProgramUnwindMatcher } from \"./protocol/corrupt-program-unwind.js\";\nimport { fungibleTokenTransferNoiseMatcher } from \"./protocol/fungible-token-transfer-noise.js\";\nimport { foxyCancelSwapMatcher } from \"./protocol/foxy-cancel-swap.js\";\nimport { foxyInitSwapMatcher } from \"./protocol/foxy-init-swap.js\";\nimport { foxyRaffleTransferMatcher } from \"./protocol/foxy-raffle-transfer.js\";\nimport { foxySwapMatcher } from \"./protocol/foxy-swap.js\";\nimport { hadeswapActivityMatcher } from \"./protocol/hadeswap-activity.js\";\nimport { loanCollateralTransferMatcher } from \"./protocol/loan-collateral-transfer.js\";\nimport { loanProgramActivityMatcher } from \"./protocol/loan-program-activity.js\";\nimport { metaplexResizeActivityMatcher } from \"./protocol/metaplex-resize-activity.js\";\nimport { migrateToPnftMatcher } from \"./protocol/migrate-to-pnft.js\";\nimport { metaplexMetadataUpdateMatcher } from \"./protocol/metaplex-metadata-update.js\";\nimport { sharkyRepayLoanSaleMatcher } from \"./protocol/sharky-repay-loan-sale.js\";\nimport { sharkyTakeLoanTransferMatcher } from \"./protocol/sharky-take-loan-transfer.js\";\nimport { tlockLegacyClaimMatcher } from \"./protocol/tlock-legacy-claim.js\";\nimport { fallbackMatchers } from \"./fallbacks.js\";\n\nfunction registerMatcher(\n matcher: AssetFlowClassificationMatcher,\n priority: number,\n): RegisteredAssetFlowClassificationMatcher {\n return {\n ...matcher,\n priority,\n };\n}\n\nfunction registerMatchers(\n entries: Array<readonly [AssetFlowClassificationMatcher, number]>,\n): RegisteredAssetFlowClassificationMatcher[] {\n return entries.map(([matcher, priority]) => registerMatcher(matcher, priority));\n}\n\n// Rule priority is explicit. Higher priority wins.\n// Rule order is still preserved for readability, but selection should no longer rely on raw array position.\n\nexport const protocolMatchers: RegisteredAssetFlowClassificationMatcher[] = registerMatchers([\n [tlockLegacyClaimMatcher, 1000],\n [bubblegumCompressedMintMatcher, 990],\n [betProgramActivityMatcher, 980],\n [candyMachineRouteMatcher, 970],\n [clayClassProgramActivityMatcher, 960],\n [corruptProgramUnwindMatcher, 950],\n [fungibleTokenTransferNoiseMatcher, 940],\n [foxyCancelSwapMatcher, 930],\n [foxyInitSwapMatcher, 920],\n [foxyRaffleTransferMatcher, 910],\n [foxySwapMatcher, 900],\n [hadeswapActivityMatcher, 890],\n [loanCollateralTransferMatcher, 880],\n [loanProgramActivityMatcher, 870],\n [migrateToPnftMatcher, 860],\n [sharkyTakeLoanTransferMatcher, 855],\n [sharkyRepayLoanSaleMatcher, 850],\n [metaplexResizeActivityMatcher, 840],\n [metaplexMetadataUpdateMatcher, 830],\n] as const);\n\nexport const coreAndMarketplaceMatchers: RegisteredAssetFlowClassificationMatcher[] = registerMatchers([\n [nftMintMatcher, 700],\n [directNftTransferMatcher, 690],\n [explicitNftSaleMatcher, 680],\n [magicEdenLuckyBuyMatcher, 670],\n [hyperspaceInstantSellMatcher, 665],\n [tensorUnknownSaleMatcher, 660],\n [marketplaceListingMatcher, 650],\n [magicEdenBuyIntentMatcher, 640],\n [marketplaceBidMatcher, 630],\n] as const);\n\nexport const assetFlowMatchers: RegisteredAssetFlowClassificationMatcher[] = [\n ...protocolMatchers,\n ...coreAndMarketplaceMatchers,\n ...registerMatchers(fallbackMatchers.map((matcher, index) => [matcher, 100 - index] as const)),\n];\n","import type { AssetFlowObservation } from \"../types.js\";\nimport type { RegisteredAssetFlowClassificationMatcher } from \"./types.js\";\n\nexport function getMatchingAssetFlowMatchers(\n matchers: RegisteredAssetFlowClassificationMatcher[],\n observation: AssetFlowObservation,\n): RegisteredAssetFlowClassificationMatcher[] {\n return matchers\n .filter((matcher) => matcher.matches(observation))\n .sort((left, right) =>\n right.priority !== left.priority ? right.priority - left.priority : left.id.localeCompare(right.id),\n );\n}\n\nexport function selectAssetFlowMatcher(\n matchers: RegisteredAssetFlowClassificationMatcher[],\n observation: AssetFlowObservation,\n): RegisteredAssetFlowClassificationMatcher {\n const matching = getMatchingAssetFlowMatchers(matchers, observation);\n const selected = matching[0];\n\n if (!selected) {\n throw new Error(`No matcher matched transaction ${observation.tx.signature} for mint ${observation.mint}`);\n }\n\n const ambiguous = matching.filter((matcher) => matcher.priority === selected.priority && matcher.id !== selected.id);\n if (ambiguous.length > 0) {\n throw new Error(\n `Ambiguous matcher selection for transaction ${observation.tx.signature} and mint ${observation.mint}: ${[selected.id, ...ambiguous.map((matcher) => matcher.id)].join(\", \")}`,\n );\n }\n\n return selected;\n}\n","import type { AssetFlowObservation, HeliusEnhancedTx } from \"./types.js\";\nimport { buildTransactionFacts } from \"./facts/build-facts.js\";\nimport type { AssetFlowTransactionFacts } from \"./facts/types.js\";\n\nexport function observationFromFacts(facts: AssetFlowTransactionFacts): AssetFlowObservation {\n return {\n mint: facts.mint,\n tx: facts.tx,\n normalizedType: facts.normalizedType,\n normalizedSource: facts.normalizedSource,\n nftTransfers: facts.nftTransfers,\n hasOwnershipChange: facts.hasOwnershipChange,\n hasMeaningfulSettlement: facts.hasMeaningfulSettlement,\n primaryBuyer: facts.primaryBuyer,\n primarySeller: facts.primarySeller,\n programIds: facts.programIds,\n instructionLabels: facts.instructionLabels,\n };\n}\n\nexport function observeEnhancedTransactionForMint(tx: HeliusEnhancedTx, mint: string): AssetFlowObservation {\n return observationFromFacts(buildTransactionFacts(tx, mint));\n}\n","import { buildTransactionFacts } from \"./facts/build-facts.js\";\nimport type { AssetFlowTransactionFacts } from \"./facts/types.js\";\nimport { assetFlowMatchers } from \"./matchers/registry.js\";\nimport { getMatchingAssetFlowMatchers, selectAssetFlowMatcher } from \"./matchers/select.js\";\nimport type { RegisteredAssetFlowClassificationMatcher } from \"./matchers/types.js\";\nimport { observationFromFacts } from \"./observation.js\";\nimport type { AssetFlowObservation, AssetFlowTxClassification, HeliusEnhancedTx } from \"./types.js\";\n\nexport interface AssetFlowMatcherExplanation {\n matcher: RegisteredAssetFlowClassificationMatcher;\n classification: AssetFlowTxClassification;\n}\n\nexport interface AssetFlowClassificationExplanation {\n facts: AssetFlowTransactionFacts;\n observation: AssetFlowObservation;\n candidates: AssetFlowMatcherExplanation[];\n selected: AssetFlowMatcherExplanation;\n classification: AssetFlowTxClassification;\n}\n\nfunction buildMatcherExplanation(\n matcher: RegisteredAssetFlowClassificationMatcher,\n observation: AssetFlowObservation,\n): AssetFlowMatcherExplanation {\n return {\n matcher,\n classification: matcher.classify(observation),\n };\n}\n\nexport function explainEnhancedTransactionForMint(\n tx: HeliusEnhancedTx,\n mint: string,\n): AssetFlowClassificationExplanation {\n const facts = buildTransactionFacts(tx, mint);\n const observation = observationFromFacts(facts);\n const matchingMatchers = getMatchingAssetFlowMatchers(assetFlowMatchers, observation);\n const selectedMatcher = selectAssetFlowMatcher(assetFlowMatchers, observation);\n const candidates = matchingMatchers.map((matcher) => buildMatcherExplanation(matcher, observation));\n const selected =\n candidates.find((candidate) => candidate.matcher.id === selectedMatcher.id) ??\n buildMatcherExplanation(selectedMatcher, observation);\n\n return {\n facts,\n observation,\n candidates,\n selected,\n classification: selected.classification,\n };\n}\n","import { explainEnhancedTransactionForMint } from \"./explain.js\";\nimport type { AssetFlowTxClassification, HeliusEnhancedTx } from \"./types.js\";\n\nexport function classifyEnhancedTransactionForMint(tx: HeliusEnhancedTx, mint: string): AssetFlowTxClassification {\n return explainEnhancedTransactionForMint(tx, mint).classification;\n}\n","import { classifyEnhancedTransactionForMint } from \"./classifier.js\";\nimport { observeEnhancedTransactionForMint } from \"./observation.js\";\nimport type { AssetFlowObservation, AssetFlowTxClassification, HeliusEnhancedTx } from \"./types.js\";\nimport { normalizeEnhancedType } from \"./utils.js\";\n\nconst DEFAULT_CLUSTER_SAMPLE_LIMIT = 5;\n\nexport interface AssetFlowCoverageReviewCandidate {\n mint: string;\n signature: string;\n timestamp: number | null;\n source: string;\n normalizedType: string;\n matcherId: string;\n family: AssetFlowTxClassification[\"family\"];\n effect: AssetFlowTxClassification[\"effect\"];\n materialization: AssetFlowTxClassification[\"materialization\"];\n confidence: AssetFlowTxClassification[\"confidence\"];\n reason: AssetFlowTxClassification[\"reason\"];\n hasOwnershipChange: boolean;\n hasMeaningfulSettlement: boolean;\n programIds: string[];\n instructionLabels: string[];\n}\n\nexport interface AssetFlowCoverageCluster {\n fingerprint: string;\n matcherId: string;\n family: AssetFlowTxClassification[\"family\"];\n effect: AssetFlowTxClassification[\"effect\"];\n materialization: AssetFlowTxClassification[\"materialization\"];\n confidence: AssetFlowTxClassification[\"confidence\"];\n normalizedType: string;\n source: string;\n reason: AssetFlowTxClassification[\"reason\"];\n hasOwnershipChange: boolean;\n hasMeaningfulSettlement: boolean;\n programIds: string[];\n instructionLabels: string[];\n count: number;\n sampleSignatures: string[];\n sampleMints: string[];\n}\n\nexport interface AssetFlowCoverageScanResult {\n mint: string;\n transactionsScanned: number;\n reviewCandidates: AssetFlowCoverageReviewCandidate[];\n clusters: AssetFlowCoverageCluster[];\n}\n\nfunction shouldReviewClassification(\n _observation: AssetFlowObservation,\n classification: AssetFlowTxClassification,\n): boolean {\n if (classification.materialization !== \"REVIEW\" && classification.confidence === \"high\") {\n return false;\n }\n\n return true;\n}\n\nfunction buildCoverageFingerprint(\n candidate: Omit<AssetFlowCoverageReviewCandidate, \"mint\" | \"signature\" | \"timestamp\">,\n): string {\n return JSON.stringify({\n matcherId: candidate.matcherId,\n family: candidate.family,\n effect: candidate.effect,\n materialization: candidate.materialization,\n normalizedType: candidate.normalizedType,\n source: candidate.source,\n reason: candidate.reason,\n hasOwnershipChange: candidate.hasOwnershipChange,\n hasMeaningfulSettlement: candidate.hasMeaningfulSettlement,\n programIds: candidate.programIds,\n instructionLabels: candidate.instructionLabels,\n });\n}\n\nexport function collectCoverageReviewCandidates(\n transactions: HeliusEnhancedTx[],\n mint: string,\n): AssetFlowCoverageReviewCandidate[] {\n const candidates: AssetFlowCoverageReviewCandidate[] = [];\n\n for (const tx of transactions) {\n const observation = observeEnhancedTransactionForMint(tx, mint);\n const classification = classifyEnhancedTransactionForMint(tx, mint);\n if (!shouldReviewClassification(observation, classification)) {\n continue;\n }\n\n candidates.push({\n mint,\n signature: tx.signature,\n timestamp: typeof tx.timestamp === \"number\" && Number.isFinite(tx.timestamp) ? tx.timestamp : null,\n source: normalizeEnhancedType(tx.source) || \"UNKNOWN\",\n normalizedType: classification.normalizedType || \"UNKNOWN\",\n matcherId: classification.matcherId,\n family: classification.family,\n effect: classification.effect,\n materialization: classification.materialization,\n confidence: classification.confidence,\n reason: classification.reason,\n hasOwnershipChange: observation.hasOwnershipChange,\n hasMeaningfulSettlement: observation.hasMeaningfulSettlement,\n programIds: observation.programIds,\n instructionLabels: observation.instructionLabels,\n });\n }\n\n return candidates;\n}\n\nexport function clusterCoverageReviewCandidates(\n candidates: AssetFlowCoverageReviewCandidate[],\n sampleLimit = DEFAULT_CLUSTER_SAMPLE_LIMIT,\n): AssetFlowCoverageCluster[] {\n const clusters = new Map<\n string,\n AssetFlowCoverageCluster & {\n seenSignatures: Set<string>;\n seenMints: Set<string>;\n }\n >();\n\n const sortedCandidates = [...candidates].sort((a, b) => {\n const aTimestamp = a.timestamp ?? 0;\n const bTimestamp = b.timestamp ?? 0;\n if (aTimestamp !== bTimestamp) return aTimestamp - bTimestamp;\n return a.signature.localeCompare(b.signature);\n });\n\n for (const candidate of sortedCandidates) {\n const { timestamp: _timestamp, ...fingerprintInput } = candidate;\n const fingerprint = buildCoverageFingerprint(fingerprintInput);\n const existing = clusters.get(fingerprint);\n\n if (!existing) {\n clusters.set(fingerprint, {\n fingerprint,\n matcherId: candidate.matcherId,\n family: candidate.family,\n effect: candidate.effect,\n materialization: candidate.materialization,\n confidence: candidate.confidence,\n normalizedType: candidate.normalizedType,\n source: candidate.source,\n reason: candidate.reason,\n hasOwnershipChange: candidate.hasOwnershipChange,\n hasMeaningfulSettlement: candidate.hasMeaningfulSettlement,\n programIds: candidate.programIds,\n instructionLabels: candidate.instructionLabels,\n count: 1,\n sampleSignatures: [candidate.signature],\n sampleMints: [candidate.mint],\n seenSignatures: new Set([candidate.signature]),\n seenMints: new Set([candidate.mint]),\n });\n continue;\n }\n\n existing.count += 1;\n if (!existing.seenSignatures.has(candidate.signature) && existing.sampleSignatures.length < sampleLimit) {\n existing.sampleSignatures.push(candidate.signature);\n existing.seenSignatures.add(candidate.signature);\n }\n if (!existing.seenMints.has(candidate.mint) && existing.sampleMints.length < sampleLimit) {\n existing.sampleMints.push(candidate.mint);\n existing.seenMints.add(candidate.mint);\n }\n }\n\n return Array.from(clusters.values())\n .map(({ seenSignatures: _seenSignatures, seenMints: _seenMints, ...cluster }) => cluster)\n .sort((a, b) => {\n if (a.count !== b.count) return b.count - a.count;\n if (a.matcherId !== b.matcherId) return a.matcherId.localeCompare(b.matcherId);\n return a.normalizedType.localeCompare(b.normalizedType);\n });\n}\n\nexport function scanTransactionsForCoverage(\n transactions: HeliusEnhancedTx[],\n mint: string,\n): AssetFlowCoverageScanResult {\n const reviewCandidates = collectCoverageReviewCandidates(transactions, mint);\n return {\n mint,\n transactionsScanned: transactions.length,\n reviewCandidates,\n clusters: clusterCoverageReviewCandidates(reviewCandidates),\n };\n}\n","import type { ExtractedValueMovement, HeliusEnhancedTx, HeliusTokenTransfer } from \"../types.js\";\n\nconst LAMPORTS_PER_SOL = 1_000_000_000;\nconst SOL_SETTLEMENT_EPSILON = 0.000001;\n\nexport interface SaleProtocolResolutionFlow {\n fromAddress: string | null;\n toAddress: string | null;\n transferIndex: number;\n tokenStandard: string | null;\n derivedType: \"SALE\" | \"LIST\";\n}\n\nexport interface SaleProtocolResolution {\n kind: \"DIRECT_FLOW\" | \"POOL_SALE\" | \"ESCROW_SALE\";\n flows: SaleProtocolResolutionFlow[];\n}\n\ninterface SaleValueMovementTaggingParams {\n tx: Pick<HeliusEnhancedTx, \"signature\" | \"slot\" | \"timestamp\" | \"type\" | \"source\" | \"description\">;\n movements: ExtractedValueMovement[];\n rentThreshold: number;\n}\n\nfunction isSameAmount(left: number, right: number): boolean {\n return Math.abs(left - right) <= SOL_SETTLEMENT_EPSILON;\n}\n\nfunction lamportsFromSol(amount: number): string | null {\n if (!Number.isFinite(amount) || amount <= 0) {\n return null;\n }\n\n return Math.round(amount * LAMPORTS_PER_SOL).toString();\n}\n\nexport function parseQuotedPriceFromDescription(\n description: string | undefined,\n): { amount: number; currency: string } | null {\n if (!description) {\n return null;\n }\n\n const match = description.match(/\\bfor\\s+([0-9]+(?:\\.[0-9]+)?)\\s+([A-Z]{2,10})\\b/i);\n if (!match) {\n return null;\n }\n\n const amount = Number(match[1]);\n const currency = match[2]?.toUpperCase();\n\n if (!Number.isFinite(amount) || amount <= 0 || !currency) {\n return null;\n }\n\n return { amount, currency };\n}\n\nexport function parseSaleParticipantsFromDescription(description: string | undefined): {\n seller: string;\n buyer: string;\n} | null {\n if (!description) {\n return null;\n }\n\n const match = description.match(/^(\\S+)\\s+sold\\b.+?\\s+to\\s+(\\S+)\\s+for\\b/i);\n if (!match) {\n return null;\n }\n\n const seller = match[1]?.trim();\n const buyer = match[2]?.trim();\n if (!seller || !buyer) {\n return null;\n }\n\n return { seller, buyer };\n}\n\nexport function parseSwapInitiatorFromDescription(description: string | undefined): string | null {\n if (!description) {\n return null;\n }\n\n const match = description.match(/^(\\S+)\\s+swapped\\b/i);\n return match?.[1]?.trim() ?? null;\n}\n\nexport function inferSaleSellerFromSettlement(\n tx: HeliusEnhancedTx,\n buyerAddress: string | null,\n escrowAddress: string | null,\n describedSellerAddress: string | null = null,\n): string | null {\n let bestRecipient: { address: string; amount: number } | null = null;\n const transfers = tx.nativeTransfers ?? [];\n\n for (const transfer of transfers) {\n const recipient = transfer.toUserAccount?.trim();\n const amount = typeof transfer.amount === \"number\" ? transfer.amount : Number(transfer.amount ?? NaN);\n\n if (!recipient || !Number.isFinite(amount) || amount <= 0) {\n continue;\n }\n\n if (buyerAddress && recipient === buyerAddress) {\n continue;\n }\n\n if (escrowAddress && recipient === escrowAddress) {\n continue;\n }\n\n if (!bestRecipient || amount > bestRecipient.amount) {\n bestRecipient = { address: recipient, amount };\n }\n }\n\n if (!bestRecipient) {\n return null;\n }\n\n // Some marketplace settlements pay an intermediary account first, which then\n // forwards the seller proceeds in the same transaction.\n const forwardedTransfers = transfers\n .filter((transfer) => transfer.fromUserAccount?.trim() === bestRecipient.address)\n .map((transfer) => ({\n address: transfer.toUserAccount?.trim() ?? null,\n amount: typeof transfer.amount === \"number\" ? transfer.amount : Number(transfer.amount ?? NaN),\n }))\n .filter(\n (transfer): transfer is { address: string; amount: number } =>\n Boolean(transfer.address) &&\n Number.isFinite(transfer.amount) &&\n transfer.amount > 0 &&\n transfer.address !== buyerAddress &&\n transfer.address !== escrowAddress,\n );\n\n const describedSellerForward = describedSellerAddress\n ? forwardedTransfers.find((transfer) => transfer.address === describedSellerAddress && transfer.amount > 0)\n : null;\n\n if (describedSellerForward) {\n return describedSellerForward.address;\n }\n\n const forwardedRecipient = forwardedTransfers.find((transfer) => transfer.amount >= bestRecipient.amount * 0.999);\n\n if (forwardedRecipient) {\n return forwardedRecipient.address;\n }\n\n return bestRecipient.address;\n}\n\nexport function annotateSaleValueMovements(params: SaleValueMovementTaggingParams): ExtractedValueMovement[] {\n const { tx, movements, rentThreshold } = params;\n const quotedPrice = parseQuotedPriceFromDescription(tx.description);\n const significantSolIndexes = movements\n .map((movement, index) => ({ movement, index }))\n .filter(\n ({ movement }) => movement.currency === \"SOL\" && movement.movementKind === \"NATIVE\" && movement.role !== \"RENT\",\n )\n .sort((left, right) => right.movement.amount - left.movement.amount);\n\n if (quotedPrice?.currency === \"SOL\") {\n const observedGross = significantSolIndexes.find(({ movement }) =>\n isSameAmount(movement.amount, quotedPrice.amount),\n );\n if (observedGross) {\n observedGross.movement.role = \"SALE_GROSS\";\n observedGross.movement.confidence = \"HIGH\";\n } else {\n movements.push({\n signature: tx.signature,\n slot: tx.slot ?? null,\n timestamp: tx.timestamp ?? 0,\n heliusType: tx.type ?? \"UNKNOWN\",\n source: tx.source ?? \"UNKNOWN\",\n movementKind: \"NATIVE\",\n currency: \"SOL\",\n amount: quotedPrice.amount,\n rawAmount: lamportsFromSol(quotedPrice.amount),\n decimals: 9,\n fromAddress: null,\n toAddress: null,\n movementIndex: -1,\n tokenStandard: null,\n role: \"SALE_GROSS\",\n confidence: \"HIGH\",\n isSynthetic: true,\n });\n }\n } else if (significantSolIndexes[0]) {\n significantSolIndexes[0].movement.role = \"SALE_GROSS\";\n significantSolIndexes[0].movement.confidence = \"MEDIUM\";\n }\n\n const remainingSignificant = movements\n .map((movement, index) => ({ movement, index }))\n .filter(\n ({ movement }) =>\n movement.currency === \"SOL\" &&\n movement.movementKind === \"NATIVE\" &&\n movement.role === \"UNKNOWN\" &&\n movement.amount >= rentThreshold,\n )\n .sort((left, right) => right.movement.amount - left.movement.amount);\n\n if (quotedPrice?.currency === \"SOL\" && remainingSignificant[0]) {\n remainingSignificant[0].movement.role = \"SELLER_PROCEEDS\";\n remainingSignificant[0].movement.confidence = \"MEDIUM\";\n remainingSignificant.shift();\n }\n\n if (remainingSignificant[0]) {\n remainingSignificant[0].movement.role = \"ROYALTY\";\n remainingSignificant[0].movement.confidence = quotedPrice?.currency === \"SOL\" ? \"MEDIUM\" : \"LOW\";\n remainingSignificant.shift();\n }\n\n for (const { movement } of remainingSignificant) {\n movement.role = \"MARKETPLACE_FEE\";\n movement.confidence = quotedPrice?.currency === \"SOL\" ? \"MEDIUM\" : \"LOW\";\n }\n\n return movements;\n}\n\ninterface ResolveSaleProtocolSemanticsParams {\n tx: HeliusEnhancedTx;\n fromAddress: string | null;\n toAddress: string | null;\n firstTransfer: HeliusTokenTransfer;\n lastTransfer: HeliusTokenTransfer;\n intermediaries?: Set<string>;\n}\n\nfunction resolveSyntheticSeller(params: {\n describedSeller: string | null;\n describedBuyer: string | null;\n settlementSeller: string | null;\n escrowAddress: string | null;\n buyerAddress: string | null;\n}): string | null {\n const { describedSeller, describedBuyer, settlementSeller, escrowAddress, buyerAddress } = params;\n\n if (describedSeller && describedSeller !== escrowAddress && describedSeller !== buyerAddress) {\n if (\n settlementSeller &&\n settlementSeller !== describedSeller &&\n settlementSeller !== escrowAddress &&\n settlementSeller !== buyerAddress\n ) {\n return settlementSeller;\n }\n return describedSeller;\n }\n\n if (describedSeller && describedSeller === escrowAddress) {\n return null;\n }\n\n if (describedBuyer && settlementSeller && settlementSeller !== escrowAddress && settlementSeller !== buyerAddress) {\n return settlementSeller;\n }\n\n return null;\n}\n\nfunction canSynthesizeEscrowEntry(params: {\n syntheticSeller: string | null;\n escrowAddress: string | null;\n buyerAddress: string | null;\n describedBuyer: string | null;\n intermediaries?: Set<string>;\n}): params is {\n syntheticSeller: string;\n escrowAddress: string;\n buyerAddress: string;\n describedBuyer: string | null;\n intermediaries?: Set<string>;\n} {\n return Boolean(\n params.syntheticSeller &&\n params.escrowAddress &&\n params.buyerAddress &&\n (!params.describedBuyer ||\n params.describedBuyer === params.buyerAddress ||\n params.intermediaries?.has(params.describedBuyer)),\n );\n}\n\nexport function resolveSaleProtocolSemantics(params: ResolveSaleProtocolSemanticsParams): SaleProtocolResolution {\n const { tx, fromAddress, toAddress, firstTransfer, lastTransfer, intermediaries } = params;\n const saleParticipants = parseSaleParticipantsFromDescription(tx.description);\n const describedSeller = saleParticipants?.seller ?? null;\n const describedBuyer = saleParticipants?.buyer ?? null;\n const listingTokenStandard = firstTransfer.tokenStandard ?? lastTransfer.tokenStandard ?? null;\n const saleTokenStandard = lastTransfer.tokenStandard ?? firstTransfer.tokenStandard ?? null;\n\n const buyerInTransfers = describedBuyer\n ? (tx.tokenTransfers ?? []).some((t) => t.fromUserAccount === describedBuyer || t.toUserAccount === describedBuyer)\n : false;\n const isPoolSale =\n describedBuyer &&\n toAddress &&\n describedBuyer !== toAddress &&\n describedBuyer !== fromAddress &&\n describedSeller === fromAddress &&\n buyerInTransfers;\n\n if (isPoolSale) {\n return {\n kind: \"POOL_SALE\",\n flows: [\n {\n fromAddress,\n toAddress: describedBuyer,\n transferIndex: 0,\n tokenStandard: saleTokenStandard,\n derivedType: \"SALE\",\n },\n ],\n };\n }\n\n const settlementSeller = inferSaleSellerFromSettlement(tx, toAddress, fromAddress, describedSeller);\n const syntheticSeller = resolveSyntheticSeller({\n describedSeller,\n describedBuyer,\n settlementSeller,\n escrowAddress: fromAddress,\n buyerAddress: toAddress,\n });\n\n if (\n canSynthesizeEscrowEntry({\n syntheticSeller,\n escrowAddress: fromAddress,\n buyerAddress: toAddress,\n describedBuyer,\n intermediaries,\n })\n ) {\n return {\n kind: \"ESCROW_SALE\",\n flows: [\n {\n fromAddress: syntheticSeller,\n toAddress: fromAddress,\n transferIndex: 0,\n tokenStandard: listingTokenStandard,\n derivedType: \"LIST\",\n },\n {\n fromAddress,\n toAddress,\n transferIndex: 1,\n tokenStandard: saleTokenStandard,\n derivedType: \"SALE\",\n },\n ],\n };\n }\n\n return {\n kind: \"DIRECT_FLOW\",\n flows: [\n {\n fromAddress,\n toAddress,\n transferIndex: 0,\n tokenStandard: saleTokenStandard,\n derivedType: \"SALE\",\n },\n ],\n };\n}\n","import { PERSIST_DERIVED_TYPES } from \"./matchers/classify.js\";\nimport {\n inferSaleSellerFromSettlement,\n parseSwapInitiatorFromDescription,\n resolveSaleProtocolSemantics,\n} from \"../../semantics/sale.js\";\nimport type { AssetFlowTxClassification, ExtractedMintFlow, HeliusEnhancedTx, HeliusTokenTransfer } from \"./types.js\";\nimport { normalizeEnhancedType } from \"./utils.js\";\n\nexport type MintFlowProtocolEventKind = \"DIRECT_FLOW\" | \"POOL_SALE\" | \"ESCROW_SALE\" | \"SWAP_REASSIGN\";\n\nexport interface MintFlowProtocolEventFlow {\n fromAddress: string | null;\n toAddress: string | null;\n transferIndex: number;\n tokenStandard: string | null;\n derivedType: ExtractedMintFlow[\"derivedType\"];\n}\n\nexport interface MintFlowProtocolEvent {\n kind: MintFlowProtocolEventKind;\n tx: HeliusEnhancedTx;\n timestamp: number;\n classification: AssetFlowTxClassification | null;\n flows: MintFlowProtocolEventFlow[];\n}\n\nfunction deriveMintFlowType(classification: AssetFlowTxClassification | null, normalizedType: string) {\n if (normalizedType === \"NFT_MINT\") {\n return \"MINT\" as const;\n }\n\n if (!classification || classification.materialization !== \"PERSIST_FLOW\") {\n return \"UNKNOWN\" as const;\n }\n\n if (PERSIST_DERIVED_TYPES.has(classification.derivedType)) {\n return classification.derivedType as ExtractedMintFlow[\"derivedType\"];\n }\n\n return \"UNKNOWN\" as const;\n}\n\nfunction getMintTransfers(tx: HeliusEnhancedTx, mint: string): HeliusTokenTransfer[] {\n return (tx.tokenTransfers ?? []).filter((transfer) => {\n if (transfer.mint !== mint) return false;\n const numericAmount =\n typeof transfer.tokenAmount === \"number\" ? transfer.tokenAmount : Number(transfer.tokenAmount ?? NaN);\n return Number.isFinite(numericAmount) && numericAmount > 0;\n });\n}\n\nfunction getTransferEndpoints(mintTransfers: HeliusTokenTransfer[]) {\n const firstTransfer = mintTransfers.find((transfer) => transfer.fromUserAccount) ?? mintTransfers[0]!;\n const lastTransfer =\n [...mintTransfers].reverse().find((transfer) => transfer.toUserAccount) ?? mintTransfers[mintTransfers.length - 1]!;\n\n let fromAddress = firstTransfer.fromUserAccount ?? null;\n let toAddress = lastTransfer.toUserAccount ?? null;\n const intermediaries = new Set<string>();\n\n if (mintTransfers.length > 1 && fromAddress && toAddress && fromAddress === toAddress) {\n const fromSet = new Set<string>();\n const toSet = new Set<string>();\n for (const t of mintTransfers) {\n if (t.fromUserAccount) fromSet.add(t.fromUserAccount);\n if (t.toUserAccount) toSet.add(t.toUserAccount);\n }\n const netFrom = [...fromSet].filter((addr) => !toSet.has(addr));\n const netTo = [...toSet].filter((addr) => !fromSet.has(addr));\n if (netFrom.length === 1 && netTo.length === 1) {\n fromAddress = netFrom[0]!;\n toAddress = netTo[0]!;\n for (const addr of fromSet) {\n if (toSet.has(addr)) intermediaries.add(addr);\n }\n }\n }\n\n return {\n firstTransfer,\n lastTransfer,\n fromAddress,\n toAddress,\n tokenStandard: lastTransfer.tokenStandard ?? firstTransfer.tokenStandard ?? null,\n intermediaries,\n };\n}\n\nexport function interpretMintFlowProtocolEvent(params: {\n tx: HeliusEnhancedTx;\n mint: string;\n getClassification: (tx: HeliusEnhancedTx) => AssetFlowTxClassification;\n}): MintFlowProtocolEvent | null {\n const { tx, mint, getClassification } = params;\n const timestamp = tx.timestamp;\n if (typeof timestamp !== \"number\" || !Number.isFinite(timestamp) || timestamp <= 0) return null;\n\n const normalizedType = normalizeEnhancedType(tx.type);\n const classification = normalizedType === \"NFT_MINT\" ? null : getClassification(tx);\n const derivedType = deriveMintFlowType(classification, normalizedType);\n if (normalizedType !== \"NFT_MINT\" && derivedType === \"UNKNOWN\") return null;\n\n const mintTransfers = getMintTransfers(tx, mint);\n if (mintTransfers.length === 0) return null;\n\n const { firstTransfer, lastTransfer, fromAddress, toAddress, tokenStandard, intermediaries } =\n getTransferEndpoints(mintTransfers);\n if (derivedType !== \"MINT\" && derivedType !== \"LOCK\" && derivedType !== \"UNLOCK\" && fromAddress === toAddress) {\n return null;\n }\n\n if (derivedType === \"SWAP\" && fromAddress && toAddress && fromAddress !== toAddress) {\n const swapInitiator = parseSwapInitiatorFromDescription(tx.description);\n if (swapInitiator && toAddress === swapInitiator && fromAddress !== swapInitiator) {\n const otherTransfer = (tx.tokenTransfers ?? []).find(\n (transfer) => transfer.mint !== mint && transfer.fromUserAccount === swapInitiator,\n );\n const swapPartner = otherTransfer?.toUserAccount ?? null;\n\n const ESCROW_TRACKED_SWAP_MATCHERS = new Set([\"solana.foxy-swap\"]);\n const isEscrowTracked = classification && ESCROW_TRACKED_SWAP_MATCHERS.has(classification.matcherId);\n if (swapPartner || !isEscrowTracked) {\n const resolvedPartner = swapPartner ?? inferSaleSellerFromSettlement(tx, swapInitiator, fromAddress);\n return {\n kind: \"SWAP_REASSIGN\",\n tx,\n timestamp,\n classification,\n flows: [\n {\n fromAddress: resolvedPartner ?? fromAddress,\n toAddress: swapInitiator,\n transferIndex: 0,\n tokenStandard,\n derivedType,\n },\n ],\n };\n }\n }\n }\n\n if (derivedType === \"SALE\") {\n const resolution = resolveSaleProtocolSemantics({\n tx,\n fromAddress,\n toAddress,\n firstTransfer,\n lastTransfer,\n intermediaries,\n });\n\n return {\n kind: resolution.kind,\n tx,\n timestamp,\n classification,\n flows: resolution.flows,\n };\n }\n\n return {\n kind: \"DIRECT_FLOW\",\n tx,\n timestamp,\n classification,\n flows: [\n {\n fromAddress,\n toAddress,\n transferIndex: 0,\n tokenStandard,\n derivedType,\n },\n ],\n };\n}\n","import type { ExtractedMintFlow, ExtractedValueMovement } from \"../types.js\";\n\nexport function buildMintFlowCanonicalKey(flow: ExtractedMintFlow): string {\n return [\n flow.signature,\n flow.transferIndex,\n flow.fromAddress ?? \"none\",\n flow.toAddress ?? \"none\",\n flow.heliusType,\n ].join(\":\");\n}\n\nexport function compareMintFlowsByCanonicalOrder(a: ExtractedMintFlow, b: ExtractedMintFlow): number {\n if (a.timestamp !== b.timestamp) return a.timestamp - b.timestamp;\n if ((a.slot ?? 0) !== (b.slot ?? 0)) return (a.slot ?? 0) - (b.slot ?? 0);\n\n if (a.signature === b.signature && a.transferIndex !== b.transferIndex) {\n return a.transferIndex - b.transferIndex;\n }\n\n if (a.toAddress && a.toAddress === b.fromAddress && b.toAddress !== a.fromAddress) return -1;\n if (b.toAddress && b.toAddress === a.fromAddress && a.toAddress !== b.fromAddress) return 1;\n\n return 0;\n}\n\nexport function canonicalizeMintFlows(flows: ExtractedMintFlow[]): ExtractedMintFlow[] {\n const deduped = new Map<string, ExtractedMintFlow>();\n\n for (const flow of flows) {\n const key = buildMintFlowCanonicalKey(flow);\n if (!deduped.has(key)) {\n deduped.set(key, flow);\n }\n }\n\n return Array.from(deduped.values())\n .map((flow, index) => ({ flow, index }))\n .sort((left, right) => compareMintFlowsByCanonicalOrder(left.flow, right.flow) || left.index - right.index)\n .map(({ flow }) => flow);\n}\n\nexport function buildValueMovementCanonicalKey(movement: ExtractedValueMovement): string {\n return [\n movement.signature,\n movement.movementKind,\n movement.currency,\n movement.rawAmount ?? \"noraw\",\n movement.amount,\n movement.fromAddress ?? \"none\",\n movement.toAddress ?? \"none\",\n movement.role,\n movement.isSynthetic ? \"synthetic\" : \"observed\",\n ].join(\":\");\n}\n\nexport function compareValueMovementsByCanonicalOrder(a: ExtractedValueMovement, b: ExtractedValueMovement): number {\n if (a.timestamp !== b.timestamp) return a.timestamp - b.timestamp;\n if ((a.slot ?? 0) !== (b.slot ?? 0)) return (a.slot ?? 0) - (b.slot ?? 0);\n return a.movementIndex - b.movementIndex;\n}\n\nexport function canonicalizeValueMovements(movements: ExtractedValueMovement[]): ExtractedValueMovement[] {\n const deduped = new Map<string, ExtractedValueMovement>();\n\n for (const movement of movements) {\n const key = buildValueMovementCanonicalKey(movement);\n if (!deduped.has(key)) {\n deduped.set(key, movement);\n }\n }\n\n return Array.from(deduped.values())\n .map((movement, index) => ({ movement, index }))\n .sort(\n (left, right) => compareValueMovementsByCanonicalOrder(left.movement, right.movement) || left.index - right.index,\n )\n .map(({ movement }) => movement);\n}\n","import type { ExtractedMintFlow } from \"../types.js\";\n\nfunction isCustodyOnlyFlow(flow: Pick<ExtractedMintFlow, \"derivedType\">): boolean {\n return (\n flow.derivedType === \"LIST\" ||\n flow.derivedType === \"DELIST\" ||\n flow.derivedType === \"LOCK\" ||\n flow.derivedType === \"UNLOCK\"\n );\n}\n\nfunction isSameAddressCustodyMarker(flow: ExtractedMintFlow): boolean {\n return isCustodyOnlyFlow(flow) && Boolean(flow.fromAddress) && flow.fromAddress === flow.toAddress;\n}\n\nfunction isSaleLocalSyntheticListing(flow: ExtractedMintFlow, nextFlow: ExtractedMintFlow | undefined): boolean {\n return (\n flow.derivedType === \"LIST\" &&\n nextFlow?.signature === flow.signature &&\n nextFlow.derivedType === \"SALE\" &&\n nextFlow.fromAddress === flow.toAddress\n );\n}\n\nfunction resolveSaleLocalSyntheticListingOrigin(params: {\n flow: ExtractedMintFlow;\n nextFlow: ExtractedMintFlow | undefined;\n currentAddress: string | null;\n lastOwnerAddress: string | null;\n}): string | null {\n const { flow, nextFlow, currentAddress, lastOwnerAddress } = params;\n if (!isSaleLocalSyntheticListing(flow, nextFlow)) {\n return null;\n }\n\n if (currentAddress && currentAddress !== flow.toAddress) {\n return currentAddress;\n }\n\n // NFT is already in escrow from a prior custody transition (LIST/LOCK).\n // Keep the SALE from=escrow — the real custody flow already explains how\n // the NFT got there. Resolving back to the beneficial owner would make the\n // prior LIST look orphaned and hide the escrow step.\n if (currentAddress) {\n return null;\n }\n\n return lastOwnerAddress ?? flow.fromAddress ?? null;\n}\n\nfunction shouldDropRedundantCustodyFlow(params: { flow: ExtractedMintFlow; currentAddress: string | null }): boolean {\n const { flow, currentAddress } = params;\n\n return (\n !isSameAddressCustodyMarker(flow) &&\n isCustodyOnlyFlow(flow) &&\n Boolean(currentAddress) &&\n Boolean(flow.toAddress) &&\n flow.toAddress === currentAddress\n );\n}\n\nexport function collapseRedundantCustodyFlows(flows: ExtractedMintFlow[]): ExtractedMintFlow[] {\n const normalizedFlows = flows.map((flow) => ({ ...flow }));\n const collapsed: ExtractedMintFlow[] = [];\n let currentAddress: string | null = null;\n let lastOwnerAddress: string | null = null;\n\n for (let index = 0; index < normalizedFlows.length; index += 1) {\n const flow = normalizedFlows[index]!;\n const nextFlow = normalizedFlows[index + 1];\n const saleLocalOrigin = resolveSaleLocalSyntheticListingOrigin({\n flow,\n nextFlow,\n currentAddress,\n lastOwnerAddress,\n });\n\n if (isSaleLocalSyntheticListing(flow, nextFlow)) {\n if (saleLocalOrigin && nextFlow) {\n nextFlow.fromAddress = saleLocalOrigin;\n }\n continue;\n }\n\n if (shouldDropRedundantCustodyFlow({ flow, currentAddress })) {\n continue;\n }\n\n collapsed.push(flow);\n currentAddress = flow.toAddress ?? currentAddress;\n if (!isCustodyOnlyFlow(flow)) {\n lastOwnerAddress = flow.toAddress ?? lastOwnerAddress;\n }\n }\n\n return collapsed;\n}\n","import type { ExtractedMintFlow, ReconstructedOwnershipPeriod } from \"../types.js\";\n\nexport function affectsBeneficialOwnership(flow: Pick<ExtractedMintFlow, \"derivedType\">): boolean {\n return (\n flow.derivedType === \"MINT\" ||\n flow.derivedType === \"TRANSFER\" ||\n flow.derivedType === \"SALE\" ||\n flow.derivedType === \"SWAP\" ||\n flow.derivedType === \"FORECLOSURE\"\n );\n}\n\nexport function selectBeneficialOwnershipFlows(flows: ExtractedMintFlow[]): ExtractedMintFlow[] {\n return flows.filter((flow) => affectsBeneficialOwnership(flow) && Boolean(flow.toAddress));\n}\n\nexport function reconstructOwnershipPeriods(flows: ExtractedMintFlow[]): ReconstructedOwnershipPeriod[] {\n const periods: ReconstructedOwnershipPeriod[] = [];\n let current: ReconstructedOwnershipPeriod | null = null;\n\n for (const flow of selectBeneficialOwnershipFlows(flows)) {\n const nextOwner = flow.toAddress!;\n\n if (!current) {\n current = {\n ownerAddress: nextOwner,\n startTimestamp: flow.timestamp,\n endTimestamp: null,\n };\n continue;\n }\n\n if (current.ownerAddress === nextOwner) continue;\n\n current.endTimestamp = flow.timestamp;\n periods.push(current);\n current = {\n ownerAddress: nextOwner,\n startTimestamp: flow.timestamp,\n endTimestamp: null,\n };\n }\n\n if (current) periods.push(current);\n return periods;\n}\n","import type { AssetFlowDerivedType, ExtractedValueMovement, HeliusEnhancedTx } from \"../types.js\";\nimport { isNonFungibleTokenStandard, normalizeEnhancedType, toNullableNumber } from \"../chains/solana/utils.js\";\n\nconst LAMPORTS_PER_SOL = 1_000_000_000;\n\ninterface ObservedValueMovementCollectionParams {\n tx: HeliusEnhancedTx;\n mint: string;\n derivedType: AssetFlowDerivedType;\n}\n\nfunction toBigIntString(value: unknown): string | null {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.trunc(value).toString();\n }\n\n if (typeof value === \"string\" && value.trim().length > 0) {\n try {\n return BigInt(value).toString();\n } catch {\n return null;\n }\n }\n\n return null;\n}\n\nfunction buildMovementBase(\n tx: HeliusEnhancedTx,\n timestamp: number,\n movementIndex: number,\n): Omit<\n ExtractedValueMovement,\n \"movementKind\" | \"currency\" | \"amount\" | \"rawAmount\" | \"decimals\" | \"fromAddress\" | \"toAddress\" | \"tokenStandard\"\n> {\n return {\n signature: tx.signature,\n slot: tx.slot ?? null,\n timestamp,\n heliusType: tx.type ?? \"UNKNOWN\",\n source: tx.source ?? \"UNKNOWN\",\n movementIndex,\n role: \"UNKNOWN\",\n confidence: \"HIGH\",\n isSynthetic: false,\n };\n}\n\nexport function collectObservedValueMovements(params: ObservedValueMovementCollectionParams): ExtractedValueMovement[] {\n const { tx, mint, derivedType } = params;\n const timestamp = tx.timestamp;\n if (typeof timestamp !== \"number\" || !Number.isFinite(timestamp) || timestamp <= 0) {\n return [];\n }\n\n const movements: ExtractedValueMovement[] = [];\n\n (tx.nativeTransfers ?? []).forEach((transfer, movementIndex) => {\n const rawAmount = toBigIntString(transfer.amount);\n if (!rawAmount) return;\n\n const amountLamports = Number(rawAmount);\n if (!Number.isFinite(amountLamports) || amountLamports <= 0) return;\n\n movements.push({\n ...buildMovementBase(tx, timestamp, movementIndex),\n movementKind: \"NATIVE\",\n currency: \"SOL\",\n amount: amountLamports / LAMPORTS_PER_SOL,\n rawAmount,\n decimals: 9,\n fromAddress: transfer.fromUserAccount ?? null,\n toAddress: transfer.toUserAccount ?? null,\n tokenStandard: null,\n });\n });\n\n (tx.tokenTransfers ?? []).forEach((transfer, movementIndex) => {\n const numericAmount =\n typeof transfer.tokenAmount === \"number\" ? transfer.tokenAmount : Number(transfer.tokenAmount ?? NaN);\n if (!Number.isFinite(numericAmount) || numericAmount <= 0) return;\n if (isNonFungibleTokenStandard(transfer.tokenStandard)) return;\n if (!transfer.mint) return;\n\n movements.push({\n ...buildMovementBase(tx, timestamp, movementIndex),\n movementKind: \"TOKEN\",\n currency: transfer.mint,\n amount: numericAmount,\n rawAmount: null,\n decimals: null,\n fromAddress: transfer.fromUserAccount ?? null,\n toAddress: transfer.toUserAccount ?? null,\n tokenStandard: transfer.tokenStandard ?? null,\n });\n });\n\n (tx.actions ?? []).forEach((action, movementIndex) => {\n const normalizedActionType = normalizeEnhancedType(action.actionType);\n const numericAmount = toNullableNumber(action.amount);\n if (!numericAmount || numericAmount <= 0) return;\n\n if (normalizedActionType === \"PAID\") {\n const rawAmount = toBigIntString(action.amount);\n if (!rawAmount) return;\n\n movements.push({\n ...buildMovementBase(tx, timestamp, movementIndex),\n movementKind: \"NATIVE\",\n currency: \"SOL\",\n amount: numericAmount / LAMPORTS_PER_SOL,\n rawAmount,\n decimals: 9,\n fromAddress: action.from ?? null,\n toAddress: action.to ?? null,\n tokenStandard: null,\n });\n return;\n }\n\n if (derivedType === \"SWAP\" && action.mint && action.mint !== mint && normalizedActionType !== \"NFT_BID\") {\n movements.push({\n ...buildMovementBase(tx, timestamp, movementIndex),\n movementKind: \"TOKEN\",\n currency: action.mint,\n amount: numericAmount,\n rawAmount: toBigIntString(action.amount),\n decimals: action.decimals ?? null,\n fromAddress: action.from ?? null,\n toAddress: action.to ?? null,\n tokenStandard: null,\n });\n }\n });\n\n return movements;\n}\n","import type { AssetFlowDerivedType, ExtractedValueMovement } from \"../types.js\";\n\ninterface GenericValueMovementTaggingParams {\n movements: ExtractedValueMovement[];\n mint: string;\n derivedType: AssetFlowDerivedType | \"NON_SETTLEMENT\";\n rentThreshold: number;\n}\n\nfunction normalizeMovementDefaults(movement: ExtractedValueMovement): ExtractedValueMovement {\n return {\n ...movement,\n role: movement.role ?? \"UNKNOWN\",\n confidence: movement.confidence ?? \"HIGH\",\n isSynthetic: movement.isSynthetic ?? false,\n };\n}\n\nfunction annotateRentValueMovements(movements: ExtractedValueMovement[], rentThreshold: number): void {\n for (const movement of movements) {\n if (movement.currency === \"SOL\" && movement.movementKind === \"NATIVE\" && movement.amount < rentThreshold) {\n movement.role = \"RENT\";\n movement.confidence = \"HIGH\";\n }\n }\n}\n\nfunction annotateSwapConsiderationValueMovements(params: {\n movements: ExtractedValueMovement[];\n mint: string;\n rentThreshold: number;\n}): void {\n const { movements, mint, rentThreshold } = params;\n\n for (const movement of movements) {\n if (movement.role !== \"UNKNOWN\" || movement.amount < rentThreshold) {\n continue;\n }\n\n if (movement.movementKind === \"TOKEN\" && movement.currency !== mint) {\n movement.role = \"SWAP_CONSIDERATION\";\n movement.confidence = \"HIGH\";\n continue;\n }\n\n if (movement.movementKind === \"NATIVE\") {\n movement.role = \"SWAP_CONSIDERATION\";\n movement.confidence = \"HIGH\";\n }\n }\n}\n\nexport function annotateGenericValueMovements(params: GenericValueMovementTaggingParams): ExtractedValueMovement[] {\n const movements = params.movements.map(normalizeMovementDefaults);\n\n annotateRentValueMovements(movements, params.rentThreshold);\n\n if (params.derivedType === \"SWAP\") {\n annotateSwapConsiderationValueMovements({\n movements,\n mint: params.mint,\n rentThreshold: params.rentThreshold,\n });\n }\n\n return movements;\n}\n","import { classifyEnhancedTransactionForMint } from \"./classifier.js\";\nimport { PERSIST_DERIVED_TYPES } from \"./matchers/classify.js\";\nimport { interpretMintFlowProtocolEvent } from \"./protocol-events.js\";\nimport { canonicalizeMintFlows, canonicalizeValueMovements } from \"../../semantics/canonicalize.js\";\nimport { collapseRedundantCustodyFlows } from \"../../semantics/custody.js\";\nimport { reconstructOwnershipPeriods as buildOwnershipPeriods } from \"../../semantics/ownership.js\";\nimport { annotateSaleValueMovements } from \"../../semantics/sale.js\";\nimport { collectObservedValueMovements } from \"../../semantics/value-movement-extraction.js\";\nimport { annotateGenericValueMovements } from \"../../semantics/value-movements.js\";\nimport type {\n AssetFlowTxClassification,\n ExtractedMintFlow,\n ExtractedValueMovement,\n HeliusEnhancedTx,\n HeliusTokenTransfer,\n NormalizedMintHistory,\n} from \"./types.js\";\nimport { isNonFungibleTokenStandard, normalizeEnhancedType } from \"./utils.js\";\n\nexport { reconstructOwnershipPeriods } from \"../../semantics/ownership.js\";\n\nconst SOL_RENT_NOISE_MAX = 0.01;\n\nfunction isNftMintCandidate(transfer: HeliusTokenTransfer): boolean {\n const numericAmount =\n typeof transfer.tokenAmount === \"number\" ? transfer.tokenAmount : Number(transfer.tokenAmount ?? NaN);\n return (\n Boolean(transfer.mint) &&\n Number.isFinite(numericAmount) &&\n numericAmount > 0 &&\n isNonFungibleTokenStandard(transfer.tokenStandard)\n );\n}\n\nfunction annotateValueMovementsForTx(params: {\n tx: HeliusEnhancedTx;\n mint: string;\n movements: ExtractedValueMovement[];\n derivedType: NormalizedMintHistory[\"flows\"][number][\"derivedType\"] | \"NON_SETTLEMENT\";\n}): ExtractedValueMovement[] {\n const { tx, mint, derivedType } = params;\n const movements = annotateGenericValueMovements({\n movements: params.movements,\n mint,\n derivedType,\n rentThreshold: SOL_RENT_NOISE_MAX,\n });\n\n if (derivedType !== \"SALE\") {\n return movements;\n }\n\n return annotateSaleValueMovements({\n tx,\n movements,\n rentThreshold: SOL_RENT_NOISE_MAX,\n });\n}\n\nfunction classifyWithCache(\n tx: HeliusEnhancedTx,\n mint: string,\n cache: Map<string, AssetFlowTxClassification>,\n): AssetFlowTxClassification {\n const cached = cache.get(tx.signature);\n if (cached) return cached;\n const result = classifyEnhancedTransactionForMint(tx, mint);\n cache.set(tx.signature, result);\n return result;\n}\n\nexport function extractCandidateMintsFromEnhancedTx(tx: HeliusEnhancedTx): string[] {\n const mints = new Set<string>();\n\n for (const transfer of tx.tokenTransfers ?? []) {\n if (isNftMintCandidate(transfer) && transfer.mint) {\n mints.add(transfer.mint);\n }\n }\n\n for (const action of tx.actions ?? []) {\n const normalizedActionType = normalizeEnhancedType(action.actionType);\n if (\n action.mint &&\n [\"NFT_SALE\", \"NFT_TRANSFER\", \"NFT_MINT\", \"NFT_LISTING\", \"NFT_CANCEL_LISTING\", \"TRANSFER\"].includes(\n normalizedActionType,\n )\n ) {\n mints.add(action.mint);\n }\n }\n\n return [...mints];\n}\n\nfunction buildFlow(\n tx: HeliusEnhancedTx,\n timestamp: number,\n params: {\n fromAddress: string | null;\n toAddress: string | null;\n transferIndex: number;\n tokenStandard: string | null;\n derivedType: ExtractedMintFlow[\"derivedType\"];\n },\n): ExtractedMintFlow {\n return {\n signature: tx.signature,\n slot: tx.slot ?? null,\n timestamp,\n heliusType: tx.type ?? \"UNKNOWN\",\n source: tx.source ?? \"UNKNOWN\",\n fromAddress: params.fromAddress,\n toAddress: params.toAddress,\n transferIndex: params.transferIndex,\n tokenStandard: params.tokenStandard,\n derivedType: params.derivedType,\n };\n}\n\nexport function extractMintFlows(\n transactions: HeliusEnhancedTx[],\n mint: string,\n classificationCache: Map<string, AssetFlowTxClassification> = new Map(),\n): ExtractedMintFlow[] {\n const rawFlows: ExtractedMintFlow[] = [];\n\n for (const tx of transactions) {\n const event = interpretMintFlowProtocolEvent({\n tx,\n mint,\n getClassification: (targetTx) => classifyWithCache(targetTx, mint, classificationCache),\n });\n if (!event) continue;\n\n rawFlows.push(\n ...event.flows.map((flow) =>\n buildFlow(event.tx, event.timestamp, {\n fromAddress: flow.fromAddress,\n toAddress: flow.toAddress,\n transferIndex: flow.transferIndex,\n tokenStandard: flow.tokenStandard,\n derivedType: flow.derivedType,\n }),\n ),\n );\n }\n\n return canonicalizeMintFlows(rawFlows);\n}\n\nexport function extractValueMovements(\n transactions: HeliusEnhancedTx[],\n mint: string,\n classificationCache: Map<string, AssetFlowTxClassification> = new Map(),\n): ExtractedValueMovement[] {\n const rawMovements: ExtractedValueMovement[] = [];\n\n for (const tx of transactions) {\n const timestamp = tx.timestamp;\n if (typeof timestamp !== \"number\" || !Number.isFinite(timestamp) || timestamp <= 0) continue;\n const classification = classifyWithCache(tx, mint, classificationCache);\n if (classification.materialization !== \"PERSIST_FLOW\") continue;\n if (!classification.shouldExtractValueMovements) continue;\n const txMovements = collectObservedValueMovements({\n tx,\n mint,\n derivedType: classification.derivedType,\n });\n\n rawMovements.push(\n ...annotateValueMovementsForTx({\n tx,\n mint,\n movements: txMovements,\n derivedType: classification.derivedType,\n }),\n );\n }\n\n return canonicalizeValueMovements(rawMovements);\n}\n\nexport function normalizeMintHistory(transactions: HeliusEnhancedTx[], mint: string): NormalizedMintHistory {\n const classificationCache = new Map<string, AssetFlowTxClassification>();\n const flows = collapseRedundantCustodyFlows(extractMintFlows(transactions, mint, classificationCache));\n const valueMovements = extractValueMovements(transactions, mint, classificationCache);\n const periods = buildOwnershipPeriods(flows);\n\n return {\n flows,\n valueMovements,\n periods,\n };\n}\n","import type {\n HeliusEnhancedAction,\n HeliusEnhancedTx,\n RawAssetFlowAccountKey,\n RawAssetFlowTokenBalance,\n RawAssetFlowTransaction,\n} from \"./types.js\";\nimport { getMintNftTransfers, hasMeaningfulNativeSettlement, normalizeEnhancedType } from \"./utils.js\";\n\nconst MEANINGFUL_SETTLEMENT_LAMPORTS = 10_000_000;\nconst INSTRUCTION_LOG_PREFIX = \"Program log: Instruction: \";\nconst CLAY_STAKING_PROGRAM_ID = \"CLAYVLFC58dsDXcYTy4vD6uK4Gu6xy6UNhUHkXsBkRfu\";\nconst CLAY_STAKING_INSTRUCTION_LABELS = new Set([\"Stake\", \"Unstake\"]);\nconst RAW_OWNERSHIP_OVERRIDE_SOURCES = new Set([\"CITRUS\", \"SHARKY_FI\", \"FRAKT\", \"CARDINAL_RENT\", \"SQUADS_MPL\"]);\nconst RAW_OWNERSHIP_OVERRIDE_PROGRAMS = new Set([\n \"A66HabVL3DzNzeJgcHYtRRNW1ZRMKwBfrdSR4kLsZ9DJ\", // RainFi liquidation raffles\n \"RainEraPU5yDoJmTrHdYynK9739GkEfDsE4ffqce2BR\", // RainFi lending (Helius reports as SYSTEM_PROGRAM)\n \"mid36PV7Tk5j2cZjBYArGcjMS85pHm9geYN97HsSLtg\", // Midgard lending (LiquidateNft)\n \"SNPRohhBurQwrpwAptw1QYtpFdfEKitr4WSJ125cN1g\", // Sniper Market (Helius reports as UNKNOWN)\n \"hgednk3XtQcyz8wFSEAN8fzLqupQB4AVor1NGbGwfwf\", // Yawww marketplace (Helius reports as UNKNOWN)\n \"5pBn2Sxa41SUuTxKR8s91kMn9LHptd7Q9AA7nP6mqa4W\", // Unknown transfer proxy (Helius reports as UNKNOWN)\n \"8NvmvWEAw89HnE8Gjo4kHhbHy2PGyeuU9y9QJ1HKiLoR\", // Squads v3 multisig (Helius reports as UNKNOWN)\n \"Rewv3coebx3zMsZNt1ogsaQhJoCix1dTYMnzvDJeZTi\", // P2P escrow (AdminCallback — Helius reports self-transfers)\n \"LendY9EXmeiJLHipx1giNrpRVpqo68oWvzTjVYrKxQe\", // Lending protocol (delegate sales report intermediary as from)\n \"M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K\", // Magic Eden v2 (old Sell+SetAuthority has no token transfers)\n \"CrUptMreyezRbdHJbeZ5sMJ9idiSuMUJpdchQzY6NFjL\", // Corrupt program (Unwind — Helius reports intermediary as from)\n \"hgopH9G1FRn37oqjJJ83o9RDpUCcQXL9ZDcAZ5Pg7xB\", // Early marketplace (NativeSale — Helius reports escrow as from)\n \"mrkTzoWMVEBJ3AUrgd2eXNLXrnBuhhQRQyxahtaeTie\", // Marketplace (FillSellOrder — Helius reports intermediary as from)\n \"8guzmt92HbM7yQ69UJg564hRRX6N4nCdxWE5L6ENrA8P\", // Foxy swap (SWAP reports counterparty as from instead of escrow)\n CLAY_STAKING_PROGRAM_ID, // Claynosaurz staking (Stake/Unstake — Helius reports no token transfers)\n]);\nconst RAW_REQUIRED_SOURCES = new Set([\"CITRUS\", \"RAINFI\", \"SHARKY_FI\", \"FRAKT\", \"CARDINAL_RENT\", \"SQUADS_MPL\", \"FOXY\"]);\nconst RAW_SENSITIVE_TYPES = new Set([\"UNKNOWN\", \"TRANSFER\", \"SWAP\", \"NFT_TRANSFER\"]);\n\ninterface RawMintOwnerChange {\n mint: string;\n fromOwner: string;\n toOwner: string;\n}\n\ninterface RawStableMintOwner {\n mint: string;\n owner: string;\n}\n\nfunction normalizeAccountKeys(accountKeys: RawAssetFlowAccountKey[] | undefined): string[] {\n return (accountKeys ?? []).map((key) => (typeof key === \"string\" ? key : key.pubkey));\n}\n\nfunction extractSignature(tx: RawAssetFlowTransaction): string | null {\n if (tx.signature) {\n return tx.signature;\n }\n\n if (tx.transaction?.signatures?.length) {\n return tx.transaction.signatures[0] ?? null;\n }\n\n return null;\n}\n\nfunction getPositiveOwners(balances: RawAssetFlowTokenBalance[] | undefined, mint: string): Set<string> {\n const owners = new Set<string>();\n\n for (const balance of balances ?? []) {\n if (balance.mint !== mint) continue;\n const amount = Number(balance.uiTokenAmount?.amount ?? NaN);\n if (!Number.isFinite(amount) || amount <= 0) continue;\n if (balance.owner) {\n owners.add(balance.owner);\n }\n }\n\n return owners;\n}\n\nfunction getOwnerBalanceMap(balances: RawAssetFlowTokenBalance[] | undefined, mint: string): Map<string, number> {\n const owners = new Map<string, number>();\n\n for (const balance of balances ?? []) {\n if (balance.mint !== mint || !balance.owner) continue;\n const amount = Number(balance.uiTokenAmount?.amount ?? NaN);\n if (!Number.isFinite(amount) || amount < 0) continue;\n owners.set(balance.owner, amount);\n }\n\n return owners;\n}\n\nfunction getCandidateMints(tx: RawAssetFlowTransaction): string[] {\n const mints = new Set<string>();\n\n for (const balance of tx.meta?.preTokenBalances ?? []) {\n if (balance.mint) mints.add(balance.mint);\n }\n\n for (const balance of tx.meta?.postTokenBalances ?? []) {\n if (balance.mint) mints.add(balance.mint);\n }\n\n return [...mints];\n}\n\nexport function extractCandidateMintsFromRawTransaction(tx: RawAssetFlowTransaction): string[] {\n return getCandidateMints(tx);\n}\n\nfunction getBalanceDelta(\n account: string,\n accountKeys: string[],\n preBalances: number[],\n postBalances: number[],\n): number | null {\n const accountIndex = accountKeys.findIndex((key) => key === account);\n if (accountIndex === -1) return null;\n const pre = preBalances[accountIndex];\n const post = postBalances[accountIndex];\n if (typeof pre !== \"number\" || typeof post !== \"number\") return null;\n return post - pre;\n}\n\nfunction extractProgramIds(tx: RawAssetFlowTransaction): string[] {\n const ids = new Set<string>();\n\n for (const instruction of tx.transaction?.message?.instructions ?? []) {\n if (instruction.programId) {\n ids.add(instruction.programId);\n }\n }\n\n return [...ids];\n}\n\nfunction extractInstructionLabels(tx: RawAssetFlowTransaction): string[] {\n const labels = new Set<string>();\n\n for (const message of tx.meta?.logMessages ?? []) {\n const markerIndex = message.indexOf(INSTRUCTION_LOG_PREFIX);\n if (markerIndex === -1) continue;\n const label = message.slice(markerIndex + INSTRUCTION_LOG_PREFIX.length).trim();\n if (label) {\n labels.add(label);\n }\n }\n\n return [...labels];\n}\n\nfunction extractMintOwnerChanges(tx: RawAssetFlowTransaction): RawMintOwnerChange[] {\n const ownerChanges: RawMintOwnerChange[] = [];\n\n for (const mint of getCandidateMints(tx)) {\n const preOwners = getOwnerBalanceMap(tx.meta?.preTokenBalances, mint);\n const postOwners = getOwnerBalanceMap(tx.meta?.postTokenBalances, mint);\n if (preOwners.size === 0 && postOwners.size === 0) {\n continue;\n }\n\n const fromOwners = [...preOwners.entries()]\n .filter(([owner, preAmount]) => preAmount > 0 && (postOwners.get(owner) ?? 0) <= 0)\n .map(([owner]) => owner);\n const toOwners = [...postOwners.entries()]\n .filter(([owner, postAmount]) => postAmount > 0 && (preOwners.get(owner) ?? 0) <= 0)\n .map(([owner]) => owner);\n\n if (fromOwners.length !== 1 || toOwners.length !== 1) {\n continue;\n }\n\n const fromOwner = fromOwners[0];\n const toOwner = toOwners[0];\n if (!fromOwner || !toOwner || fromOwner === toOwner) {\n continue;\n }\n\n ownerChanges.push({ mint, fromOwner, toOwner });\n }\n\n return ownerChanges;\n}\n\nfunction extractStableMintOwners(tx: RawAssetFlowTransaction): RawStableMintOwner[] {\n const stableOwners: RawStableMintOwner[] = [];\n\n for (const mint of getCandidateMints(tx)) {\n const preOwners = getPositiveOwners(tx.meta?.preTokenBalances, mint);\n const postOwners = getPositiveOwners(tx.meta?.postTokenBalances, mint);\n if (preOwners.size !== 1 || postOwners.size !== 1) {\n continue;\n }\n\n const preOwner = [...preOwners][0];\n const postOwner = [...postOwners][0];\n if (!preOwner || !postOwner || preOwner !== postOwner) {\n continue;\n }\n\n stableOwners.push({ mint, owner: preOwner });\n }\n\n return stableOwners;\n}\n\nfunction buildPaidAction(buyer: string, seller: string, amount: number): HeliusEnhancedAction | null {\n if (!Number.isFinite(amount) || amount < MEANINGFUL_SETTLEMENT_LAMPORTS) {\n return null;\n }\n\n return {\n actionType: \"PAID\",\n from: buyer,\n to: seller,\n amount,\n };\n}\n\nexport function synthesizeEnhancedTransactionsFromRaw(tx: RawAssetFlowTransaction): HeliusEnhancedTx[] {\n const signature = extractSignature(tx);\n if (!signature) {\n return [];\n }\n\n const accountKeys = normalizeAccountKeys(tx.transaction?.message?.accountKeys);\n const preBalances = tx.meta?.preBalances ?? [];\n const postBalances = tx.meta?.postBalances ?? [];\n const timestamp = tx.blockTime;\n if (typeof timestamp !== \"number\" || !Number.isFinite(timestamp) || timestamp <= 0) {\n return [];\n }\n\n const synthetic: HeliusEnhancedTx[] = [];\n const programIds = extractProgramIds(tx);\n const instructionLabels = extractInstructionLabels(tx);\n\n for (const mint of getCandidateMints(tx)) {\n const preOwners = getPositiveOwners(tx.meta?.preTokenBalances, mint);\n const postOwners = getPositiveOwners(tx.meta?.postTokenBalances, mint);\n if (!preOwners.size && !postOwners.size) continue;\n\n const fromOwners = [...preOwners].filter((owner) => !postOwners.has(owner));\n const toOwners = [...postOwners].filter((owner) => !preOwners.has(owner));\n\n if (fromOwners.length !== 1 || toOwners.length !== 1) {\n continue;\n }\n\n const seller = fromOwners[0];\n const buyer = toOwners[0];\n if (!seller || !buyer || seller === buyer) {\n continue;\n }\n\n const sellerGain = getBalanceDelta(seller, accountKeys, preBalances, postBalances);\n const buyerDelta = getBalanceDelta(buyer, accountKeys, preBalances, postBalances);\n const buyerSpend = typeof buyerDelta === \"number\" && buyerDelta < 0 ? Math.abs(buyerDelta) : null;\n const candidateAmounts = [sellerGain, buyerSpend].filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value) && value > 0,\n );\n const settlementAmount = candidateAmounts.length > 0 ? Math.min(...candidateAmounts) : null;\n const paidAction = settlementAmount ? buildPaidAction(buyer, seller, settlementAmount) : null;\n\n synthetic.push({\n signature,\n slot: tx.slot,\n timestamp,\n type: paidAction ? \"UNKNOWN\" : \"NFT_TRANSFER\",\n source: \"RAW_WEBHOOK\",\n programIds,\n instructionLabels,\n tokenTransfers: [\n {\n mint,\n fromUserAccount: seller,\n toUserAccount: buyer,\n tokenAmount: 1,\n tokenStandard: \"NonFungible\",\n },\n ],\n actions: paidAction ? [paidAction] : [],\n nativeTransfers: [],\n transactionError: null,\n });\n }\n\n const hasClayvStaking =\n programIds.includes(CLAY_STAKING_PROGRAM_ID) &&\n instructionLabels.some((label) => CLAY_STAKING_INSTRUCTION_LABELS.has(label));\n\n if (hasClayvStaking) {\n for (const stableOwner of extractStableMintOwners(tx)) {\n const alreadySynthesized = synthetic.some((s) => s.tokenTransfers?.some((t) => t.mint === stableOwner.mint));\n if (alreadySynthesized) continue;\n\n synthetic.push({\n signature,\n slot: tx.slot,\n timestamp,\n type: \"UNKNOWN\",\n source: \"RAW_WEBHOOK\",\n programIds,\n instructionLabels,\n tokenTransfers: [\n {\n mint: stableOwner.mint,\n fromUserAccount: stableOwner.owner,\n toUserAccount: stableOwner.owner,\n tokenAmount: 1,\n tokenStandard: \"ProgrammableNonFungible\",\n },\n ],\n actions: [],\n nativeTransfers: [],\n transactionError: null,\n });\n }\n }\n\n return synthetic;\n}\n\nexport function mergeRawProgramEvidence(tx: HeliusEnhancedTx, rawTx: RawAssetFlowTransaction): HeliusEnhancedTx {\n const rawProgramIds = extractProgramIds(rawTx);\n const rawInstructionLabels = extractInstructionLabels(rawTx);\n if (rawProgramIds.length === 0 && rawInstructionLabels.length === 0) {\n return tx;\n }\n\n return {\n ...tx,\n programIds: [...new Set([...(tx.programIds ?? []), ...rawProgramIds])],\n instructionLabels: [...new Set([...(tx.instructionLabels ?? []), ...rawInstructionLabels])],\n };\n}\n\nexport function shouldApplyRawOwnerOverrides(tx: HeliusEnhancedTx, rawTx: RawAssetFlowTransaction): boolean {\n if (RAW_OWNERSHIP_OVERRIDE_SOURCES.has(tx.source ?? \"\")) {\n return true;\n }\n\n const rawInstructions = rawTx.transaction?.message?.instructions ?? [];\n if (rawInstructions.some((ix) => ix.programId && RAW_OWNERSHIP_OVERRIDE_PROGRAMS.has(ix.programId))) {\n return true;\n }\n\n return hasPhantomSenderInEnhanced(tx, rawTx);\n}\n\nfunction hasPhantomSenderInEnhanced(tx: HeliusEnhancedTx, rawTx: RawAssetFlowTransaction): boolean {\n for (const transfer of tx.tokenTransfers ?? []) {\n if (!transfer.mint || !transfer.fromUserAccount) continue;\n const preOwners = getPositiveOwners(rawTx.meta?.preTokenBalances, transfer.mint);\n if (preOwners.size > 0 && !preOwners.has(transfer.fromUserAccount)) {\n return true;\n }\n }\n return false;\n}\n\nexport function augmentEnhancedTransactionWithRaw(\n tx: HeliusEnhancedTx,\n rawTx: RawAssetFlowTransaction,\n): HeliusEnhancedTx {\n if (shouldApplyRawOwnerOverrides(tx, rawTx)) {\n return applyRawOwnerOverridesToEnhanced(tx, rawTx);\n }\n\n return mergeRawProgramEvidence(tx, rawTx);\n}\n\nexport function applyRawOwnerOverridesToEnhanced(\n tx: HeliusEnhancedTx,\n rawTx: RawAssetFlowTransaction,\n): HeliusEnhancedTx {\n const mergedProgramIds = [...new Set([...(tx.programIds ?? []), ...extractProgramIds(rawTx)])];\n const mergedInstructionLabels = [...new Set([...(tx.instructionLabels ?? []), ...extractInstructionLabels(rawTx)])];\n const ownerChangeByMint = new Map(extractMintOwnerChanges(rawTx).map((change) => [change.mint, change]));\n\n const existingTransfers = tx.tokenTransfers ?? [];\n const tokenTransfers = existingTransfers.map((transfer) => {\n if (!transfer.mint) {\n return transfer;\n }\n\n const ownerChange = ownerChangeByMint.get(transfer.mint);\n if (!ownerChange) {\n return transfer;\n }\n\n return {\n ...transfer,\n fromUserAccount: ownerChange.fromOwner,\n toUserAccount: ownerChange.toOwner,\n };\n });\n\n // Synthesize token transfers from raw balances when enhanced data is empty\n if (existingTransfers.length === 0 && ownerChangeByMint.size > 0) {\n for (const change of ownerChangeByMint.values()) {\n tokenTransfers.push({\n mint: change.mint,\n fromUserAccount: change.fromOwner,\n toUserAccount: change.toOwner,\n tokenAmount: 1,\n tokenStandard: \"NonFungible\",\n });\n }\n }\n\n for (const stableOwner of extractStableMintOwners(rawTx)) {\n let i = tokenTransfers.length;\n while (i--) {\n if (tokenTransfers[i]?.mint === stableOwner.mint) {\n tokenTransfers.splice(i, 1);\n }\n }\n\n tokenTransfers.push({\n mint: stableOwner.mint,\n fromUserAccount: stableOwner.owner,\n toUserAccount: stableOwner.owner,\n tokenAmount: 1,\n tokenStandard: \"ProgrammableNonFungible\",\n });\n }\n\n return {\n ...tx,\n programIds: mergedProgramIds,\n instructionLabels: mergedInstructionLabels,\n tokenTransfers,\n };\n}\n\nconst LISTING_TYPES_NEEDING_RAW = new Set([\"NFT_LISTING\", \"NFT_CANCEL_LISTING\"]);\n\nexport function shouldFetchRawForMintTx(tx: HeliusEnhancedTx, mint: string): boolean {\n const nftTransfers = getMintNftTransfers(tx, mint);\n if (nftTransfers.length === 0) {\n const normalizedType = normalizeEnhancedType(tx.type);\n if (LISTING_TYPES_NEEDING_RAW.has(normalizedType)) return true;\n const hasClayStakingProgram =\n tx.programIds?.includes(CLAY_STAKING_PROGRAM_ID) ||\n tx.instructions?.some((ix) => ix.programId === CLAY_STAKING_PROGRAM_ID);\n return Boolean(hasClayStakingProgram);\n }\n\n const source = normalizeEnhancedType(tx.source);\n if (RAW_REQUIRED_SOURCES.has(source)) {\n return true;\n }\n\n if (\n nftTransfers.some(\n (transfer) =>\n !transfer.fromUserAccount || !transfer.toUserAccount || transfer.fromUserAccount === transfer.toUserAccount,\n )\n ) {\n return true;\n }\n\n if (nftTransfers.length > 1) {\n return true;\n }\n\n const normalizedType = normalizeEnhancedType(tx.type);\n if (normalizedType === \"UNKNOWN\") {\n return true;\n }\n\n if (RAW_SENSITIVE_TYPES.has(normalizedType) && !hasMeaningfulNativeSettlement(tx, mint)) {\n return true;\n }\n\n return false;\n}\n","export * from \"./types.js\";\nexport * from \"./helpers.js\";\nexport * from \"./classifier.js\";\nexport * from \"./normalize.js\";\n\nexport { classifySuiTransactionForAsset as classify } from \"./classifier.js\";\nexport { extractAssetFlows as buildFlows } from \"./normalize.js\";\nexport { normalizeAssetHistory as buildAssetHistory } from \"./normalize.js\";\nexport { reconstructOwnershipPeriods as buildOwnershipPeriods } from \"./normalize.js\";\n","import type {\n SuiAssetOwnerChange,\n SuiBalanceChangeLike,\n SuiEventLike,\n SuiObjectChangeLike,\n SuiObjectOwnerLike,\n SuiTransactionBlockLike,\n} from \"./types.js\";\n\nexport const SUI_COIN_TYPE = \"0x2::sui::SUI\";\n\nexport const POPKINS_MINTED_EVENT_SUFFIX = \"::popkins_nft::PopkinsMinted\";\nexport const POPKINS_STAKED_EVENT_SUFFIX = \"::events::PopkinsStakedEvent\";\nexport const POPKINS_UNSTAKED_EVENT_SUFFIX = \"::events::PopkinsUnstakedEvent\";\nexport const TRADEPORT_BUY_SIMPLE_EVENT_SUFFIX = \"::tradeport_listings::BuySimpleListingEvent\";\nexport const TRADEPORT_MATCH_SINGLE_BID_EVENT_SUFFIX = \"::tradeport_biddings::MatchSingleBidEvent\";\nexport const TRADEPORT_KIOSK_BUY_EVENT_SUFFIX = \"::kiosk_listings::BuyEvent\";\nexport const TRADEPORT_ADD_LISTING_EVENT_SUFFIX = \"::tradeport_orderbook::AddListingEvent\";\nexport const TRADEPORT_RELIST_SIMPLE_EVENT_SUFFIX = \"::tradeport_listings::RelistSimpleListingEvent\";\nexport const TRADEPORT_REMOVE_LISTING_EVENT_SUFFIX = \"::tradeport_orderbook::RemoveListingEvent\";\nexport const TRADEPORT_CANCEL_SIMPLE_EVENT_SUFFIX = \"::tradeport_listings::CancelSimpleListingEvent\";\nexport const TRADEPORT_CREATE_SINGLE_BID_EVENT_SUFFIX = \"::tradeport_biddings::CreateSingleBidEvent\";\nexport const KIOSK_LIST_EVENT_SUFFIX = \"::kiosk_listings::ListEvent\";\nexport const KIOSK_UNLIST_EVENT_SUFFIX = \"::kiosk_listings::UnlistEvent\";\nexport const KIOSK_TRANSFER_EVENT_SUFFIX = \"::kiosk_transfers::TransferWithPurchaseCapEvent\";\nexport const KIOSK_CLAIM_EVENT_SUFFIX = \"::kiosk_transfers::ClaimWithPurchaseCapEvent\";\nexport const PERSONAL_KIOSK_CREATED_EVENT_SUFFIX = \"::personal_kiosk::NewPersonalKiosk\";\nexport const KIOSK_BIDDING_CLAIM_EVENT_SUFFIX = \"::kiosk_biddings::ClaimWithPurchaseCapEvent\";\n\nexport type SuiAssetOwnerRefKind = \"address\" | \"object\" | \"shared\" | \"immutable\" | \"consensus\";\n\nexport interface SuiAssetOwnerRef {\n value: string;\n kind: SuiAssetOwnerRefKind;\n}\n\nexport interface SuiAssetOwnerChangeDetails {\n sender: string | null;\n nextOwner: SuiAssetOwnerRef | null;\n objectType: string | null;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function getString(value: unknown): string | null {\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nexport function getRecordString(record: Record<string, unknown>, key: string): string | null {\n return getString(record[key]);\n}\n\nexport function getRecordStringArray(record: Record<string, unknown>, key: string): string[] {\n const value = record[key];\n return Array.isArray(value) ? value.flatMap((entry) => (typeof entry === \"string\" ? [entry] : [])) : [];\n}\n\nexport function eventTypeMatches(event: Pick<SuiEventLike, \"type\">, suffixes: readonly string[]): boolean {\n return suffixes.some((suffix) => event.type.endsWith(suffix));\n}\n\nexport function normalizeOwnerRef(owner: SuiObjectOwnerLike): SuiAssetOwnerRef | null {\n if (!owner) {\n return null;\n }\n\n if (owner === \"Immutable\") {\n return { value: \"Immutable\", kind: \"immutable\" };\n }\n\n if (\"AddressOwner\" in owner) {\n return { value: owner.AddressOwner, kind: \"address\" };\n }\n\n if (\"ObjectOwner\" in owner) {\n return { value: owner.ObjectOwner, kind: \"object\" };\n }\n\n if (\"Shared\" in owner) {\n return {\n value: `Shared:${owner.Shared.initial_shared_version}`,\n kind: \"shared\",\n };\n }\n\n if (\"ConsensusV2\" in owner) {\n return { value: \"ConsensusV2\", kind: \"consensus\" };\n }\n\n return null;\n}\n\nexport function getAssetObjectChange(tx: SuiTransactionBlockLike, assetId: string): SuiObjectChangeLike | null {\n const changes = tx.objectChanges ?? [];\n const matches = changes.filter((change) => change.objectId === assetId);\n return matches[matches.length - 1] ?? null;\n}\n\nexport function getAssetOwnerChangeDetails(\n tx: SuiTransactionBlockLike,\n assetId: string,\n): SuiAssetOwnerChangeDetails | null {\n const change = getAssetObjectChange(tx, assetId);\n if (!change) {\n return null;\n }\n\n return {\n sender: getString(change.sender) ?? getString(tx.transaction?.data?.sender),\n nextOwner: normalizeOwnerRef(change.owner ?? change.recipient),\n objectType: getString(change.objectType),\n };\n}\n\nexport function getAssetOwnerChange(tx: SuiTransactionBlockLike, assetId: string): SuiAssetOwnerChange | null {\n const ownerChange = getAssetOwnerChangeDetails(tx, assetId);\n if (!ownerChange) {\n return null;\n }\n\n return {\n sender: ownerChange.sender,\n nextOwner: ownerChange.nextOwner?.value ?? null,\n nextOwnerKind: ownerChange.nextOwner?.kind ?? null,\n objectType: ownerChange.objectType,\n };\n}\n\nexport function eventTouchesAsset(event: SuiEventLike, assetId: string): boolean {\n if (!isRecord(event.parsedJson)) {\n return false;\n }\n\n const parsedJson = event.parsedJson;\n const directMatches = [\"nft_id\", \"maybe_nft_id\", \"popkins_id\", \"object_id\"]\n .map((key) => getRecordString(parsedJson, key))\n .filter((value): value is string => value !== null);\n\n if (directMatches.includes(assetId)) {\n return true;\n }\n\n return (\n getRecordStringArray(parsedJson, \"proposer_nft_ids\").includes(assetId) ||\n getRecordStringArray(parsedJson, \"counterparty_nft_ids\").includes(assetId)\n );\n}\n\nexport function getAssetEvents(tx: SuiTransactionBlockLike, assetId: string): SuiEventLike[] {\n return (tx.events ?? []).filter((event) => eventTouchesAsset(event, assetId));\n}\n\nexport function getEventTypes(events: SuiEventLike[]): string[] {\n return [...new Set(events.map((event) => event.type))];\n}\n\nexport function findFirstEvent(events: SuiEventLike[], suffixes: readonly string[]): SuiEventLike | null {\n for (const event of events) {\n if (eventTypeMatches(event, suffixes)) {\n return event;\n }\n }\n\n return null;\n}\n\nexport function getPriceRaw(event: SuiEventLike | null): string | null {\n if (!event || !isRecord(event.parsedJson)) {\n return null;\n }\n\n return getRecordString(event.parsedJson, \"price\") ?? getRecordString(event.parsedJson, \"new_price\");\n}\n\nexport function getMarket(event: SuiEventLike | null, fallback: string | null = null): string | null {\n if (!event || !isRecord(event.parsedJson)) {\n return fallback;\n }\n\n return getRecordString(event.parsedJson, \"market\") ?? fallback;\n}\n\nexport function hasMeaningfulSuiSettlement(balanceChanges: SuiBalanceChangeLike[] | null | undefined): boolean {\n return (balanceChanges ?? []).some((change) => {\n const amount = change.amount ?? \"0\";\n return change.coinType === SUI_COIN_TYPE && amount !== \"0\";\n });\n}\n","import type { SuiAssetFlowClassification, SuiTransactionBlockLike } from \"./types.js\";\nimport {\n findFirstEvent,\n getAssetEvents,\n getAssetOwnerChange,\n getEventTypes,\n getMarket,\n getPriceRaw,\n hasMeaningfulSuiSettlement,\n KIOSK_BIDDING_CLAIM_EVENT_SUFFIX,\n KIOSK_CLAIM_EVENT_SUFFIX,\n KIOSK_LIST_EVENT_SUFFIX,\n KIOSK_TRANSFER_EVENT_SUFFIX,\n KIOSK_UNLIST_EVENT_SUFFIX,\n PERSONAL_KIOSK_CREATED_EVENT_SUFFIX,\n POPKINS_MINTED_EVENT_SUFFIX,\n POPKINS_STAKED_EVENT_SUFFIX,\n POPKINS_UNSTAKED_EVENT_SUFFIX,\n SUI_COIN_TYPE,\n TRADEPORT_ADD_LISTING_EVENT_SUFFIX,\n TRADEPORT_BUY_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_CANCEL_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_CREATE_SINGLE_BID_EVENT_SUFFIX,\n TRADEPORT_KIOSK_BUY_EVENT_SUFFIX,\n TRADEPORT_MATCH_SINGLE_BID_EVENT_SUFFIX,\n TRADEPORT_RELIST_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_REMOVE_LISTING_EVENT_SUFFIX,\n} from \"./helpers.js\";\n\nfunction buildClassification(\n tx: SuiTransactionBlockLike,\n assetId: string,\n overrides: Omit<SuiAssetFlowClassification, \"assetId\" | \"eventTypes\" | \"ownerChange\">,\n): SuiAssetFlowClassification {\n const assetEvents = getAssetEvents(tx, assetId);\n\n return {\n assetId,\n eventTypes: getEventTypes(assetEvents),\n ownerChange: getAssetOwnerChange(tx, assetId),\n ...overrides,\n };\n}\n\nexport function classifySuiTransactionForAsset(\n tx: SuiTransactionBlockLike,\n assetId: string,\n): SuiAssetFlowClassification {\n const assetEvents = getAssetEvents(tx, assetId);\n const ownerChange = getAssetOwnerChange(tx, assetId);\n const eventTypes = getEventTypes(assetEvents);\n\n const mintEvent = findFirstEvent(assetEvents, [POPKINS_MINTED_EVENT_SUFFIX]);\n if (mintEvent) {\n return {\n assetId,\n family: \"NFT_MINT\",\n effect: \"OWNERSHIP_CHANGE_ONLY\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"MINT\",\n matcherId: \"sui.popkins-mint\",\n reason: \"matched_popkins_minted_event\",\n hasOwnershipChange: true,\n shouldExtractValueMovements: false,\n eventTypes,\n market: null,\n priceRaw: null,\n currency: null,\n ownerChange,\n };\n }\n\n const saleEvent = findFirstEvent(assetEvents, [\n TRADEPORT_BUY_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_MATCH_SINGLE_BID_EVENT_SUFFIX,\n TRADEPORT_KIOSK_BUY_EVENT_SUFFIX,\n ]);\n if (saleEvent) {\n return {\n assetId,\n family: \"TRADEPORT_SALE\",\n effect: \"OWNERSHIP_CHANGE_AND_SETTLEMENT\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"SALE\",\n matcherId: \"sui.tradeport-sale\",\n reason: \"matched_tradeport_sale_event\",\n hasOwnershipChange: true,\n shouldExtractValueMovements: true,\n eventTypes,\n market: getMarket(saleEvent, \"tradeport\"),\n priceRaw: getPriceRaw(saleEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n const swapEvent = assetEvents.find((event) => event.type.includes(\"SwapExecuted\"));\n if (swapEvent) {\n return {\n assetId,\n family: \"POPSWAP\",\n effect: \"OWNERSHIP_CHANGE_AND_SETTLEMENT\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"SWAP\",\n matcherId: \"sui.popswap-swap-executed\",\n reason: \"matched_popswap_swap_executed_event\",\n hasOwnershipChange: true,\n shouldExtractValueMovements: true,\n eventTypes,\n market: \"popswap\",\n priceRaw: null,\n currency: hasMeaningfulSuiSettlement(tx.balanceChanges) ? SUI_COIN_TYPE : null,\n ownerChange,\n };\n }\n\n const stakedEvent = findFirstEvent(assetEvents, [POPKINS_STAKED_EVENT_SUFFIX]);\n if (stakedEvent) {\n return {\n assetId,\n family: \"POPKINS_STAKING\",\n effect: \"NO_MINT_EFFECT\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"LOCK\",\n matcherId: \"sui.popkins-staking-lock\",\n reason: \"matched_popkins_staked_event\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: null,\n priceRaw: null,\n currency: null,\n ownerChange,\n };\n }\n\n const unstakedEvent = findFirstEvent(assetEvents, [POPKINS_UNSTAKED_EVENT_SUFFIX]);\n if (unstakedEvent) {\n return {\n assetId,\n family: \"POPKINS_STAKING\",\n effect: \"OWNERSHIP_CHANGE_ONLY\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"UNLOCK\",\n matcherId: \"sui.popkins-staking-unlock\",\n reason: \"matched_popkins_unstaked_event\",\n hasOwnershipChange: true,\n shouldExtractValueMovements: false,\n eventTypes,\n market: null,\n priceRaw: null,\n currency: null,\n ownerChange,\n };\n }\n\n const relistEvent = findFirstEvent(assetEvents, [TRADEPORT_RELIST_SIMPLE_EVENT_SUFFIX]);\n if (relistEvent) {\n return {\n assetId,\n family: \"TRADEPORT_LISTING\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"SKIP_FLOW\",\n confidence: \"high\",\n derivedType: \"LIST\",\n matcherId: \"sui.tradeport-relist\",\n reason: \"matched_tradeport_relist_price_change\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: getMarket(relistEvent, \"tradeport\"),\n priceRaw: getPriceRaw(relistEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n const listingEvent = findFirstEvent(assetEvents, [TRADEPORT_ADD_LISTING_EVENT_SUFFIX]);\n if (listingEvent) {\n return {\n assetId,\n family: \"TRADEPORT_LISTING\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"LIST\",\n matcherId: \"sui.tradeport-listing\",\n reason: \"matched_tradeport_listing_event\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: getMarket(listingEvent, \"tradeport\"),\n priceRaw: getPriceRaw(listingEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n const delistEvent = findFirstEvent(assetEvents, [\n TRADEPORT_CANCEL_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_REMOVE_LISTING_EVENT_SUFFIX,\n ]);\n if (delistEvent) {\n return {\n assetId,\n family: \"TRADEPORT_LISTING\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"DELIST\",\n matcherId: \"sui.tradeport-delist\",\n reason: \"matched_tradeport_cancel_listing_event\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: getMarket(delistEvent, \"tradeport\"),\n priceRaw: getPriceRaw(delistEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n const kioskListEvent = findFirstEvent(assetEvents, [KIOSK_LIST_EVENT_SUFFIX]);\n const kioskUnlistEvent = findFirstEvent(assetEvents, [KIOSK_UNLIST_EVENT_SUFFIX]);\n\n if (kioskListEvent && kioskUnlistEvent) {\n return {\n assetId,\n family: \"KIOSK_LISTING\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"SKIP_FLOW\",\n confidence: \"high\",\n derivedType: \"LIST\",\n matcherId: \"sui.kiosk-price-change\",\n reason: \"matched_kiosk_unlist_and_list_in_same_tx_price_change\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: getMarket(kioskListEvent),\n priceRaw: getPriceRaw(kioskListEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n if (kioskListEvent) {\n return {\n assetId,\n family: \"KIOSK_LISTING\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"LIST\",\n matcherId: \"sui.kiosk-listing\",\n reason: \"matched_kiosk_list_event\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: getMarket(kioskListEvent),\n priceRaw: getPriceRaw(kioskListEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n if (kioskUnlistEvent) {\n return {\n assetId,\n family: \"KIOSK_LISTING\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"high\",\n derivedType: \"DELIST\",\n matcherId: \"sui.kiosk-delist\",\n reason: \"matched_kiosk_unlist_event\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: getMarket(kioskUnlistEvent),\n priceRaw: getPriceRaw(kioskUnlistEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n const kioskTransferEvent = findFirstEvent(assetEvents, [KIOSK_TRANSFER_EVENT_SUFFIX, KIOSK_CLAIM_EVENT_SUFFIX]);\n if (kioskTransferEvent) {\n return {\n assetId,\n family: \"KIOSK_CUSTODY\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"SKIP_FLOW\",\n confidence: \"high\",\n derivedType: \"TRANSFER\",\n matcherId: \"sui.kiosk-custody-transfer\",\n reason: \"matched_kiosk_transfer_or_claim_custody_operation\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: null,\n priceRaw: null,\n currency: null,\n ownerChange,\n };\n }\n\n const allEvents = tx.events ?? [];\n const personalKioskEvent = findFirstEvent(allEvents, [PERSONAL_KIOSK_CREATED_EVENT_SUFFIX]);\n const kioskBiddingClaimEvent = findFirstEvent(assetEvents, [KIOSK_BIDDING_CLAIM_EVENT_SUFFIX]);\n if (personalKioskEvent && kioskBiddingClaimEvent && !hasMeaningfulSuiSettlement(tx.balanceChanges)) {\n return {\n assetId,\n family: \"KIOSK_CUSTODY\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"SKIP_FLOW\",\n confidence: \"high\",\n derivedType: \"TRANSFER\",\n matcherId: \"sui.personal-kiosk-claim\",\n reason: \"matched_personal_kiosk_creation_with_claim_no_settlement\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: null,\n priceRaw: null,\n currency: null,\n ownerChange,\n };\n }\n\n const bidIntentEvent = findFirstEvent(assetEvents, [TRADEPORT_CREATE_SINGLE_BID_EVENT_SUFFIX]);\n if (bidIntentEvent) {\n return {\n assetId,\n family: \"TRADEPORT_BID_INTENT\",\n effect: \"NON_SETTLEMENT_MARKETPLACE_ACTION\",\n materialization: \"SKIP_FLOW\",\n confidence: \"high\",\n derivedType: \"UNKNOWN\",\n matcherId: \"sui.tradeport-bid-intent\",\n reason: \"matched_tradeport_bid_intent_event\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n eventTypes,\n market: \"tradeport\",\n priceRaw: getPriceRaw(bidIntentEvent),\n currency: SUI_COIN_TYPE,\n ownerChange,\n };\n }\n\n if (ownerChange?.nextOwner) {\n return {\n assetId,\n family: \"GENERIC_OBJECT_TRANSFER\",\n effect: \"OWNERSHIP_CHANGE_ONLY\",\n materialization: \"PERSIST_FLOW\",\n confidence: \"medium\",\n derivedType: \"TRANSFER\",\n matcherId: \"sui.generic-object-transfer\",\n reason: \"matched_asset_object_change_without_protocol_event\",\n hasOwnershipChange: true,\n shouldExtractValueMovements: false,\n eventTypes,\n market: null,\n priceRaw: null,\n currency: null,\n ownerChange,\n };\n }\n\n return buildClassification(tx, assetId, {\n family: \"UNKNOWN\",\n effect: \"UNKNOWN\",\n materialization: \"REVIEW\",\n confidence: \"low\",\n derivedType: \"UNKNOWN\",\n matcherId: \"sui.unknown\",\n reason: \"no_supported_sui_asset_flow_matcher\",\n hasOwnershipChange: false,\n shouldExtractValueMovements: false,\n market: null,\n priceRaw: null,\n currency: null,\n });\n}\n","import { canonicalizeMintFlows } from \"../../semantics/canonicalize.js\";\nimport { collapseRedundantCustodyFlows } from \"../../semantics/custody.js\";\nimport { reconstructOwnershipPeriods as buildOwnershipPeriods } from \"../../semantics/ownership.js\";\nimport type { ExtractedMintFlow, ReconstructedOwnershipPeriod } from \"../../types.js\";\nimport { classifySuiTransactionForAsset } from \"./classifier.js\";\nimport {\n findFirstEvent,\n getAssetEvents,\n getAssetOwnerChangeDetails,\n getString,\n getRecordStringArray,\n normalizeOwnerRef,\n KIOSK_LIST_EVENT_SUFFIX,\n KIOSK_UNLIST_EVENT_SUFFIX,\n SUI_COIN_TYPE,\n TRADEPORT_ADD_LISTING_EVENT_SUFFIX,\n TRADEPORT_BUY_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_CANCEL_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_KIOSK_BUY_EVENT_SUFFIX,\n TRADEPORT_MATCH_SINGLE_BID_EVENT_SUFFIX,\n TRADEPORT_REMOVE_LISTING_EVENT_SUFFIX,\n} from \"./helpers.js\";\nimport type { SuiAssetFlowClassification, SuiEventLike, SuiTransactionBlockLike } from \"./types.js\";\n\nexport { reconstructOwnershipPeriods } from \"../../semantics/ownership.js\";\n\nfunction parseSaleParticipants(saleEvent: SuiEventLike | null): {\n buyer: string | null;\n seller: string | null;\n} {\n if (!saleEvent || typeof saleEvent.parsedJson !== \"object\" || saleEvent.parsedJson === null) {\n return {\n buyer: null,\n seller: null,\n };\n }\n\n const parsedJson = saleEvent.parsedJson as Record<string, unknown>;\n return {\n buyer: getString(parsedJson.buyer),\n seller: getString(parsedJson.seller),\n };\n}\n\nfunction parseSwapParticipants(\n swapEvent: SuiEventLike | null,\n assetId: string,\n): {\n fromAddress: string | null;\n toAddress: string | null;\n} {\n if (!swapEvent || typeof swapEvent.parsedJson !== \"object\" || swapEvent.parsedJson === null) {\n return {\n fromAddress: null,\n toAddress: null,\n };\n }\n\n const parsedJson = swapEvent.parsedJson as Record<string, unknown>;\n const proposer = getString(parsedJson.proposer);\n const counterparty = getString(parsedJson.counterparty);\n const proposerAssetIds = getRecordStringArray(parsedJson, \"proposer_nft_ids\");\n const counterpartyAssetIds = getRecordStringArray(parsedJson, \"counterparty_nft_ids\");\n\n if (proposerAssetIds.includes(assetId)) {\n return {\n fromAddress: proposer,\n toAddress: counterparty,\n };\n }\n\n if (counterpartyAssetIds.includes(assetId)) {\n return {\n fromAddress: counterparty,\n toAddress: proposer,\n };\n }\n\n return {\n fromAddress: proposer,\n toAddress: counterparty,\n };\n}\n\nfunction parseListingSeller(event: SuiEventLike | null): string | null {\n if (!event || typeof event.parsedJson !== \"object\" || event.parsedJson === null) {\n return null;\n }\n\n return getString((event.parsedJson as Record<string, unknown>).seller);\n}\n\nfunction getObjectChangeById(\n tx: SuiTransactionBlockLike,\n objectId: string,\n): NonNullable<SuiTransactionBlockLike[\"objectChanges\"]>[number] | null {\n const matches = (tx.objectChanges ?? []).filter((change) => change.objectId === objectId);\n return matches[matches.length - 1] ?? null;\n}\n\nfunction resolveKioskOwnerAddress(\n tx: SuiTransactionBlockLike,\n options: { preferCreated?: boolean } = {},\n): string | null {\n const ownerCapChanges = (tx.objectChanges ?? []).filter((change) =>\n getString(change.objectType)?.endsWith(\"::kiosk::KioskOwnerCap\"),\n );\n\n if (options.preferCreated) {\n const createdOwners = [\n ...new Set(\n ownerCapChanges\n .filter((change) => change.type === \"created\")\n .flatMap((change) => {\n const owner = normalizeOwnerRef(change.owner ?? change.recipient);\n return owner?.kind === \"address\" ? [owner.value] : [];\n }),\n ),\n ];\n\n if (createdOwners.length === 1) {\n return createdOwners[0]!;\n }\n }\n\n const addressOwners = [\n ...new Set(\n ownerCapChanges.flatMap((change) => {\n const owner = normalizeOwnerRef(change.owner ?? change.recipient);\n return owner?.kind === \"address\" ? [owner.value] : [];\n }),\n ),\n ];\n\n return addressOwners.length === 1 ? addressOwners[0]! : null;\n}\n\nfunction resolveAddressOwnerFromObjectChain(tx: SuiTransactionBlockLike, rootObjectId: string): string | null {\n const visited = new Set<string>();\n let currentObjectId: string | null = rootObjectId;\n\n while (currentObjectId && !visited.has(currentObjectId)) {\n visited.add(currentObjectId);\n\n const change = getObjectChangeById(tx, currentObjectId);\n if (!change) {\n return null;\n }\n\n if (getString(change.objectType)?.endsWith(\"::kiosk::Kiosk\")) {\n return resolveKioskOwnerAddress(tx, {\n preferCreated: change.type === \"created\",\n });\n }\n\n const owner = normalizeOwnerRef(change.owner ?? change.recipient);\n if (!owner) {\n return null;\n }\n\n if (owner.kind === \"address\") {\n return owner.value;\n }\n\n if (owner.kind === \"object\") {\n currentObjectId = owner.value;\n continue;\n }\n\n if (owner.kind === \"shared\") {\n return resolveKioskOwnerAddress(tx);\n }\n\n return null;\n }\n\n return null;\n}\n\nfunction resolveNextBeneficialOwner(\n tx: SuiTransactionBlockLike,\n ownerChange: ReturnType<typeof getAssetOwnerChangeDetails>,\n): string | null {\n if (!ownerChange?.nextOwner) {\n return null;\n }\n\n if (ownerChange.nextOwner.kind === \"address\") {\n return ownerChange.nextOwner.value;\n }\n\n if (ownerChange.nextOwner.kind === \"object\") {\n return resolveAddressOwnerFromObjectChain(tx, ownerChange.nextOwner.value);\n }\n\n if (ownerChange.nextOwner.kind === \"shared\") {\n return resolveKioskOwnerAddress(tx);\n }\n\n return null;\n}\n\nfunction sortTransactions(transactions: SuiTransactionBlockLike[]): SuiTransactionBlockLike[] {\n return [...transactions].sort((left, right) => {\n const leftTime = Number(left.timestampMs ?? 0) || 0;\n const rightTime = Number(right.timestampMs ?? 0) || 0;\n if (leftTime !== rightTime) {\n return leftTime - rightTime;\n }\n\n const leftSlot = Number(left.checkpoint ?? 0) || 0;\n const rightSlot = Number(right.checkpoint ?? 0) || 0;\n if (leftSlot !== rightSlot) {\n return leftSlot - rightSlot;\n }\n\n return left.digest.localeCompare(right.digest);\n });\n}\n\nfunction resolveTimestamp(tx: SuiTransactionBlockLike): number {\n const timestampMs = Number(tx.timestampMs ?? NaN);\n if (Number.isFinite(timestampMs) && timestampMs > 0) {\n return Math.trunc(timestampMs / 1000);\n }\n\n throw new Error(`Missing timestamp for Sui asset-flow tx ${tx.digest}`);\n}\n\nfunction resolveSlot(tx: SuiTransactionBlockLike): number | null {\n const checkpoint = Number(tx.checkpoint ?? NaN);\n return Number.isFinite(checkpoint) ? checkpoint : null;\n}\n\nfunction buildFlow(\n tx: SuiTransactionBlockLike,\n timestamp: number,\n params: {\n fromAddress: string | null;\n toAddress: string | null;\n derivedType: ExtractedMintFlow[\"derivedType\"];\n transferIndex?: number;\n },\n): ExtractedMintFlow {\n return {\n signature: tx.digest,\n slot: resolveSlot(tx),\n timestamp,\n heliusType: \"SUI\",\n source: \"sui\",\n fromAddress: params.fromAddress,\n toAddress: params.toAddress,\n transferIndex: params.transferIndex ?? 0,\n tokenStandard: null,\n derivedType: params.derivedType,\n };\n}\n\nfunction buildSuiFlows(\n tx: SuiTransactionBlockLike,\n assetId: string,\n classification: SuiAssetFlowClassification,\n currentBeneficialOwner: string | null,\n): ExtractedMintFlow[] {\n if (classification.materialization !== \"PERSIST_FLOW\") {\n return [];\n }\n\n const timestamp = resolveTimestamp(tx);\n const assetEvents = getAssetEvents(tx, assetId);\n const ownerChange = getAssetOwnerChangeDetails(tx, assetId);\n const sender = getString(tx.transaction?.data?.sender) ?? ownerChange?.sender ?? null;\n const addressOwner =\n (ownerChange?.nextOwner?.kind === \"address\" ? ownerChange.nextOwner.value : null) ??\n resolveNextBeneficialOwner(tx, ownerChange);\n\n let fromAddress: string | null = null;\n let toAddress: string | null = null;\n\n switch (classification.derivedType) {\n case \"MINT\":\n toAddress = addressOwner ?? sender ?? null;\n break;\n case \"SALE\": {\n const saleEvent = findFirstEvent(assetEvents, [\n TRADEPORT_BUY_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_MATCH_SINGLE_BID_EVENT_SUFFIX,\n TRADEPORT_KIOSK_BUY_EVENT_SUFFIX,\n ]);\n const sale = parseSaleParticipants(saleEvent);\n fromAddress = currentBeneficialOwner ?? sale.seller ?? sender ?? null;\n toAddress = sale.buyer ?? addressOwner ?? sender ?? null;\n break;\n }\n case \"SWAP\": {\n const swapEvent = assetEvents.find((event) => event.type.includes(\"SwapExecuted\")) ?? null;\n const swap = parseSwapParticipants(swapEvent, assetId);\n fromAddress = currentBeneficialOwner ?? swap.fromAddress ?? sender ?? null;\n toAddress = swap.toAddress ?? addressOwner ?? sender ?? null;\n break;\n }\n case \"TRANSFER\":\n fromAddress = currentBeneficialOwner ?? sender ?? null;\n toAddress =\n addressOwner ??\n (ownerChange?.nextOwner?.kind === \"object\" ? (sender ?? currentBeneficialOwner ?? null) : (sender ?? null));\n break;\n case \"LIST\": {\n const listingEvent = findFirstEvent(assetEvents, [TRADEPORT_ADD_LISTING_EVENT_SUFFIX, KIOSK_LIST_EVENT_SUFFIX]);\n const owner = parseListingSeller(listingEvent) ?? currentBeneficialOwner ?? sender ?? addressOwner;\n fromAddress = owner;\n toAddress = owner;\n break;\n }\n case \"DELIST\":\n case \"LOCK\":\n case \"UNLOCK\": {\n const delistEvent =\n classification.derivedType === \"DELIST\"\n ? findFirstEvent(assetEvents, [\n TRADEPORT_CANCEL_SIMPLE_EVENT_SUFFIX,\n TRADEPORT_REMOVE_LISTING_EVENT_SUFFIX,\n KIOSK_UNLIST_EVENT_SUFFIX,\n ])\n : null;\n const owner = parseListingSeller(delistEvent) ?? addressOwner ?? sender ?? currentBeneficialOwner;\n if (owner && currentBeneficialOwner && owner !== currentBeneficialOwner) {\n fromAddress = currentBeneficialOwner;\n toAddress = owner;\n } else {\n const custodyOwner = currentBeneficialOwner ?? owner;\n fromAddress = custodyOwner;\n toAddress = custodyOwner;\n }\n break;\n }\n default:\n return [];\n }\n\n return [\n buildFlow(tx, timestamp, {\n fromAddress,\n toAddress,\n derivedType: classification.derivedType,\n }),\n ];\n}\n\nexport function extractAssetFlows(\n transactions: SuiTransactionBlockLike[],\n assetId: string,\n classificationCache: Map<string, SuiAssetFlowClassification> = new Map(),\n): ExtractedMintFlow[] {\n const flows: ExtractedMintFlow[] = [];\n let currentBeneficialOwner: string | null = null;\n\n for (const tx of sortTransactions(transactions)) {\n const classification = classificationCache.get(tx.digest) ?? classifySuiTransactionForAsset(tx, assetId);\n\n classificationCache.set(tx.digest, classification);\n\n const txFlows = buildSuiFlows(tx, assetId, classification, currentBeneficialOwner);\n\n if (txFlows.length === 0) {\n continue;\n }\n\n txFlows.forEach((flow, index) => {\n flow.transferIndex = index;\n flows.push(flow);\n\n if (\n flow.toAddress &&\n (flow.derivedType === \"MINT\" ||\n flow.derivedType === \"TRANSFER\" ||\n flow.derivedType === \"SALE\" ||\n flow.derivedType === \"SWAP\" ||\n flow.derivedType === \"FORECLOSURE\") &&\n flow.toAddress !== currentBeneficialOwner\n ) {\n currentBeneficialOwner = flow.toAddress;\n }\n });\n }\n\n return collapseRedundantCustodyFlows(canonicalizeMintFlows(flows));\n}\n\nexport function normalizeAssetHistory(\n transactions: SuiTransactionBlockLike[],\n assetId: string,\n): {\n flows: ExtractedMintFlow[];\n periods: ReconstructedOwnershipPeriod[];\n} {\n const classificationCache = new Map<string, SuiAssetFlowClassification>();\n const flows = extractAssetFlows(transactions, assetId, classificationCache);\n const periods = buildOwnershipPeriods(flows);\n\n return {\n flows,\n periods,\n };\n}\n"],"mappings":"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","names":["MEANINGFUL_SETTLEMENT_LAMPORTS","ASSOCIATED_TOKEN_PROGRAM_ID","classification","classification","LAMPORTS_PER_SOL","classification","MEANINGFUL_SETTLEMENT_LAMPORTS","CLAY_STAKING_INSTRUCTION_LABELS","normalizedType","buildFlow","classification"]}