@merkl/api 0.19.32 → 0.19.34
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/database/api/.generated/edge.js +2 -2
- package/dist/database/api/.generated/index.js +2 -2
- package/dist/database/api/.generated/package.json +1 -1
- package/dist/database/api/.generated/schema.prisma +1 -1
- package/dist/src/eden/index.d.ts +30 -15
- package/dist/src/engine/opportunityMetadata/implementations/Erc20.js +3 -5
- package/dist/src/index.d.ts +6 -3
- package/dist/src/libs/deprecated-merklv3/index.js +0 -1
- package/dist/src/modules/v4/campaign/campaign.controller.d.ts +6 -3
- package/dist/src/modules/v4/campaign/campaign.controller.js +24 -58
- package/dist/src/modules/v4/campaign/campaign.repository.d.ts +1 -1
- package/dist/src/modules/v4/campaign/campaign.repository.js +1 -1
- package/dist/src/modules/v4/campaign/campaign.service.d.ts +14 -0
- package/dist/src/modules/v4/campaign/campaign.service.js +34 -22
- package/dist/src/modules/v4/opportunity/opportunity.repository.js +3 -1
- package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +6 -28
- package/dist/src/modules/v4/opportunity/opportunity.service.js +8 -45
- package/dist/src/modules/v4/protocol/protocol.service.js +0 -21
- package/dist/src/modules/v4/router.d.ts +6 -3
- package/dist/tsconfig.package.tsbuildinfo +1 -1
- package/package.json +1 -1
@@ -664,8 +664,8 @@ const config = {
|
|
664
664
|
}
|
665
665
|
}
|
666
666
|
},
|
667
|
-
"inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n binaryTargets = [\"native\", \"linux-arm64-openssl-1.1.x\", \"linux-musl-arm64-openssl-3.0.x\"]\n output = \".generated/\"\n previewFeatures = [\"fullTextSearchPostgres\", \"relationJoins\"]\n}\n\ngenerator drizzle {\n provider = \"drizzle-prisma-generator\"\n output = \".generated/drizzle/\" // Where to put generated Drizle tables\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_API_URL\")\n}\n\nmodel Campaign {\n id String @id\n ComputeChain Chain @relation(\"compute\", fields: [computeChainId], references: [id])\n computeChainId Int\n DistributionChain Chain @relation(\"distribution\", fields: [distributionChainId], references: [id])\n distributionChainId Int\n campaignId String\n type String\n // distributionType DistributionType @default(DUTCH_AUCTION)\n subType Int?\n RewardToken Token @relation(fields: [rewardTokenId], references: [id])\n rewardTokenId String\n amount String\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n startTimestamp BigInt\n endTimestamp BigInt\n params Json\n RewardBreakdown RewardBreakdown[]\n DailyRewardsBreakdown DailyRewardsBreakdown[]\n Creator User @relation(fields: [creatorAddress], references: [address])\n creatorAddress String @db.Char(42)\n // Should probably be a 1 to 1 relation if we do not want to keep historic records\n CampaignStatus CampaignStatus[]\n CampaignEngineValues CampaignComputedValue[]\n UserComputedValue UserComputedValue[]\n\n // Fields should be automatically parsable and overriden periodically UNLESS\n // they are manually overridden, in which case they should be kept as is\n manualOverrides CampaignManualOverride[] @default([])\n\n createdAt DateTime @default(now())\n\n @@unique([distributionChainId, campaignId])\n @@index([opportunityId], type: Hash)\n}\n\n// SubTable of Campaigns that should be here as soon as the campaign is processed\nmodel CampaignStatus {\n campaignId String @id\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n computedUntil BigInt\n processingStarted BigInt\n status RunStatus @default(SUCCESS)\n error String @default(\"\")\n details Json @default(\"{}\")\n}\n\n// SubTable of Campaigns that will contain values populated by the Engine when it's running\nmodel CampaignComputedValue {\n campaignId String @id\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n averageBoost Float? // Average boost in case of boosting hook\n totalDistributedInUSD Float? // Used in case there is a distribution cap\n forfeitingBoost Float? // In case some rewards are forfeited, resulting boost for remaining users\n}\n\nmodel UserComputedValue {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n campaignId String\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n address String @db.Char(42)\n User User? @relation(fields: [address], references: [address])\n reason String\n boost Float?\n\n @@unique([campaignId, address, reason])\n}\n\nmodel Chain {\n id Int @id\n name String\n icon String\n // liveCampaigns Int @default(0)\n // dailyRewards Float @default(0)\n Explorer Explorer[]\n Campaigns Campaign[] @relation(\"compute\")\n Distribution Campaign[] @relation(\"distribution\")\n Token Token[]\n Opportunity Opportunity[]\n MerklRoot MerklRoot[]\n Blacklist Blacklist[]\n Dump Dump[]\n}\n\nmodel Explorer {\n id String @id\n type ExplorerType\n Chain Chain @relation(fields: [chainId], references: [id])\n url String\n chainId Int\n\n @@unique([type, chainId])\n}\n\nmodel Opportunity {\n id String @id\n Chain Chain @relation(fields: [chainId], references: [id]) // compute\n chainId Int // compute\n type String\n identifier String // eg. 0xUniswapPool - formerly mainParameter\n name String\n depositUrl String?\n status Status\n action OpportunityAction\n Tokens Token[]\n Campaigns Campaign[]\n Protocols Protocol[]\n MainProtocol Protocol? @relation(name: \"main\", fields: [mainProtocolId], references: [id])\n mainProtocolId String?\n tvl Float @default(0)\n TvlRecords TVLRecord[]\n apr Float @default(0)\n AprRecords AprRecord[]\n dailyRewards Float @default(0)\n DailyRewardsRecords DailyRewardsRecord[]\n tags String[] @default([])\n\n // Fields should be automatically parsable and overriden periodically UNLESS\n // they are manually overridden, in which case they should be kept as is\n // manualOverrides OpportunityManualOverride[] @default([])\n\n @@unique([chainId, type, identifier])\n}\n\nmodel Protocol {\n id String @id\n tags String[] @default([])\n name String\n description String @default(\"\")\n url String\n icon String\n // liveCampaigns Int @default(0)\n // totalDailyRewards Float @default(0)\n MainOpportunities Opportunity[] @relation(name: \"main\")\n Opportunities Opportunity[]\n RewardBreakdown RewardBreakdown[]\n}\n\nmodel Token {\n id String @id()\n name String?\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n address String @db.Char(42)\n decimals Int\n symbol String\n displaySymbol String @default(\"\")\n icon String\n verified Boolean @default(false)\n isTest Boolean @default(false)\n isPoint Boolean @default(false)\n isNative Boolean @default(false)\n price Float?\n Opportunity Opportunity[]\n Campaigns Campaign[]\n Reward Reward[]\n DumpTo Dump[] @relation(\"to\")\n DumpFrom Dump[] @relation(\"from\")\n\n @@unique([chainId, address])\n @@index([chainId], type: Hash)\n @@index([symbol, address])\n}\n\nmodel AprRecord {\n id String @id\n timestamp BigInt\n cumulated Float\n AprBreakdown AprBreakdown[]\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n\n @@unique([opportunityId, timestamp])\n @@index([opportunityId, timestamp(sort: Desc)])\n}\n\nmodel AprBreakdown {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n identifier String\n type AprType\n value Float\n AprRecord AprRecord @relation(fields: [aprRecordId], references: [id])\n aprRecordId String\n\n @@index([aprRecordId], type: Hash)\n}\n\nmodel TVLRecord {\n id String @id\n timestamp BigInt\n total Float\n TvlBreakdown TVLBreakdown[]\n\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n\n @@unique([opportunityId, timestamp])\n @@index([opportunityId, timestamp(sort: Desc)])\n}\n\nmodel TVLBreakdown {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n identifier String\n type TvlType\n value Float\n\n TvlRecord TVLRecord @relation(fields: [tvlRecordId], references: [id])\n tvlRecordId String\n\n @@index([tvlRecordId], type: Hash)\n}\n\nmodel DailyRewardsRecord {\n id String @id\n timestamp BigInt\n total Float\n DailyRewardsBreakdown DailyRewardsBreakdown[]\n\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n\n @@unique([opportunityId, timestamp])\n @@index([opportunityId, timestamp(sort: Desc)])\n}\n\nmodel DailyRewardsBreakdown {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n value Float\n campaignId String\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n DailyRewardsRecord DailyRewardsRecord @relation(fields: [dailyRewardsRecordId], references: [id])\n dailyRewardsRecordId String\n\n @@index([dailyRewardsRecordId], type: Hash)\n}\n\nmodel User {\n address String @id @db.Char(42)\n Rewards Reward[]\n Blacklist Blacklist[]\n CampaignsCreated Campaign[]\n UserComputedValue UserComputedValue[]\n tags String[]\n\n Creator Creator? @relation(fields: [creatorId], references: [id])\n creatorId String?\n}\n\nmodel Creator {\n id String @id\n icon String?\n name String\n Users User[]\n}\n\nmodel Reward {\n id String @id\n MerklRoot MerklRoot @relation(fields: [root], references: [root])\n root String\n User User @relation(fields: [recipient], references: [address])\n recipient String @db.Char(42)\n RewardToken Token @relation(fields: [rewardTokenId], references: [id])\n rewardTokenId String\n amount String @default(\"0\")\n claimed String @default(\"0\")\n pending String @default(\"0\")\n proofs String[]\n Breakdown RewardBreakdown[]\n // Hidden index on ((CAST(amount AS INTEGER) + CAST(pending AS INTEGER)));\n\n @@unique([root, recipient, rewardTokenId])\n @@index([root], type: Hash)\n @@index([recipient, rewardTokenId])\n}\n\nmodel RewardBreakdown {\n id BigInt @id @default(autoincrement())\n Protocol Protocol? @relation(fields: [protocolId], references: [id])\n protocolId String?\n reason String\n amount String\n claimed String\n pending String\n Reward Reward @relation(fields: [rewardId], references: [id], onDelete: Cascade)\n rewardId String\n campaignId String\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n // Hidden index on ((CAST(amount AS INTEGER) + CAST(pending AS INTEGER)));\n\n @@unique([rewardId, campaignId, reason])\n @@index([rewardId], type: Hash)\n @@index([campaignId], type: Hash)\n}\n\nmodel MerklRoot {\n root String @id\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n epoch Int\n timestamp BigInt\n Rewards Reward[]\n\n @@index([chainId, root])\n}\n\nmodel PriceSource {\n id Int @id @default(autoincrement())\n symbol String @unique() // Price Id\n method PriceSourceMethod\n args Json?\n}\n\n// priceId -> number\n\nmodel Blacklist {\n id String @id\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n poolAddress String @db.Char(42)\n User User @relation(fields: [userAddress], references: [address])\n userAddress String @db.Char(42)\n arrestTimestamp BigInt\n arrestDetails Json\n\n @@unique([chainId, userAddress, poolAddress])\n @@index([userAddress], type: Hash)\n}\n\nmodel Dump {\n id String @id\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n FromToken Token @relation(name: \"from\", fields: [fromTokenId], references: [id])\n fromTokenId String\n ToToken Token @relation(name: \"to\", fields: [toTokenId], references: [id])\n toTokenId String\n multisig String @db.Char(42)\n recipient String @db.Char(42)\n amountIn String @default(\"0\")\n amountOut String @default(\"0\")\n datetime DateTime\n timestamp Int\n\n @@unique([chainId, fromTokenId, toTokenId, timestamp])\n}\n\nmodel Logged {\n id String @id\n chainId Int\n type LoggedEntityType @default(UNKNOWN)\n address String? @db.Char(42)\n fetchAtBlock Int\n caughtFromAddress String @db.Char(42)\n entityData Json\n\n @@unique([chainId, address])\n}\n\n// enums\n\nenum LoggedEntityType {\n UNKNOWN\n EULER_VAULT\n UNISWAP_V4\n COMPOUND_v2\n}\n\nenum RunStatus {\n PROCESSING\n SUCCESS\n FAILED\n SKIPPED\n}\n\nenum OpportunityAction {\n POOL\n HOLD\n DROP\n LEND\n BORROW\n LONG\n SHORT\n SWAP\n INVALID\n}\n\nenum Status {\n NONE // This would mean that no campaigns was ever created for this opportunity\n PAST\n LIVE\n SOON\n}\n\nenum ExplorerType {\n ETHERSCAN\n BLOCKSCOUT\n}\n\nenum AprType {\n CAMPAIGN\n TOKEN\n PROTOCOL\n}\n\nenum TvlType {\n TOKEN\n PROTOCOL\n}\n\nenum PriceSourceMethod {\n COINGECKO\n CONSTANT\n EQUAL_TO\n ERC4626\n DEXSCREENER\n INDEXCOOP\n DEFILLAMA\n}\n\nenum CampaignManualOverride {\n opportunityId\n creatorAddress\n}\n\nenum OpportunityManualOverride {\n identifier\n name\n depositUrl\n action\n mainProtocolId\n}\n\nenum DistributionType {\n DUTCH_AUCTION\n FIX_REWARD_VALUE_PER_LIQUIDITY_VALUE // The fix reward value will lie in params.apr\n FIX_REWARD_AMOUNT_PER_LIQUIDITY_VALUE\n FIX_REWARD_VALUE_PER_LIQUIDITY_AMOUNT\n FIX_REWARD_AMOUNT_PER_LIQUIDITY_AMOUNT\n}\n",
|
668
|
-
"inlineSchemaHash": "
|
667
|
+
"inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n binaryTargets = [\"native\", \"linux-arm64-openssl-1.1.x\", \"linux-musl-arm64-openssl-3.0.x\"]\n output = \".generated/\"\n previewFeatures = [\"fullTextSearchPostgres\", \"relationJoins\"]\n}\n\ngenerator drizzle {\n provider = \"drizzle-prisma-generator\"\n output = \".generated/drizzle/\" // Where to put generated Drizle tables\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_API_URL\")\n}\n\nmodel Campaign {\n id String @id\n ComputeChain Chain @relation(\"compute\", fields: [computeChainId], references: [id])\n computeChainId Int\n DistributionChain Chain @relation(\"distribution\", fields: [distributionChainId], references: [id])\n distributionChainId Int\n campaignId String\n type String\n // distributionType DistributionType @default(DUTCH_AUCTION)\n subType Int?\n RewardToken Token @relation(fields: [rewardTokenId], references: [id])\n rewardTokenId String\n amount String\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n startTimestamp BigInt\n endTimestamp BigInt\n params Json\n RewardBreakdown RewardBreakdown[]\n DailyRewardsBreakdown DailyRewardsBreakdown[]\n Creator User @relation(fields: [creatorAddress], references: [address])\n creatorAddress String @db.Char(42)\n // Should probably be a 1 to 1 relation if we do not want to keep historic records\n CampaignStatus CampaignStatus[]\n CampaignEngineValues CampaignComputedValue[]\n UserComputedValue UserComputedValue[]\n\n // Fields should be automatically parsable and overriden periodically UNLESS\n // they are manually overridden, in which case they should be kept as is\n manualOverrides CampaignManualOverride[] @default([])\n\n createdAt DateTime @default(now())\n\n @@unique([distributionChainId, campaignId])\n @@index([opportunityId], type: Hash)\n}\n\n// SubTable of Campaigns that should be here as soon as the campaign is processed\nmodel CampaignStatus {\n campaignId String @id\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n computedUntil BigInt\n processingStarted BigInt\n status RunStatus @default(SUCCESS)\n error String @default(\"\")\n details Json @default(\"{}\")\n}\n\n// SubTable of Campaigns that will contain values populated by the Engine when it's running\nmodel CampaignComputedValue {\n campaignId String @id\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n averageBoost Float? // Average boost in case of boosting hook\n totalDistributedInUSD Float? // Used in case there is a distribution cap\n forfeitingBoost Float? // In case some rewards are forfeited, resulting boost for remaining users\n}\n\nmodel UserComputedValue {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n campaignId String\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n address String @db.Char(42)\n User User? @relation(fields: [address], references: [address])\n reason String\n boost Float?\n\n @@unique([campaignId, address, reason])\n}\n\nmodel Chain {\n id Int @id\n name String\n icon String\n // liveCampaigns Int @default(0)\n // dailyRewards Float @default(0)\n Explorer Explorer[]\n Campaigns Campaign[] @relation(\"compute\")\n Distribution Campaign[] @relation(\"distribution\")\n Token Token[]\n Opportunity Opportunity[]\n MerklRoot MerklRoot[]\n Blacklist Blacklist[]\n Dump Dump[]\n}\n\nmodel Explorer {\n id String @id\n type ExplorerType\n Chain Chain @relation(fields: [chainId], references: [id])\n url String\n chainId Int\n\n @@unique([type, chainId])\n}\n\nmodel Opportunity {\n id String @id\n Chain Chain @relation(fields: [chainId], references: [id]) // compute\n chainId Int // compute\n type String\n identifier String // eg. 0xUniswapPool - formerly mainParameter\n name String\n depositUrl String?\n status Status\n action OpportunityAction\n Tokens Token[]\n Campaigns Campaign[]\n Protocols Protocol[]\n MainProtocol Protocol? @relation(name: \"main\", fields: [mainProtocolId], references: [id])\n mainProtocolId String?\n tvl Float @default(0)\n TvlRecords TVLRecord[]\n apr Float @default(0)\n AprRecords AprRecord[]\n dailyRewards Float @default(0)\n DailyRewardsRecords DailyRewardsRecord[]\n tags String[] @default([])\n\n // Fields should be automatically parsable and overriden periodically UNLESS\n // they are manually overridden, in which case they should be kept as is\n // manualOverrides OpportunityManualOverride[] @default([])\n\n @@unique([chainId, type, identifier])\n}\n\nmodel Protocol {\n id String @id\n tags String[] @default([])\n name String\n description String @default(\"\")\n url String\n icon String\n // liveCampaigns Int @default(0)\n // totalDailyRewards Float @default(0)\n MainOpportunities Opportunity[] @relation(name: \"main\")\n Opportunities Opportunity[]\n RewardBreakdown RewardBreakdown[]\n}\n\nmodel Token {\n id String @id()\n name String?\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n address String @db.Char(42)\n decimals Int\n symbol String\n displaySymbol String @default(\"\")\n icon String\n verified Boolean @default(false)\n isTest Boolean @default(false)\n isPoint Boolean @default(false)\n isNative Boolean @default(false)\n price Float?\n Opportunity Opportunity[]\n Campaigns Campaign[]\n Reward Reward[]\n DumpTo Dump[] @relation(\"to\")\n DumpFrom Dump[] @relation(\"from\")\n\n @@unique([chainId, address])\n @@index([chainId], type: Hash)\n @@index([symbol, address])\n}\n\nmodel AprRecord {\n id String @id\n timestamp BigInt\n cumulated Float\n AprBreakdown AprBreakdown[]\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n\n @@unique([opportunityId, timestamp])\n @@index([opportunityId, timestamp(sort: Desc)])\n}\n\nmodel AprBreakdown {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n identifier String\n type AprType\n value Float\n AprRecord AprRecord @relation(fields: [aprRecordId], references: [id])\n aprRecordId String\n\n @@index([aprRecordId], type: Hash)\n}\n\nmodel TVLRecord {\n id String @id\n timestamp BigInt\n total Float\n TvlBreakdown TVLBreakdown[]\n\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n\n @@unique([opportunityId, timestamp])\n @@index([opportunityId, timestamp(sort: Desc)])\n}\n\nmodel TVLBreakdown {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n identifier String\n type TvlType\n value Float\n\n TvlRecord TVLRecord @relation(fields: [tvlRecordId], references: [id])\n tvlRecordId String\n\n @@index([tvlRecordId], type: Hash)\n}\n\nmodel DailyRewardsRecord {\n id String @id\n timestamp BigInt\n total Float\n DailyRewardsBreakdown DailyRewardsBreakdown[]\n\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n\n @@unique([opportunityId, timestamp])\n @@index([opportunityId, timestamp(sort: Desc)])\n}\n\nmodel DailyRewardsBreakdown {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n value Float\n campaignId String\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n DailyRewardsRecord DailyRewardsRecord @relation(fields: [dailyRewardsRecordId], references: [id])\n dailyRewardsRecordId String\n\n @@index([dailyRewardsRecordId], type: Hash)\n}\n\nmodel User {\n address String @id @db.Char(42)\n Rewards Reward[]\n Blacklist Blacklist[]\n CampaignsCreated Campaign[]\n UserComputedValue UserComputedValue[]\n tags String[]\n\n Creator Creator? @relation(fields: [creatorId], references: [id])\n creatorId String?\n}\n\nmodel Creator {\n id String @id\n icon String?\n name String\n Users User[]\n}\n\nmodel Reward {\n id String @id\n MerklRoot MerklRoot @relation(fields: [root], references: [root])\n root String\n User User @relation(fields: [recipient], references: [address])\n recipient String @db.Char(42)\n RewardToken Token @relation(fields: [rewardTokenId], references: [id])\n rewardTokenId String\n amount String @default(\"0\")\n claimed String @default(\"0\")\n pending String @default(\"0\")\n proofs String[]\n Breakdown RewardBreakdown[]\n // Hidden index on ((CAST(amount AS INTEGER) + CAST(pending AS INTEGER)));\n\n @@unique([root, recipient, rewardTokenId])\n @@index([root], type: Hash)\n @@index([recipient, rewardTokenId])\n}\n\nmodel RewardBreakdown {\n id BigInt @id @default(autoincrement())\n Protocol Protocol? @relation(fields: [protocolId], references: [id])\n protocolId String?\n reason String\n amount String\n claimed String\n pending String\n Reward Reward @relation(fields: [rewardId], references: [id], onDelete: Cascade)\n rewardId String\n campaignId String\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n // Hidden index on ((CAST(amount AS INTEGER) + CAST(pending AS INTEGER)));\n\n @@unique([rewardId, campaignId, reason])\n @@index([rewardId], type: Hash)\n @@index([campaignId], type: Hash)\n}\n\nmodel MerklRoot {\n root String @id\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n epoch Int\n timestamp BigInt\n Rewards Reward[]\n\n @@index([chainId, root])\n}\n\nmodel PriceSource {\n id Int @id @default(autoincrement()) // This should hold in Int ids\n symbol String @unique() // Price Id\n method PriceSourceMethod\n args Json?\n}\n\n// priceId -> number\n\nmodel Blacklist {\n id String @id\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n poolAddress String @db.Char(42)\n User User @relation(fields: [userAddress], references: [address])\n userAddress String @db.Char(42)\n arrestTimestamp BigInt\n arrestDetails Json\n\n @@unique([chainId, userAddress, poolAddress])\n @@index([userAddress], type: Hash)\n}\n\nmodel Dump {\n id String @id\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n FromToken Token @relation(name: \"from\", fields: [fromTokenId], references: [id])\n fromTokenId String\n ToToken Token @relation(name: \"to\", fields: [toTokenId], references: [id])\n toTokenId String\n multisig String @db.Char(42)\n recipient String @db.Char(42)\n amountIn String @default(\"0\")\n amountOut String @default(\"0\")\n datetime DateTime\n timestamp Int\n\n @@unique([chainId, fromTokenId, toTokenId, timestamp])\n}\n\nmodel Logged {\n id String @id\n chainId Int\n type LoggedEntityType @default(UNKNOWN)\n address String? @db.Char(42)\n fetchAtBlock Int\n caughtFromAddress String @db.Char(42)\n entityData Json\n\n @@unique([chainId, address])\n}\n\n// enums\n\nenum LoggedEntityType {\n UNKNOWN\n EULER_VAULT\n UNISWAP_V4\n COMPOUND_v2\n}\n\nenum RunStatus {\n PROCESSING\n SUCCESS\n FAILED\n SKIPPED\n}\n\nenum OpportunityAction {\n POOL\n HOLD\n DROP\n LEND\n BORROW\n LONG\n SHORT\n SWAP\n INVALID\n}\n\nenum Status {\n NONE // This would mean that no campaigns was ever created for this opportunity\n PAST\n LIVE\n SOON\n}\n\nenum ExplorerType {\n ETHERSCAN\n BLOCKSCOUT\n}\n\nenum AprType {\n CAMPAIGN\n TOKEN\n PROTOCOL\n}\n\nenum TvlType {\n TOKEN\n PROTOCOL\n}\n\nenum PriceSourceMethod {\n COINGECKO\n CONSTANT\n EQUAL_TO\n ERC4626\n DEXSCREENER\n INDEXCOOP\n DEFILLAMA\n}\n\nenum CampaignManualOverride {\n opportunityId\n creatorAddress\n}\n\nenum OpportunityManualOverride {\n identifier\n name\n depositUrl\n action\n mainProtocolId\n}\n\nenum DistributionType {\n DUTCH_AUCTION\n FIX_REWARD_VALUE_PER_LIQUIDITY_VALUE // The fix reward value will lie in params.apr\n FIX_REWARD_AMOUNT_PER_LIQUIDITY_VALUE\n FIX_REWARD_VALUE_PER_LIQUIDITY_AMOUNT\n FIX_REWARD_AMOUNT_PER_LIQUIDITY_AMOUNT\n}\n",
|
668
|
+
"inlineSchemaHash": "fbe37287ee5a0119a9a3c04f6158171df81f3b0c048a09a06d04f7026a4d7684",
|
669
669
|
"copyEngine": true
|
670
670
|
}
|
671
671
|
config.dirname = '/'
|
@@ -665,8 +665,8 @@ const config = {
|
|
665
665
|
}
|
666
666
|
}
|
667
667
|
},
|
668
|
-
"inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n binaryTargets = [\"native\", \"linux-arm64-openssl-1.1.x\", \"linux-musl-arm64-openssl-3.0.x\"]\n output = \".generated/\"\n previewFeatures = [\"fullTextSearchPostgres\", \"relationJoins\"]\n}\n\ngenerator drizzle {\n provider = \"drizzle-prisma-generator\"\n output = \".generated/drizzle/\" // Where to put generated Drizle tables\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_API_URL\")\n}\n\nmodel Campaign {\n id String @id\n ComputeChain Chain @relation(\"compute\", fields: [computeChainId], references: [id])\n computeChainId Int\n DistributionChain Chain @relation(\"distribution\", fields: [distributionChainId], references: [id])\n distributionChainId Int\n campaignId String\n type String\n // distributionType DistributionType @default(DUTCH_AUCTION)\n subType Int?\n RewardToken Token @relation(fields: [rewardTokenId], references: [id])\n rewardTokenId String\n amount String\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n startTimestamp BigInt\n endTimestamp BigInt\n params Json\n RewardBreakdown RewardBreakdown[]\n DailyRewardsBreakdown DailyRewardsBreakdown[]\n Creator User @relation(fields: [creatorAddress], references: [address])\n creatorAddress String @db.Char(42)\n // Should probably be a 1 to 1 relation if we do not want to keep historic records\n CampaignStatus CampaignStatus[]\n CampaignEngineValues CampaignComputedValue[]\n UserComputedValue UserComputedValue[]\n\n // Fields should be automatically parsable and overriden periodically UNLESS\n // they are manually overridden, in which case they should be kept as is\n manualOverrides CampaignManualOverride[] @default([])\n\n createdAt DateTime @default(now())\n\n @@unique([distributionChainId, campaignId])\n @@index([opportunityId], type: Hash)\n}\n\n// SubTable of Campaigns that should be here as soon as the campaign is processed\nmodel CampaignStatus {\n campaignId String @id\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n computedUntil BigInt\n processingStarted BigInt\n status RunStatus @default(SUCCESS)\n error String @default(\"\")\n details Json @default(\"{}\")\n}\n\n// SubTable of Campaigns that will contain values populated by the Engine when it's running\nmodel CampaignComputedValue {\n campaignId String @id\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n averageBoost Float? // Average boost in case of boosting hook\n totalDistributedInUSD Float? // Used in case there is a distribution cap\n forfeitingBoost Float? // In case some rewards are forfeited, resulting boost for remaining users\n}\n\nmodel UserComputedValue {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n campaignId String\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n address String @db.Char(42)\n User User? @relation(fields: [address], references: [address])\n reason String\n boost Float?\n\n @@unique([campaignId, address, reason])\n}\n\nmodel Chain {\n id Int @id\n name String\n icon String\n // liveCampaigns Int @default(0)\n // dailyRewards Float @default(0)\n Explorer Explorer[]\n Campaigns Campaign[] @relation(\"compute\")\n Distribution Campaign[] @relation(\"distribution\")\n Token Token[]\n Opportunity Opportunity[]\n MerklRoot MerklRoot[]\n Blacklist Blacklist[]\n Dump Dump[]\n}\n\nmodel Explorer {\n id String @id\n type ExplorerType\n Chain Chain @relation(fields: [chainId], references: [id])\n url String\n chainId Int\n\n @@unique([type, chainId])\n}\n\nmodel Opportunity {\n id String @id\n Chain Chain @relation(fields: [chainId], references: [id]) // compute\n chainId Int // compute\n type String\n identifier String // eg. 0xUniswapPool - formerly mainParameter\n name String\n depositUrl String?\n status Status\n action OpportunityAction\n Tokens Token[]\n Campaigns Campaign[]\n Protocols Protocol[]\n MainProtocol Protocol? @relation(name: \"main\", fields: [mainProtocolId], references: [id])\n mainProtocolId String?\n tvl Float @default(0)\n TvlRecords TVLRecord[]\n apr Float @default(0)\n AprRecords AprRecord[]\n dailyRewards Float @default(0)\n DailyRewardsRecords DailyRewardsRecord[]\n tags String[] @default([])\n\n // Fields should be automatically parsable and overriden periodically UNLESS\n // they are manually overridden, in which case they should be kept as is\n // manualOverrides OpportunityManualOverride[] @default([])\n\n @@unique([chainId, type, identifier])\n}\n\nmodel Protocol {\n id String @id\n tags String[] @default([])\n name String\n description String @default(\"\")\n url String\n icon String\n // liveCampaigns Int @default(0)\n // totalDailyRewards Float @default(0)\n MainOpportunities Opportunity[] @relation(name: \"main\")\n Opportunities Opportunity[]\n RewardBreakdown RewardBreakdown[]\n}\n\nmodel Token {\n id String @id()\n name String?\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n address String @db.Char(42)\n decimals Int\n symbol String\n displaySymbol String @default(\"\")\n icon String\n verified Boolean @default(false)\n isTest Boolean @default(false)\n isPoint Boolean @default(false)\n isNative Boolean @default(false)\n price Float?\n Opportunity Opportunity[]\n Campaigns Campaign[]\n Reward Reward[]\n DumpTo Dump[] @relation(\"to\")\n DumpFrom Dump[] @relation(\"from\")\n\n @@unique([chainId, address])\n @@index([chainId], type: Hash)\n @@index([symbol, address])\n}\n\nmodel AprRecord {\n id String @id\n timestamp BigInt\n cumulated Float\n AprBreakdown AprBreakdown[]\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n\n @@unique([opportunityId, timestamp])\n @@index([opportunityId, timestamp(sort: Desc)])\n}\n\nmodel AprBreakdown {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n identifier String\n type AprType\n value Float\n AprRecord AprRecord @relation(fields: [aprRecordId], references: [id])\n aprRecordId String\n\n @@index([aprRecordId], type: Hash)\n}\n\nmodel TVLRecord {\n id String @id\n timestamp BigInt\n total Float\n TvlBreakdown TVLBreakdown[]\n\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n\n @@unique([opportunityId, timestamp])\n @@index([opportunityId, timestamp(sort: Desc)])\n}\n\nmodel TVLBreakdown {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n identifier String\n type TvlType\n value Float\n\n TvlRecord TVLRecord @relation(fields: [tvlRecordId], references: [id])\n tvlRecordId String\n\n @@index([tvlRecordId], type: Hash)\n}\n\nmodel DailyRewardsRecord {\n id String @id\n timestamp BigInt\n total Float\n DailyRewardsBreakdown DailyRewardsBreakdown[]\n\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n\n @@unique([opportunityId, timestamp])\n @@index([opportunityId, timestamp(sort: Desc)])\n}\n\nmodel DailyRewardsBreakdown {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n value Float\n campaignId String\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n DailyRewardsRecord DailyRewardsRecord @relation(fields: [dailyRewardsRecordId], references: [id])\n dailyRewardsRecordId String\n\n @@index([dailyRewardsRecordId], type: Hash)\n}\n\nmodel User {\n address String @id @db.Char(42)\n Rewards Reward[]\n Blacklist Blacklist[]\n CampaignsCreated Campaign[]\n UserComputedValue UserComputedValue[]\n tags String[]\n\n Creator Creator? @relation(fields: [creatorId], references: [id])\n creatorId String?\n}\n\nmodel Creator {\n id String @id\n icon String?\n name String\n Users User[]\n}\n\nmodel Reward {\n id String @id\n MerklRoot MerklRoot @relation(fields: [root], references: [root])\n root String\n User User @relation(fields: [recipient], references: [address])\n recipient String @db.Char(42)\n RewardToken Token @relation(fields: [rewardTokenId], references: [id])\n rewardTokenId String\n amount String @default(\"0\")\n claimed String @default(\"0\")\n pending String @default(\"0\")\n proofs String[]\n Breakdown RewardBreakdown[]\n // Hidden index on ((CAST(amount AS INTEGER) + CAST(pending AS INTEGER)));\n\n @@unique([root, recipient, rewardTokenId])\n @@index([root], type: Hash)\n @@index([recipient, rewardTokenId])\n}\n\nmodel RewardBreakdown {\n id BigInt @id @default(autoincrement())\n Protocol Protocol? @relation(fields: [protocolId], references: [id])\n protocolId String?\n reason String\n amount String\n claimed String\n pending String\n Reward Reward @relation(fields: [rewardId], references: [id], onDelete: Cascade)\n rewardId String\n campaignId String\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n // Hidden index on ((CAST(amount AS INTEGER) + CAST(pending AS INTEGER)));\n\n @@unique([rewardId, campaignId, reason])\n @@index([rewardId], type: Hash)\n @@index([campaignId], type: Hash)\n}\n\nmodel MerklRoot {\n root String @id\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n epoch Int\n timestamp BigInt\n Rewards Reward[]\n\n @@index([chainId, root])\n}\n\nmodel PriceSource {\n id Int @id @default(autoincrement())\n symbol String @unique() // Price Id\n method PriceSourceMethod\n args Json?\n}\n\n// priceId -> number\n\nmodel Blacklist {\n id String @id\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n poolAddress String @db.Char(42)\n User User @relation(fields: [userAddress], references: [address])\n userAddress String @db.Char(42)\n arrestTimestamp BigInt\n arrestDetails Json\n\n @@unique([chainId, userAddress, poolAddress])\n @@index([userAddress], type: Hash)\n}\n\nmodel Dump {\n id String @id\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n FromToken Token @relation(name: \"from\", fields: [fromTokenId], references: [id])\n fromTokenId String\n ToToken Token @relation(name: \"to\", fields: [toTokenId], references: [id])\n toTokenId String\n multisig String @db.Char(42)\n recipient String @db.Char(42)\n amountIn String @default(\"0\")\n amountOut String @default(\"0\")\n datetime DateTime\n timestamp Int\n\n @@unique([chainId, fromTokenId, toTokenId, timestamp])\n}\n\nmodel Logged {\n id String @id\n chainId Int\n type LoggedEntityType @default(UNKNOWN)\n address String? @db.Char(42)\n fetchAtBlock Int\n caughtFromAddress String @db.Char(42)\n entityData Json\n\n @@unique([chainId, address])\n}\n\n// enums\n\nenum LoggedEntityType {\n UNKNOWN\n EULER_VAULT\n UNISWAP_V4\n COMPOUND_v2\n}\n\nenum RunStatus {\n PROCESSING\n SUCCESS\n FAILED\n SKIPPED\n}\n\nenum OpportunityAction {\n POOL\n HOLD\n DROP\n LEND\n BORROW\n LONG\n SHORT\n SWAP\n INVALID\n}\n\nenum Status {\n NONE // This would mean that no campaigns was ever created for this opportunity\n PAST\n LIVE\n SOON\n}\n\nenum ExplorerType {\n ETHERSCAN\n BLOCKSCOUT\n}\n\nenum AprType {\n CAMPAIGN\n TOKEN\n PROTOCOL\n}\n\nenum TvlType {\n TOKEN\n PROTOCOL\n}\n\nenum PriceSourceMethod {\n COINGECKO\n CONSTANT\n EQUAL_TO\n ERC4626\n DEXSCREENER\n INDEXCOOP\n DEFILLAMA\n}\n\nenum CampaignManualOverride {\n opportunityId\n creatorAddress\n}\n\nenum OpportunityManualOverride {\n identifier\n name\n depositUrl\n action\n mainProtocolId\n}\n\nenum DistributionType {\n DUTCH_AUCTION\n FIX_REWARD_VALUE_PER_LIQUIDITY_VALUE // The fix reward value will lie in params.apr\n FIX_REWARD_AMOUNT_PER_LIQUIDITY_VALUE\n FIX_REWARD_VALUE_PER_LIQUIDITY_AMOUNT\n FIX_REWARD_AMOUNT_PER_LIQUIDITY_AMOUNT\n}\n",
|
669
|
-
"inlineSchemaHash": "
|
668
|
+
"inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n binaryTargets = [\"native\", \"linux-arm64-openssl-1.1.x\", \"linux-musl-arm64-openssl-3.0.x\"]\n output = \".generated/\"\n previewFeatures = [\"fullTextSearchPostgres\", \"relationJoins\"]\n}\n\ngenerator drizzle {\n provider = \"drizzle-prisma-generator\"\n output = \".generated/drizzle/\" // Where to put generated Drizle tables\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_API_URL\")\n}\n\nmodel Campaign {\n id String @id\n ComputeChain Chain @relation(\"compute\", fields: [computeChainId], references: [id])\n computeChainId Int\n DistributionChain Chain @relation(\"distribution\", fields: [distributionChainId], references: [id])\n distributionChainId Int\n campaignId String\n type String\n // distributionType DistributionType @default(DUTCH_AUCTION)\n subType Int?\n RewardToken Token @relation(fields: [rewardTokenId], references: [id])\n rewardTokenId String\n amount String\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n startTimestamp BigInt\n endTimestamp BigInt\n params Json\n RewardBreakdown RewardBreakdown[]\n DailyRewardsBreakdown DailyRewardsBreakdown[]\n Creator User @relation(fields: [creatorAddress], references: [address])\n creatorAddress String @db.Char(42)\n // Should probably be a 1 to 1 relation if we do not want to keep historic records\n CampaignStatus CampaignStatus[]\n CampaignEngineValues CampaignComputedValue[]\n UserComputedValue UserComputedValue[]\n\n // Fields should be automatically parsable and overriden periodically UNLESS\n // they are manually overridden, in which case they should be kept as is\n manualOverrides CampaignManualOverride[] @default([])\n\n createdAt DateTime @default(now())\n\n @@unique([distributionChainId, campaignId])\n @@index([opportunityId], type: Hash)\n}\n\n// SubTable of Campaigns that should be here as soon as the campaign is processed\nmodel CampaignStatus {\n campaignId String @id\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n computedUntil BigInt\n processingStarted BigInt\n status RunStatus @default(SUCCESS)\n error String @default(\"\")\n details Json @default(\"{}\")\n}\n\n// SubTable of Campaigns that will contain values populated by the Engine when it's running\nmodel CampaignComputedValue {\n campaignId String @id\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n averageBoost Float? // Average boost in case of boosting hook\n totalDistributedInUSD Float? // Used in case there is a distribution cap\n forfeitingBoost Float? // In case some rewards are forfeited, resulting boost for remaining users\n}\n\nmodel UserComputedValue {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n campaignId String\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n address String @db.Char(42)\n User User? @relation(fields: [address], references: [address])\n reason String\n boost Float?\n\n @@unique([campaignId, address, reason])\n}\n\nmodel Chain {\n id Int @id\n name String\n icon String\n // liveCampaigns Int @default(0)\n // dailyRewards Float @default(0)\n Explorer Explorer[]\n Campaigns Campaign[] @relation(\"compute\")\n Distribution Campaign[] @relation(\"distribution\")\n Token Token[]\n Opportunity Opportunity[]\n MerklRoot MerklRoot[]\n Blacklist Blacklist[]\n Dump Dump[]\n}\n\nmodel Explorer {\n id String @id\n type ExplorerType\n Chain Chain @relation(fields: [chainId], references: [id])\n url String\n chainId Int\n\n @@unique([type, chainId])\n}\n\nmodel Opportunity {\n id String @id\n Chain Chain @relation(fields: [chainId], references: [id]) // compute\n chainId Int // compute\n type String\n identifier String // eg. 0xUniswapPool - formerly mainParameter\n name String\n depositUrl String?\n status Status\n action OpportunityAction\n Tokens Token[]\n Campaigns Campaign[]\n Protocols Protocol[]\n MainProtocol Protocol? @relation(name: \"main\", fields: [mainProtocolId], references: [id])\n mainProtocolId String?\n tvl Float @default(0)\n TvlRecords TVLRecord[]\n apr Float @default(0)\n AprRecords AprRecord[]\n dailyRewards Float @default(0)\n DailyRewardsRecords DailyRewardsRecord[]\n tags String[] @default([])\n\n // Fields should be automatically parsable and overriden periodically UNLESS\n // they are manually overridden, in which case they should be kept as is\n // manualOverrides OpportunityManualOverride[] @default([])\n\n @@unique([chainId, type, identifier])\n}\n\nmodel Protocol {\n id String @id\n tags String[] @default([])\n name String\n description String @default(\"\")\n url String\n icon String\n // liveCampaigns Int @default(0)\n // totalDailyRewards Float @default(0)\n MainOpportunities Opportunity[] @relation(name: \"main\")\n Opportunities Opportunity[]\n RewardBreakdown RewardBreakdown[]\n}\n\nmodel Token {\n id String @id()\n name String?\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n address String @db.Char(42)\n decimals Int\n symbol String\n displaySymbol String @default(\"\")\n icon String\n verified Boolean @default(false)\n isTest Boolean @default(false)\n isPoint Boolean @default(false)\n isNative Boolean @default(false)\n price Float?\n Opportunity Opportunity[]\n Campaigns Campaign[]\n Reward Reward[]\n DumpTo Dump[] @relation(\"to\")\n DumpFrom Dump[] @relation(\"from\")\n\n @@unique([chainId, address])\n @@index([chainId], type: Hash)\n @@index([symbol, address])\n}\n\nmodel AprRecord {\n id String @id\n timestamp BigInt\n cumulated Float\n AprBreakdown AprBreakdown[]\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n\n @@unique([opportunityId, timestamp])\n @@index([opportunityId, timestamp(sort: Desc)])\n}\n\nmodel AprBreakdown {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n identifier String\n type AprType\n value Float\n AprRecord AprRecord @relation(fields: [aprRecordId], references: [id])\n aprRecordId String\n\n @@index([aprRecordId], type: Hash)\n}\n\nmodel TVLRecord {\n id String @id\n timestamp BigInt\n total Float\n TvlBreakdown TVLBreakdown[]\n\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n\n @@unique([opportunityId, timestamp])\n @@index([opportunityId, timestamp(sort: Desc)])\n}\n\nmodel TVLBreakdown {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n identifier String\n type TvlType\n value Float\n\n TvlRecord TVLRecord @relation(fields: [tvlRecordId], references: [id])\n tvlRecordId String\n\n @@index([tvlRecordId], type: Hash)\n}\n\nmodel DailyRewardsRecord {\n id String @id\n timestamp BigInt\n total Float\n DailyRewardsBreakdown DailyRewardsBreakdown[]\n\n Opportunity Opportunity @relation(fields: [opportunityId], references: [id])\n opportunityId String\n\n @@unique([opportunityId, timestamp])\n @@index([opportunityId, timestamp(sort: Desc)])\n}\n\nmodel DailyRewardsBreakdown {\n id Int @id @default(autoincrement()) // TODO Migrate to something smarter than Int ids\n value Float\n campaignId String\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n DailyRewardsRecord DailyRewardsRecord @relation(fields: [dailyRewardsRecordId], references: [id])\n dailyRewardsRecordId String\n\n @@index([dailyRewardsRecordId], type: Hash)\n}\n\nmodel User {\n address String @id @db.Char(42)\n Rewards Reward[]\n Blacklist Blacklist[]\n CampaignsCreated Campaign[]\n UserComputedValue UserComputedValue[]\n tags String[]\n\n Creator Creator? @relation(fields: [creatorId], references: [id])\n creatorId String?\n}\n\nmodel Creator {\n id String @id\n icon String?\n name String\n Users User[]\n}\n\nmodel Reward {\n id String @id\n MerklRoot MerklRoot @relation(fields: [root], references: [root])\n root String\n User User @relation(fields: [recipient], references: [address])\n recipient String @db.Char(42)\n RewardToken Token @relation(fields: [rewardTokenId], references: [id])\n rewardTokenId String\n amount String @default(\"0\")\n claimed String @default(\"0\")\n pending String @default(\"0\")\n proofs String[]\n Breakdown RewardBreakdown[]\n // Hidden index on ((CAST(amount AS INTEGER) + CAST(pending AS INTEGER)));\n\n @@unique([root, recipient, rewardTokenId])\n @@index([root], type: Hash)\n @@index([recipient, rewardTokenId])\n}\n\nmodel RewardBreakdown {\n id BigInt @id @default(autoincrement())\n Protocol Protocol? @relation(fields: [protocolId], references: [id])\n protocolId String?\n reason String\n amount String\n claimed String\n pending String\n Reward Reward @relation(fields: [rewardId], references: [id], onDelete: Cascade)\n rewardId String\n campaignId String\n Campaign Campaign @relation(fields: [campaignId], references: [id])\n // Hidden index on ((CAST(amount AS INTEGER) + CAST(pending AS INTEGER)));\n\n @@unique([rewardId, campaignId, reason])\n @@index([rewardId], type: Hash)\n @@index([campaignId], type: Hash)\n}\n\nmodel MerklRoot {\n root String @id\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n epoch Int\n timestamp BigInt\n Rewards Reward[]\n\n @@index([chainId, root])\n}\n\nmodel PriceSource {\n id Int @id @default(autoincrement()) // This should hold in Int ids\n symbol String @unique() // Price Id\n method PriceSourceMethod\n args Json?\n}\n\n// priceId -> number\n\nmodel Blacklist {\n id String @id\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n poolAddress String @db.Char(42)\n User User @relation(fields: [userAddress], references: [address])\n userAddress String @db.Char(42)\n arrestTimestamp BigInt\n arrestDetails Json\n\n @@unique([chainId, userAddress, poolAddress])\n @@index([userAddress], type: Hash)\n}\n\nmodel Dump {\n id String @id\n Chain Chain @relation(fields: [chainId], references: [id])\n chainId Int\n FromToken Token @relation(name: \"from\", fields: [fromTokenId], references: [id])\n fromTokenId String\n ToToken Token @relation(name: \"to\", fields: [toTokenId], references: [id])\n toTokenId String\n multisig String @db.Char(42)\n recipient String @db.Char(42)\n amountIn String @default(\"0\")\n amountOut String @default(\"0\")\n datetime DateTime\n timestamp Int\n\n @@unique([chainId, fromTokenId, toTokenId, timestamp])\n}\n\nmodel Logged {\n id String @id\n chainId Int\n type LoggedEntityType @default(UNKNOWN)\n address String? @db.Char(42)\n fetchAtBlock Int\n caughtFromAddress String @db.Char(42)\n entityData Json\n\n @@unique([chainId, address])\n}\n\n// enums\n\nenum LoggedEntityType {\n UNKNOWN\n EULER_VAULT\n UNISWAP_V4\n COMPOUND_v2\n}\n\nenum RunStatus {\n PROCESSING\n SUCCESS\n FAILED\n SKIPPED\n}\n\nenum OpportunityAction {\n POOL\n HOLD\n DROP\n LEND\n BORROW\n LONG\n SHORT\n SWAP\n INVALID\n}\n\nenum Status {\n NONE // This would mean that no campaigns was ever created for this opportunity\n PAST\n LIVE\n SOON\n}\n\nenum ExplorerType {\n ETHERSCAN\n BLOCKSCOUT\n}\n\nenum AprType {\n CAMPAIGN\n TOKEN\n PROTOCOL\n}\n\nenum TvlType {\n TOKEN\n PROTOCOL\n}\n\nenum PriceSourceMethod {\n COINGECKO\n CONSTANT\n EQUAL_TO\n ERC4626\n DEXSCREENER\n INDEXCOOP\n DEFILLAMA\n}\n\nenum CampaignManualOverride {\n opportunityId\n creatorAddress\n}\n\nenum OpportunityManualOverride {\n identifier\n name\n depositUrl\n action\n mainProtocolId\n}\n\nenum DistributionType {\n DUTCH_AUCTION\n FIX_REWARD_VALUE_PER_LIQUIDITY_VALUE // The fix reward value will lie in params.apr\n FIX_REWARD_AMOUNT_PER_LIQUIDITY_VALUE\n FIX_REWARD_VALUE_PER_LIQUIDITY_AMOUNT\n FIX_REWARD_AMOUNT_PER_LIQUIDITY_AMOUNT\n}\n",
|
669
|
+
"inlineSchemaHash": "fbe37287ee5a0119a9a3c04f6158171df81f3b0c048a09a06d04f7026a4d7684",
|
670
670
|
"copyEngine": true
|
671
671
|
}
|
672
672
|
|
package/dist/src/eden/index.d.ts
CHANGED
@@ -1184,12 +1184,15 @@ declare const eden: {
|
|
1184
1184
|
200: unknown[];
|
1185
1185
|
}>>;
|
1186
1186
|
};
|
1187
|
-
|
1187
|
+
metadata: {
|
1188
1188
|
get: (options: {
|
1189
1189
|
headers: {
|
1190
1190
|
authorization: string;
|
1191
1191
|
};
|
1192
|
-
query
|
1192
|
+
query: {
|
1193
|
+
campaignId: string;
|
1194
|
+
distributionChain: number;
|
1195
|
+
};
|
1193
1196
|
fetch?: RequestInit | undefined;
|
1194
1197
|
}) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
|
1195
1198
|
200: {
|
@@ -1214,7 +1217,7 @@ declare const eden: {
|
|
1214
1217
|
isNative: boolean;
|
1215
1218
|
} & {
|
1216
1219
|
price?: number | null | undefined;
|
1217
|
-
})[]
|
1220
|
+
})[];
|
1218
1221
|
mainProtocol: "splice" | "morpho" | "euler" | "ambient" | "uniswap" | "arthswap" | "base-swap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancake-swap" | "quick-swap" | "ramses" | "retro" | "stryke" | "sushiswap" | "swapr" | "thruster" | "voltage" | "zero" | "koi" | "supswap" | "zk-swap" | "thirdtrade" | "swap-x" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap" | "neptune" | "zkSwapThreePool" | "rfx" | "ra" | "maverick" | "trader-joe" | "hanji" | "radiant" | "aave" | "fraxlend" | "ironclad" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | "gamma" | "oku" | "hourglass" | "veda" | "kyo" | "sonex" | "lendle" | "tako-tako" | "equalizer" | "spectra" | "beraborrow" | "superlend" | "avalon" | "angles" | "enzyme" | "toros" | "vicuna" | "bunni" | "beratrax" | "concrete" | "cian" | "pendle" | "yei" | "filament" | "gammaswap" | "maha" | "tempest" | "uranium" | "holdstation" | "katana" | "satlayer" | undefined;
|
1219
1222
|
depositUrl: any;
|
1220
1223
|
tags: string[];
|
@@ -4839,12 +4842,15 @@ declare const eden: {
|
|
4839
4842
|
200: unknown[];
|
4840
4843
|
}>>;
|
4841
4844
|
};
|
4842
|
-
|
4845
|
+
metadata: {
|
4843
4846
|
get: (options: {
|
4844
4847
|
headers: {
|
4845
4848
|
authorization: string;
|
4846
4849
|
};
|
4847
|
-
query
|
4850
|
+
query: {
|
4851
|
+
campaignId: string;
|
4852
|
+
distributionChain: number;
|
4853
|
+
};
|
4848
4854
|
fetch?: RequestInit | undefined;
|
4849
4855
|
}) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
|
4850
4856
|
200: {
|
@@ -4869,7 +4875,7 @@ declare const eden: {
|
|
4869
4875
|
isNative: boolean;
|
4870
4876
|
} & {
|
4871
4877
|
price?: number | null | undefined;
|
4872
|
-
})[]
|
4878
|
+
})[];
|
4873
4879
|
mainProtocol: "splice" | "morpho" | "euler" | "ambient" | "uniswap" | "arthswap" | "base-swap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancake-swap" | "quick-swap" | "ramses" | "retro" | "stryke" | "sushiswap" | "swapr" | "thruster" | "voltage" | "zero" | "koi" | "supswap" | "zk-swap" | "thirdtrade" | "swap-x" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap" | "neptune" | "zkSwapThreePool" | "rfx" | "ra" | "maverick" | "trader-joe" | "hanji" | "radiant" | "aave" | "fraxlend" | "ironclad" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | "gamma" | "oku" | "hourglass" | "veda" | "kyo" | "sonex" | "lendle" | "tako-tako" | "equalizer" | "spectra" | "beraborrow" | "superlend" | "avalon" | "angles" | "enzyme" | "toros" | "vicuna" | "bunni" | "beratrax" | "concrete" | "cian" | "pendle" | "yei" | "filament" | "gammaswap" | "maha" | "tempest" | "uranium" | "holdstation" | "katana" | "satlayer" | undefined;
|
4874
4880
|
depositUrl: any;
|
4875
4881
|
tags: string[];
|
@@ -9247,13 +9253,16 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
9247
9253
|
} & {
|
9248
9254
|
"dry-run": {
|
9249
9255
|
":campaignId": {
|
9250
|
-
|
9256
|
+
metadata: {
|
9251
9257
|
get: {
|
9252
9258
|
body: unknown;
|
9253
9259
|
params: {
|
9254
9260
|
campaignId: string;
|
9255
9261
|
};
|
9256
|
-
query:
|
9262
|
+
query: {
|
9263
|
+
campaignId: string;
|
9264
|
+
distributionChain: number;
|
9265
|
+
};
|
9257
9266
|
headers: {
|
9258
9267
|
authorization: string;
|
9259
9268
|
};
|
@@ -9280,7 +9289,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
9280
9289
|
isNative: boolean;
|
9281
9290
|
} & {
|
9282
9291
|
price?: number | null | undefined;
|
9283
|
-
})[]
|
9292
|
+
})[];
|
9284
9293
|
mainProtocol: "splice" | "morpho" | "euler" | "ambient" | "uniswap" | "arthswap" | "base-swap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancake-swap" | "quick-swap" | "ramses" | "retro" | "stryke" | "sushiswap" | "swapr" | "thruster" | "voltage" | "zero" | "koi" | "supswap" | "zk-swap" | "thirdtrade" | "swap-x" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap" | "neptune" | "zkSwapThreePool" | "rfx" | "ra" | "maverick" | "trader-joe" | "hanji" | "radiant" | "aave" | "fraxlend" | "ironclad" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | "gamma" | "oku" | "hourglass" | "veda" | "kyo" | "sonex" | "lendle" | "tako-tako" | "equalizer" | "spectra" | "beraborrow" | "superlend" | "avalon" | "angles" | "enzyme" | "toros" | "vicuna" | "bunni" | "beratrax" | "concrete" | "cian" | "pendle" | "yei" | "filament" | "gammaswap" | "maha" | "tempest" | "uranium" | "holdstation" | "katana" | "satlayer" | undefined;
|
9285
9294
|
depositUrl: any;
|
9286
9295
|
tags: string[];
|
@@ -14563,12 +14572,15 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
14563
14572
|
200: unknown[];
|
14564
14573
|
}>>;
|
14565
14574
|
};
|
14566
|
-
|
14575
|
+
metadata: {
|
14567
14576
|
get: (options: {
|
14568
14577
|
headers: {
|
14569
14578
|
authorization: string;
|
14570
14579
|
};
|
14571
|
-
query
|
14580
|
+
query: {
|
14581
|
+
campaignId: string;
|
14582
|
+
distributionChain: number;
|
14583
|
+
};
|
14572
14584
|
fetch?: RequestInit | undefined;
|
14573
14585
|
}) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
|
14574
14586
|
200: {
|
@@ -14593,7 +14605,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
14593
14605
|
isNative: boolean;
|
14594
14606
|
} & {
|
14595
14607
|
price?: number | null | undefined;
|
14596
|
-
})[]
|
14608
|
+
})[];
|
14597
14609
|
mainProtocol: "splice" | "morpho" | "euler" | "ambient" | "uniswap" | "arthswap" | "base-swap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancake-swap" | "quick-swap" | "ramses" | "retro" | "stryke" | "sushiswap" | "swapr" | "thruster" | "voltage" | "zero" | "koi" | "supswap" | "zk-swap" | "thirdtrade" | "swap-x" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap" | "neptune" | "zkSwapThreePool" | "rfx" | "ra" | "maverick" | "trader-joe" | "hanji" | "radiant" | "aave" | "fraxlend" | "ironclad" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | "gamma" | "oku" | "hourglass" | "veda" | "kyo" | "sonex" | "lendle" | "tako-tako" | "equalizer" | "spectra" | "beraborrow" | "superlend" | "avalon" | "angles" | "enzyme" | "toros" | "vicuna" | "bunni" | "beratrax" | "concrete" | "cian" | "pendle" | "yei" | "filament" | "gammaswap" | "maha" | "tempest" | "uranium" | "holdstation" | "katana" | "satlayer" | undefined;
|
14598
14610
|
depositUrl: any;
|
14599
14611
|
tags: string[];
|
@@ -18218,12 +18230,15 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
18218
18230
|
200: unknown[];
|
18219
18231
|
}>>;
|
18220
18232
|
};
|
18221
|
-
|
18233
|
+
metadata: {
|
18222
18234
|
get: (options: {
|
18223
18235
|
headers: {
|
18224
18236
|
authorization: string;
|
18225
18237
|
};
|
18226
|
-
query
|
18238
|
+
query: {
|
18239
|
+
campaignId: string;
|
18240
|
+
distributionChain: number;
|
18241
|
+
};
|
18227
18242
|
fetch?: RequestInit | undefined;
|
18228
18243
|
}) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
|
18229
18244
|
200: {
|
@@ -18248,7 +18263,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
18248
18263
|
isNative: boolean;
|
18249
18264
|
} & {
|
18250
18265
|
price?: number | null | undefined;
|
18251
|
-
})[]
|
18266
|
+
})[];
|
18252
18267
|
mainProtocol: "splice" | "morpho" | "euler" | "ambient" | "uniswap" | "arthswap" | "base-swap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancake-swap" | "quick-swap" | "ramses" | "retro" | "stryke" | "sushiswap" | "swapr" | "thruster" | "voltage" | "zero" | "koi" | "supswap" | "zk-swap" | "thirdtrade" | "swap-x" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap" | "neptune" | "zkSwapThreePool" | "rfx" | "ra" | "maverick" | "trader-joe" | "hanji" | "radiant" | "aave" | "fraxlend" | "ironclad" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | "gamma" | "oku" | "hourglass" | "veda" | "kyo" | "sonex" | "lendle" | "tako-tako" | "equalizer" | "spectra" | "beraborrow" | "superlend" | "avalon" | "angles" | "enzyme" | "toros" | "vicuna" | "bunni" | "beratrax" | "concrete" | "cian" | "pendle" | "yei" | "filament" | "gammaswap" | "maha" | "tempest" | "uranium" | "holdstation" | "katana" | "satlayer" | undefined;
|
18253
18268
|
depositUrl: any;
|
18254
18269
|
tags: string[];
|
@@ -22,11 +22,9 @@ export class Erc20Metadata {
|
|
22
22
|
action = dynamicData?.typeInfo?.action ?? action;
|
23
23
|
name = dynamicData?.typeInfo?.cardName;
|
24
24
|
mainProtocolId = dynamicData?.typeInfo?.protocol?.toLowerCase().replace(" ", "");
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
mainProtocolId = protocol?.id;
|
29
|
-
}
|
25
|
+
const protocol = !!mainProtocolId ? (await ProtocolService.findMany({ id: mainProtocolId }))?.[0] : undefined;
|
26
|
+
if (!!protocol) {
|
27
|
+
mainProtocolId = protocol?.id;
|
30
28
|
}
|
31
29
|
// Case of lending protocols and receipt tokens
|
32
30
|
if (!!dynamicData && !!dynamicData.typeInfo?.underlying) {
|
package/dist/src/index.d.ts
CHANGED
@@ -1274,13 +1274,16 @@ declare const app: Elysia<"", false, {
|
|
1274
1274
|
} & {
|
1275
1275
|
"dry-run": {
|
1276
1276
|
":campaignId": {
|
1277
|
-
|
1277
|
+
metadata: {
|
1278
1278
|
get: {
|
1279
1279
|
body: unknown;
|
1280
1280
|
params: {
|
1281
1281
|
campaignId: string;
|
1282
1282
|
};
|
1283
|
-
query:
|
1283
|
+
query: {
|
1284
|
+
campaignId: string;
|
1285
|
+
distributionChain: number;
|
1286
|
+
};
|
1284
1287
|
headers: {
|
1285
1288
|
authorization: string;
|
1286
1289
|
};
|
@@ -1307,7 +1310,7 @@ declare const app: Elysia<"", false, {
|
|
1307
1310
|
isNative: boolean;
|
1308
1311
|
} & {
|
1309
1312
|
price?: number | null | undefined;
|
1310
|
-
})[]
|
1313
|
+
})[];
|
1311
1314
|
mainProtocol: "splice" | "morpho" | "euler" | "ambient" | "uniswap" | "arthswap" | "base-swap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancake-swap" | "quick-swap" | "ramses" | "retro" | "stryke" | "sushiswap" | "swapr" | "thruster" | "voltage" | "zero" | "koi" | "supswap" | "zk-swap" | "thirdtrade" | "swap-x" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap" | "neptune" | "zkSwapThreePool" | "rfx" | "ra" | "maverick" | "trader-joe" | "hanji" | "radiant" | "aave" | "fraxlend" | "ironclad" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | "gamma" | "oku" | "hourglass" | "veda" | "kyo" | "sonex" | "lendle" | "tako-tako" | "equalizer" | "spectra" | "beraborrow" | "superlend" | "avalon" | "angles" | "enzyme" | "toros" | "vicuna" | "bunni" | "beratrax" | "concrete" | "cian" | "pendle" | "yei" | "filament" | "gammaswap" | "maha" | "tempest" | "uranium" | "holdstation" | "katana" | "satlayer" | undefined;
|
1312
1315
|
depositUrl: any;
|
1313
1316
|
tags: string[];
|
@@ -40,7 +40,6 @@ export async function getClamsInfo(chainIds, AMMs, user, onlyLive) {
|
|
40
40
|
const result = {};
|
41
41
|
const promises = chainIds.map((chainId, index) => (async () => {
|
42
42
|
if (!cachedData[index]) {
|
43
|
-
log.error("Merkl cache", `Data for ${NETWORK_LABELS[chainId]} not found in cache`);
|
44
43
|
return;
|
45
44
|
}
|
46
45
|
log.local(`Redis: ${Object.keys(cachedData[index]?.pools ?? {}).length} pools found on ${NETWORK_LABELS[chainId]}`);
|
@@ -186,13 +186,16 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
|
|
186
186
|
} & {
|
187
187
|
"dry-run": {
|
188
188
|
":campaignId": {
|
189
|
-
|
189
|
+
metadata: {
|
190
190
|
get: {
|
191
191
|
body: unknown;
|
192
192
|
params: {
|
193
193
|
campaignId: string;
|
194
194
|
};
|
195
|
-
query:
|
195
|
+
query: {
|
196
|
+
campaignId: string;
|
197
|
+
distributionChain: number;
|
198
|
+
};
|
196
199
|
headers: {
|
197
200
|
authorization: string;
|
198
201
|
};
|
@@ -219,7 +222,7 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
|
|
219
222
|
isNative: boolean;
|
220
223
|
} & {
|
221
224
|
price?: number | null | undefined;
|
222
|
-
})[]
|
225
|
+
})[];
|
223
226
|
mainProtocol: "splice" | "morpho" | "euler" | "ambient" | "uniswap" | "arthswap" | "base-swap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancake-swap" | "quick-swap" | "ramses" | "retro" | "stryke" | "sushiswap" | "swapr" | "thruster" | "voltage" | "zero" | "koi" | "supswap" | "zk-swap" | "thirdtrade" | "swap-x" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap" | "neptune" | "zkSwapThreePool" | "rfx" | "ra" | "maverick" | "trader-joe" | "hanji" | "radiant" | "aave" | "fraxlend" | "ironclad" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | "gamma" | "oku" | "hourglass" | "veda" | "kyo" | "sonex" | "lendle" | "tako-tako" | "equalizer" | "spectra" | "beraborrow" | "superlend" | "avalon" | "angles" | "enzyme" | "toros" | "vicuna" | "bunni" | "beratrax" | "concrete" | "cian" | "pendle" | "yei" | "filament" | "gammaswap" | "maha" | "tempest" | "uranium" | "holdstation" | "katana" | "satlayer" | undefined;
|
224
227
|
depositUrl: any;
|
225
228
|
tags: string[];
|
@@ -7,7 +7,8 @@ import Elysia, { t } from "elysia";
|
|
7
7
|
import { throwOnUnsupportedChainId } from "src/utils/throw";
|
8
8
|
import { DynamicDataService } from "../dynamicData/dynamicData.service";
|
9
9
|
import { OpportunityService } from "../opportunity";
|
10
|
-
import {
|
10
|
+
import { OpportunityConvertorService } from "../opportunity/opportunity.converter";
|
11
|
+
import { CampaignResourceDto, CampaignUniqueDto, CreateCampaignDto, GetCampaignQueryDto, RemoveManualOverrideDto, UpdateCampaignCreatorDto, UpdateCampaignDto, UpdateMetaDataCampaignDto, } from "./campaign.model";
|
11
12
|
import { CampaignService } from "./campaign.service";
|
12
13
|
// ─── Campaigns Controller ────────────────────────────────────────────────────
|
13
14
|
export const CampaignController = new Elysia({ prefix: "/campaigns", detail: { tags: ["Campaigns"] } })
|
@@ -50,71 +51,36 @@ export const CampaignController = new Elysia({ prefix: "/campaigns", detail: { t
|
|
50
51
|
if (!id)
|
51
52
|
throw new NotFoundError();
|
52
53
|
const campaign = await CampaignService.findUniqueOrThrow(id, true);
|
53
|
-
const campaignV3 =
|
54
|
-
amount: campaign.amount,
|
55
|
-
campaignId: campaign.campaignId,
|
56
|
-
mainParameter: campaign.Opportunity.identifier,
|
57
|
-
campaignParameters: campaign.params,
|
58
|
-
campaignSubType: campaign.subType,
|
59
|
-
campaignType: Campaign[campaign.type],
|
60
|
-
chainId: campaign.distributionChainId,
|
61
|
-
computeChainId: campaign.computeChainId,
|
62
|
-
creator: campaign.creatorAddress,
|
63
|
-
endTimestamp: Number(campaign.endTimestamp),
|
64
|
-
rewardToken: campaign.RewardToken.address,
|
65
|
-
startTimestamp: Number(campaign.startTimestamp),
|
66
|
-
index: 0,
|
67
|
-
};
|
54
|
+
const campaignV3 = OpportunityConvertorService.convertV4CampaignToV3(Campaign[campaign.type], CampaignService.format(campaign), campaign.Opportunity.identifier);
|
68
55
|
return await DynamicDataService.updateForCampaigns([campaignV3]);
|
69
56
|
}, { beforeHandle: BackOfficeGuard, headers: AuthorizationHeadersDto, detail: { hide: true } })
|
70
|
-
// ───
|
71
|
-
.
|
57
|
+
// ─── Route for dev and test only ──────────────────────────────────────────────
|
58
|
+
.group("/dry-run", app => app
|
59
|
+
// ─── Test Dynamic data computation given a campaignId ───────────────────────
|
60
|
+
.get("/:campaignId/dynamic-data", async ({ params }) => {
|
72
61
|
const id = (await CampaignService.findMany({ campaignId: params.campaignId, test: true }))[0].id;
|
73
62
|
if (!id)
|
74
63
|
throw new NotFoundError();
|
75
64
|
const campaign = await CampaignService.findUniqueOrThrow(id, true);
|
76
|
-
const campaignV3 =
|
77
|
-
amount: campaign.amount,
|
78
|
-
campaignId: campaign.campaignId,
|
79
|
-
mainParameter: campaign.Opportunity.identifier,
|
80
|
-
campaignParameters: campaign.params,
|
81
|
-
campaignSubType: campaign.subType,
|
82
|
-
campaignType: Campaign[campaign.type],
|
83
|
-
chainId: campaign.distributionChainId,
|
84
|
-
computeChainId: campaign.computeChainId,
|
85
|
-
creator: campaign.creatorAddress,
|
86
|
-
endTimestamp: Number(campaign.endTimestamp),
|
87
|
-
rewardToken: campaign.RewardToken.address,
|
88
|
-
startTimestamp: Number(campaign.startTimestamp),
|
89
|
-
index: 0,
|
90
|
-
};
|
65
|
+
const campaignV3 = OpportunityConvertorService.convertV4CampaignToV3(Campaign[campaign.type], CampaignService.format(campaign), campaign.Opportunity.identifier);
|
91
66
|
return await DynamicDataService.updateForCampaigns([campaignV3], true);
|
92
67
|
}, { beforeHandle: BackOfficeGuard, headers: AuthorizationHeadersDto, detail: { hide: true } })
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
startTimestamp: campaign.startTimestamp.toString(),
|
110
|
-
index: 0,
|
111
|
-
type: Campaign[campaign.type],
|
112
|
-
params: JSON.stringify(campaign.params),
|
113
|
-
rewardTokenAddress: campaign.RewardToken.address,
|
114
|
-
opportunityIdentifier: campaign.Opportunity.identifier,
|
115
|
-
};
|
116
|
-
return await OpportunityService.fakeCreateFromCampaign(campaignV3);
|
117
|
-
}, { beforeHandle: BackOfficeGuard, headers: AuthorizationHeadersDto, detail: { hide: true } })
|
68
|
+
// ─── Test Opportunity creation through a campaign Id and a chain ───────────────────────
|
69
|
+
// @dev Starts from the engine db to debug opportunity creation failing and preventing the api db to be filled
|
70
|
+
.get("/:campaignId/metadata", async ({ query }) => {
|
71
|
+
const [campaign] = await CampaignService.findEngineCampaigns([
|
72
|
+
{
|
73
|
+
distributionChain: query.distributionChain,
|
74
|
+
campaignId: query.campaignId,
|
75
|
+
},
|
76
|
+
]);
|
77
|
+
return await OpportunityService.createFromCampaign(campaign, false, false);
|
78
|
+
}, {
|
79
|
+
beforeHandle: BackOfficeGuard,
|
80
|
+
headers: AuthorizationHeadersDto,
|
81
|
+
query: CampaignUniqueDto,
|
82
|
+
detail: { hide: true },
|
83
|
+
}))
|
118
84
|
// ─── Get Many Campaigns ──────────────────────────────────────────────
|
119
85
|
.get("/", async ({ query }) => {
|
120
86
|
if (query.items === 0)
|
@@ -715,7 +715,7 @@ export declare abstract class CampaignRepository {
|
|
715
715
|
static removeManualOverride(id: string, field: CampaignManualOverride): Promise<void>;
|
716
716
|
static updateOpportunity(id: string, data: extendedUpdateCampaignModel): Promise<void>;
|
717
717
|
static updateCreator(id: string, creatorAddress: string): Promise<void>;
|
718
|
-
static
|
718
|
+
static updateParams(id: string, params: string): Promise<{
|
719
719
|
id: string;
|
720
720
|
type: string;
|
721
721
|
params: Prisma.JsonValue;
|
@@ -439,7 +439,7 @@ export class CampaignRepository {
|
|
439
439
|
});
|
440
440
|
await CampaignRepository.addManualOverride(id, "creatorAddress");
|
441
441
|
}
|
442
|
-
static async
|
442
|
+
static async updateParams(id, params) {
|
443
443
|
const updateData = {
|
444
444
|
params: JSON.parse(params),
|
445
445
|
};
|
@@ -616,6 +616,20 @@ export declare abstract class CampaignService {
|
|
616
616
|
static pickCampaignToProcess(chainId: ChainId): Promise<{
|
617
617
|
campaignId: string;
|
618
618
|
}>;
|
619
|
+
static findEngineCampaigns(campaigns: CampaignUnique[]): Promise<{
|
620
|
+
amount: string;
|
621
|
+
chainId: number;
|
622
|
+
computeChainId: number;
|
623
|
+
creator: string;
|
624
|
+
endTimestamp: string;
|
625
|
+
campaignId: string;
|
626
|
+
opportunityIdentifier: string;
|
627
|
+
params: string;
|
628
|
+
rewardTokenAddress: string;
|
629
|
+
startTimestamp: string;
|
630
|
+
type: number;
|
631
|
+
subType: number;
|
632
|
+
}[]>;
|
619
633
|
static fill(campaigns: CampaignUnique[]): Promise<{
|
620
634
|
success: number;
|
621
635
|
fail: number;
|