@merkl/api 0.10.353 → 0.10.355

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.
Files changed (40) hide show
  1. package/dist/database/api/.generated/edge.js +10 -4
  2. package/dist/database/api/.generated/index-browser.js +7 -1
  3. package/dist/database/api/.generated/index.d.ts +7 -1
  4. package/dist/database/api/.generated/index.js +10 -4
  5. package/dist/database/api/.generated/package.json +1 -1
  6. package/dist/database/api/.generated/schema.prisma +6 -0
  7. package/dist/database/api/.generated/wasm.js +7 -1
  8. package/dist/src/eden/index.d.ts +21 -21
  9. package/dist/src/index.d.ts +7 -7
  10. package/dist/src/jobs/breakdowns.d.ts +1 -0
  11. package/dist/src/jobs/breakdowns.js +55 -0
  12. package/dist/src/jobs/etl/pendings.d.ts +1 -0
  13. package/dist/src/jobs/etl/pendings.js +74 -0
  14. package/dist/src/jobs/etl/reward-breakdowns.d.ts +1 -0
  15. package/dist/src/jobs/etl/reward-breakdowns.js +82 -0
  16. package/dist/src/jobs/etl/rewards.d.ts +1 -0
  17. package/dist/src/jobs/etl/rewards.js +102 -0
  18. package/dist/src/jobs/rewards.d.ts +1 -0
  19. package/dist/src/jobs/rewards.js +74 -0
  20. package/dist/src/modules/v4/bucket/bucket.service.d.ts +4 -1
  21. package/dist/src/modules/v4/bucket/bucket.service.js +83 -2
  22. package/dist/src/modules/v4/campaign/campaign.controller.d.ts +2 -2
  23. package/dist/src/modules/v4/campaign/campaign.model.d.ts +3 -0
  24. package/dist/src/modules/v4/dynamicData/dynamicData.controller.d.ts +2 -2
  25. package/dist/src/modules/v4/dynamicData/dynamicData.model.d.ts +6 -0
  26. package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +3 -3
  27. package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +6 -0
  28. package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +2 -2
  29. package/dist/src/modules/v4/opportunity/opportunity.service.js +4 -0
  30. package/dist/src/modules/v4/opportunity/subservices/getHyperdriveMetadata.service.d.ts +3 -0
  31. package/dist/src/modules/v4/opportunity/subservices/getHyperdriveMetadata.service.js +15 -0
  32. package/dist/src/modules/v4/programPayload/programPayload.repository.d.ts +4 -1
  33. package/dist/src/modules/v4/programPayload/programPayload.repository.js +101 -16
  34. package/dist/src/modules/v4/programPayload/programPayload.service.d.ts +3 -3
  35. package/dist/src/modules/v4/programPayload/programPayload.service.js +25 -11
  36. package/dist/src/modules/v4/protocol/protocol.model.d.ts +1 -1
  37. package/dist/src/modules/v4/protocol/protocol.model.js +1 -0
  38. package/dist/src/modules/v4/router.d.ts +7 -7
  39. package/dist/tsconfig.package.tsbuildinfo +1 -1
  40. package/package.json +4 -2
@@ -125,7 +125,7 @@ declare const eden: {
125
125
  } & {
126
126
  price?: number | null | undefined;
127
127
  })[];
128
- mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | undefined;
128
+ mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
129
129
  depositUrl: any;
130
130
  tags: string[];
131
131
  };
@@ -415,7 +415,7 @@ declare const eden: {
415
415
  depositUrl?: string | undefined;
416
416
  protocols?: string[] | undefined;
417
417
  mainProtocol?: string | undefined;
418
- type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST";
418
+ type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR";
419
419
  tokens: {
420
420
  chainId: number;
421
421
  address: string;
@@ -423,7 +423,7 @@ declare const eden: {
423
423
  status: "NONE" | "PAST" | "LIVE" | "SOON";
424
424
  identifier: string;
425
425
  chainId: number;
426
- action: "INVALID" | "POOL" | "HOLD" | "DROP" | "LEND" | "BORROW";
426
+ action: "INVALID" | "POOL" | "HOLD" | "DROP" | "LEND" | "BORROW" | "LP" | "LONG" | "SHORT";
427
427
  }, options: {
428
428
  headers: {
429
429
  authorization: string;
@@ -757,7 +757,7 @@ declare const eden: {
757
757
  get: (options: {
758
758
  headers?: Record<string, unknown> | undefined;
759
759
  query: {
760
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | undefined;
760
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
761
761
  items?: number | undefined;
762
762
  subType?: number | undefined;
763
763
  page?: number | undefined;
@@ -826,7 +826,7 @@ declare const eden: {
826
826
  get: (options: {
827
827
  headers?: Record<string, unknown> | undefined;
828
828
  query: {
829
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | undefined;
829
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
830
830
  items?: number | undefined;
831
831
  subType?: number | undefined;
832
832
  page?: number | undefined;
@@ -2269,7 +2269,7 @@ declare const eden: {
2269
2269
  rewardTokenAddress?: string | undefined;
2270
2270
  distributionChain?: {} | undefined;
2271
2271
  opportunityIdentifier?: string | undefined;
2272
- type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST";
2272
+ type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR";
2273
2273
  params: {};
2274
2274
  computeChainId: number;
2275
2275
  }, options: {
@@ -2289,7 +2289,7 @@ declare const eden: {
2289
2289
  authorization: string;
2290
2290
  };
2291
2291
  query: {
2292
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | undefined;
2292
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
2293
2293
  items?: number | undefined;
2294
2294
  subType?: number | undefined;
2295
2295
  page?: number | undefined;
@@ -3433,7 +3433,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
3433
3433
  depositUrl?: string | undefined;
3434
3434
  protocols?: string[] | undefined;
3435
3435
  mainProtocol?: string | undefined;
3436
- type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST";
3436
+ type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR";
3437
3437
  tokens: {
3438
3438
  chainId: number;
3439
3439
  address: string;
@@ -3441,7 +3441,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
3441
3441
  status: "NONE" | "PAST" | "LIVE" | "SOON";
3442
3442
  identifier: string;
3443
3443
  chainId: number;
3444
- action: "INVALID" | "POOL" | "HOLD" | "DROP" | "LEND" | "BORROW";
3444
+ action: "INVALID" | "POOL" | "HOLD" | "DROP" | "LEND" | "BORROW" | "LP" | "LONG" | "SHORT";
3445
3445
  };
3446
3446
  params: {};
3447
3447
  query: unknown;
@@ -3502,7 +3502,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
3502
3502
  } & {
3503
3503
  price?: number | null | undefined;
3504
3504
  })[];
3505
- mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | undefined;
3505
+ mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
3506
3506
  depositUrl: any;
3507
3507
  tags: string[];
3508
3508
  };
@@ -4171,7 +4171,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
4171
4171
  body: unknown;
4172
4172
  params: {};
4173
4173
  query: {
4174
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | undefined;
4174
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
4175
4175
  items?: number | undefined;
4176
4176
  subType?: number | undefined;
4177
4177
  page?: number | undefined;
@@ -4243,7 +4243,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
4243
4243
  body: unknown;
4244
4244
  params: {};
4245
4245
  query: {
4246
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | undefined;
4246
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
4247
4247
  items?: number | undefined;
4248
4248
  subType?: number | undefined;
4249
4249
  page?: number | undefined;
@@ -6102,7 +6102,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
6102
6102
  rewardTokenAddress?: string | undefined;
6103
6103
  distributionChain?: {} | undefined;
6104
6104
  opportunityIdentifier?: string | undefined;
6105
- type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST";
6105
+ type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR";
6106
6106
  params: {};
6107
6107
  computeChainId: number;
6108
6108
  };
@@ -6125,7 +6125,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
6125
6125
  body: unknown;
6126
6126
  params: {};
6127
6127
  query: {
6128
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | undefined;
6128
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
6129
6129
  items?: number | undefined;
6130
6130
  subType?: number | undefined;
6131
6131
  page?: number | undefined;
@@ -7510,7 +7510,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
7510
7510
  } & {
7511
7511
  price?: number | null | undefined;
7512
7512
  })[];
7513
- mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | undefined;
7513
+ mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
7514
7514
  depositUrl: any;
7515
7515
  tags: string[];
7516
7516
  };
@@ -7800,7 +7800,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
7800
7800
  depositUrl?: string | undefined;
7801
7801
  protocols?: string[] | undefined;
7802
7802
  mainProtocol?: string | undefined;
7803
- type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST";
7803
+ type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR";
7804
7804
  tokens: {
7805
7805
  chainId: number;
7806
7806
  address: string;
@@ -7808,7 +7808,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
7808
7808
  status: "NONE" | "PAST" | "LIVE" | "SOON";
7809
7809
  identifier: string;
7810
7810
  chainId: number;
7811
- action: "INVALID" | "POOL" | "HOLD" | "DROP" | "LEND" | "BORROW";
7811
+ action: "INVALID" | "POOL" | "HOLD" | "DROP" | "LEND" | "BORROW" | "LP" | "LONG" | "SHORT";
7812
7812
  }, options: {
7813
7813
  headers: {
7814
7814
  authorization: string;
@@ -8142,7 +8142,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
8142
8142
  get: (options: {
8143
8143
  headers?: Record<string, unknown> | undefined;
8144
8144
  query: {
8145
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | undefined;
8145
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
8146
8146
  items?: number | undefined;
8147
8147
  subType?: number | undefined;
8148
8148
  page?: number | undefined;
@@ -8211,7 +8211,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
8211
8211
  get: (options: {
8212
8212
  headers?: Record<string, unknown> | undefined;
8213
8213
  query: {
8214
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | undefined;
8214
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
8215
8215
  items?: number | undefined;
8216
8216
  subType?: number | undefined;
8217
8217
  page?: number | undefined;
@@ -9654,7 +9654,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
9654
9654
  rewardTokenAddress?: string | undefined;
9655
9655
  distributionChain?: {} | undefined;
9656
9656
  opportunityIdentifier?: string | undefined;
9657
- type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST";
9657
+ type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR";
9658
9658
  params: {};
9659
9659
  computeChainId: number;
9660
9660
  }, options: {
@@ -9674,7 +9674,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
9674
9674
  authorization: string;
9675
9675
  };
9676
9676
  query: {
9677
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | undefined;
9677
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
9678
9678
  items?: number | undefined;
9679
9679
  subType?: number | undefined;
9680
9680
  page?: number | undefined;
@@ -152,7 +152,7 @@ declare const app: Elysia<"", false, {
152
152
  depositUrl?: string | undefined;
153
153
  protocols?: string[] | undefined;
154
154
  mainProtocol?: string | undefined;
155
- type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST";
155
+ type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR";
156
156
  tokens: {
157
157
  chainId: number;
158
158
  address: string;
@@ -160,7 +160,7 @@ declare const app: Elysia<"", false, {
160
160
  status: "NONE" | "PAST" | "LIVE" | "SOON";
161
161
  identifier: string;
162
162
  chainId: number;
163
- action: "INVALID" | "POOL" | "HOLD" | "DROP" | "LEND" | "BORROW";
163
+ action: "INVALID" | "POOL" | "HOLD" | "DROP" | "LEND" | "BORROW" | "LP" | "LONG" | "SHORT";
164
164
  };
165
165
  params: {};
166
166
  query: unknown;
@@ -221,7 +221,7 @@ declare const app: Elysia<"", false, {
221
221
  } & {
222
222
  price?: number | null | undefined;
223
223
  })[];
224
- mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | undefined;
224
+ mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
225
225
  depositUrl: any;
226
226
  tags: string[];
227
227
  };
@@ -890,7 +890,7 @@ declare const app: Elysia<"", false, {
890
890
  body: unknown;
891
891
  params: {};
892
892
  query: {
893
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | undefined;
893
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
894
894
  items?: number | undefined;
895
895
  subType?: number | undefined;
896
896
  page?: number | undefined;
@@ -962,7 +962,7 @@ declare const app: Elysia<"", false, {
962
962
  body: unknown;
963
963
  params: {};
964
964
  query: {
965
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | undefined;
965
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
966
966
  items?: number | undefined;
967
967
  subType?: number | undefined;
968
968
  page?: number | undefined;
@@ -2821,7 +2821,7 @@ declare const app: Elysia<"", false, {
2821
2821
  rewardTokenAddress?: string | undefined;
2822
2822
  distributionChain?: {} | undefined;
2823
2823
  opportunityIdentifier?: string | undefined;
2824
- type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST";
2824
+ type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR";
2825
2825
  params: {};
2826
2826
  computeChainId: number;
2827
2827
  };
@@ -2844,7 +2844,7 @@ declare const app: Elysia<"", false, {
2844
2844
  body: unknown;
2845
2845
  params: {};
2846
2846
  query: {
2847
- type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | undefined;
2847
+ type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
2848
2848
  items?: number | undefined;
2849
2849
  subType?: number | undefined;
2850
2850
  page?: number | undefined;
@@ -0,0 +1 @@
1
+ export declare const writeBreakdownsToAPI: (chainId: number, root: string) => Promise<void>;
@@ -0,0 +1,55 @@
1
+ import { CampaignService, TokenService } from "../modules/v4";
2
+ import { BucketService } from "../modules/v4/bucket/bucket.service";
3
+ import { RewardService } from "../modules/v4/reward";
4
+ import { log } from "../utils/logger";
5
+ import { apiDbClient } from "../utils/prisma";
6
+ import moment from "moment";
7
+ // @dev Trigger at the end of the rewards job
8
+ export const writeBreakdownsToAPI = async (chainId, root) => {
9
+ const start = moment().unix();
10
+ const environmentName = process.env.ENV === "staging" ? "staging" : "production";
11
+ const breakdownBatches = [[]];
12
+ const breakdownBatchPromises = [];
13
+ let currentBreakdownBatchIndex = 0;
14
+ const pushBreakdowns = async (index) => {
15
+ log.local(`pushing breakdown batch ${index} (${breakdownBatches[index].length} points) to API DB`);
16
+ // Upsert users in case they don't exist yet
17
+ const breakdownsToCreate = [];
18
+ for (const b of breakdownBatches[index]) {
19
+ const campaignId = CampaignService.hashId({ distributionChain: chainId, campaignId: b.campaignId });
20
+ const rewardTokenId = TokenService.hashId({ chainId, address: b.token });
21
+ const rewardId = RewardService.hashId(root, b.recipient, rewardTokenId);
22
+ breakdownsToCreate.push({
23
+ rewardId,
24
+ protocolId: b.protocolId ? b.protocolId : undefined,
25
+ campaignId,
26
+ reason: b.reason ? b.reason : "",
27
+ amount: b.amount,
28
+ claimed: b.claimed,
29
+ pending: b.pending,
30
+ auxiliaryData1: b.auxiliaryData1 ?? "",
31
+ auxiliaryData2: b.auxiliaryData2 ?? "",
32
+ });
33
+ }
34
+ return (await apiDbClient.rewardBreakdown.createMany({
35
+ data: breakdownsToCreate,
36
+ skipDuplicates: true, // To avoid revert if data already exists
37
+ })).count;
38
+ };
39
+ await BucketService.readStreamFromBucket(`breakdowns/${chainId}-${root}.gz`, `merkl-rewards-lake-${environmentName}`, `merkl-data-${environmentName}`, async (x) => {
40
+ const breakdowns = JSON.parse(x);
41
+ for (const b of breakdowns) {
42
+ breakdownBatches[currentBreakdownBatchIndex].push(b);
43
+ if (breakdownBatches[currentBreakdownBatchIndex].length >= 30_000) {
44
+ breakdownBatchPromises.push(pushBreakdowns(currentBreakdownBatchIndex));
45
+ breakdownBatches.push([]);
46
+ currentBreakdownBatchIndex++;
47
+ }
48
+ }
49
+ return;
50
+ });
51
+ // Final batch
52
+ breakdownBatchPromises.push(pushBreakdowns(currentBreakdownBatchIndex));
53
+ const breakdownsCreated = (await Promise.all(breakdownBatchPromises)).reduce((acc, x) => acc + x, 0);
54
+ log.info(`✅ Successfully created ${breakdownsCreated} breakdowns in ${moment().unix() - start}sec`);
55
+ };
@@ -0,0 +1 @@
1
+ export declare const main: () => Promise<void>;
@@ -0,0 +1,74 @@
1
+ // ─── Pendings ETL ─────────────────────────────────────────────────────────────
2
+ if (!process.env.ENV || !process.env.FILENAME)
3
+ throw new Error("[ENV]: missing variable");
4
+ import { BucketService } from "../../modules/v4/bucket/bucket.service";
5
+ import { RewardService } from "../../modules/v4/reward";
6
+ import moment from "moment";
7
+ import { log } from "../../utils/logger";
8
+ // ─── Constants ───────────────────────────────────────────────
9
+ const BATCH_SIZE = 20_000;
10
+ // ─── Global Variables ────────────────────────────────────────
11
+ const [chainIdString, root, campaignId] = process.env.FILENAME.split("_");
12
+ const chainId = Number.parseInt(chainIdString);
13
+ const pendingsToCreate = [[]];
14
+ const failedBatches = [];
15
+ // ─── Extract ─────────────────────────────────────────────────────────────────
16
+ const extract = async () => {
17
+ let count = 0;
18
+ let currentBatchIndex = 0;
19
+ await BucketService.readStreamFromBucket(`pendings/${process.env.FILENAME}.gz`, `merkl-rewards-lake-${process.env.ENV}`, `merkl-data-${process.env.ENV}`, async (x) => {
20
+ pendingsToCreate[currentBatchIndex].push(transform(JSON.parse(x)));
21
+ if (pendingsToCreate[currentBatchIndex].length >= BATCH_SIZE) {
22
+ try {
23
+ count += await load(pendingsToCreate[currentBatchIndex]);
24
+ log.info(`Successfully inserted a batch of ${count} rewards`);
25
+ }
26
+ catch (err) {
27
+ console.error(`Failed to insert a batch, adding it to the fail queue.\n${err}`);
28
+ failedBatches.push(currentBatchIndex);
29
+ }
30
+ currentBatchIndex++;
31
+ pendingsToCreate.push([]);
32
+ }
33
+ return;
34
+ });
35
+ // ─── Current Batch Not In DB Yet ─────────────────────────────────────
36
+ try {
37
+ const count = await load(pendingsToCreate[currentBatchIndex]);
38
+ if (count !== 0)
39
+ log.info(`Successfully inserted a batch of ${count} rewards`);
40
+ }
41
+ catch (err) {
42
+ console.error(`Failed to insert a batch, adding it to the fail queue.\n${err}`);
43
+ failedBatches.push(currentBatchIndex);
44
+ }
45
+ return count;
46
+ };
47
+ // ─── Transform ───────────────────────────────────────────────────────────────
48
+ const transform = (pending) => {
49
+ return pending;
50
+ };
51
+ // ─── Load ────────────────────────────────────────────────────────────────────
52
+ const load = async (pendings) => {
53
+ const { updated, created } = await RewardService.updatePendings({
54
+ distributionChainId: chainId,
55
+ rewardToken: pendings[0].rewardToken,
56
+ campaignId,
57
+ root,
58
+ data: pendings,
59
+ });
60
+ return updated + created;
61
+ };
62
+ // ─────────────────────────────────────────────────────────────────────────────
63
+ export const main = async () => {
64
+ const start = moment().unix();
65
+ // ─── Start Rewards ETL ───────────────────────────────────────────────
66
+ const count = await extract();
67
+ log.info(`✅ Successfully created ${count} new records in ${moment().unix() - start} sec`);
68
+ if (failedBatches.length !== 0)
69
+ log.info(`${failedBatches.length}/${pendingsToCreate.length} batches failed.`);
70
+ if (failedBatches.length === 0) {
71
+ await BucketService.deleteFile(`rewards/${process.env.FILENAME}.gz`, `merkl-rewards-lake-${process.env.ENV}`, `merkl-data-${process.env.ENV}`);
72
+ }
73
+ };
74
+ main();
@@ -0,0 +1 @@
1
+ export declare const main: () => Promise<void>;
@@ -0,0 +1,82 @@
1
+ // ─── Reward Breakdowns ETL ───────────────────────────────────────────────────
2
+ if (!process.env.ENV || !process.env.CHAIN_ID || !process.env.ROOT)
3
+ throw new Error("[ENV]: missing variable");
4
+ import { BucketService } from "../../modules/v4/bucket/bucket.service";
5
+ import { log } from "../../utils/logger";
6
+ import { apiDbClient } from "../../utils/prisma";
7
+ import moment from "moment";
8
+ // ─── Constants ───────────────────────────────────────────────
9
+ const BATCH_SIZE = 30_000;
10
+ // ─── Global Variables ────────────────────────────────────────
11
+ const rewardBreakdownsToCreate = [[]];
12
+ const failedBatches = [];
13
+ // ─── Extract ─────────────────────────────────────────────────────────────────
14
+ const extract = async () => {
15
+ let currentBatchIndex = 0;
16
+ let count = 0;
17
+ await BucketService.readStreamFromBucket(`breakdowns/${process.env.CHAIN_ID}-${process.env.ROOT}.gz`, `merkl-rewards-lake-${process.env.ENV}`, `merkl-data-${process.env.ENV}`, async (x) => {
18
+ const breakdowns = JSON.parse(x);
19
+ for (const breakdown of breakdowns) {
20
+ rewardBreakdownsToCreate[currentBatchIndex].push(transform(breakdown));
21
+ if (rewardBreakdownsToCreate[currentBatchIndex].length >= BATCH_SIZE) {
22
+ try {
23
+ count += await load(rewardBreakdownsToCreate[currentBatchIndex]);
24
+ }
25
+ catch (err) {
26
+ console.error(`Failed to insert a batch, adding it to the fail queue.\n${err}`);
27
+ failedBatches.push(currentBatchIndex);
28
+ }
29
+ currentBatchIndex++;
30
+ rewardBreakdownsToCreate.push([]);
31
+ }
32
+ }
33
+ return;
34
+ });
35
+ // ─── Current Batch Not In DB Yet ─────────────────────────────────────
36
+ try {
37
+ const count = await load(rewardBreakdownsToCreate[currentBatchIndex]);
38
+ if (count !== 0)
39
+ log.info(`Successfully inserted a batch of ${count} rewards`);
40
+ }
41
+ catch (err) {
42
+ console.error(`Failed to insert a batch, adding it to the fail queue.\n${err}`);
43
+ failedBatches.push(currentBatchIndex);
44
+ }
45
+ return count;
46
+ };
47
+ // ─── Transform ───────────────────────────────────────────────────────────────
48
+ const transform = (rewardBreakdown) => {
49
+ const campaignId = Bun.hash(`${process.env.CHAIN_ID}${rewardBreakdown.campaignId}`).toString();
50
+ const rewardTokenId = Bun.hash(`${process.env.CHAIN_ID}${rewardBreakdown.token}`).toString();
51
+ const rewardId = Bun.hash(`${process.env.ROOT}${rewardBreakdown.recipient}${rewardTokenId}`).toString();
52
+ return {
53
+ rewardId,
54
+ protocolId: rewardBreakdown.protocolId ? rewardBreakdown.protocolId : undefined,
55
+ campaignId,
56
+ reason: rewardBreakdown.reason ? rewardBreakdown.reason : "",
57
+ amount: rewardBreakdown.amount,
58
+ claimed: rewardBreakdown.claimed,
59
+ pending: rewardBreakdown.pending,
60
+ auxiliaryData1: rewardBreakdown.auxiliaryData1 ?? "",
61
+ auxiliaryData2: rewardBreakdown.auxiliaryData2 ?? "",
62
+ };
63
+ };
64
+ // ─── Load ────────────────────────────────────────────────────────────────────
65
+ const load = async (rewardBreakdowns) => {
66
+ return (await apiDbClient.rewardBreakdown.createMany({
67
+ data: rewardBreakdowns,
68
+ skipDuplicates: true,
69
+ })).count;
70
+ };
71
+ // ─── Main ────────────────────────────────────────────────────────────────────
72
+ export const main = async () => {
73
+ const start = moment().unix();
74
+ const count = await extract();
75
+ log.info(`✅ Successfully created ${count} new records in ${moment().unix() - start} sec`);
76
+ if (failedBatches.length !== 0)
77
+ log.info(`${failedBatches.length}/${rewardBreakdownsToCreate.length} batches failed.`);
78
+ if (failedBatches.length === 0) {
79
+ await BucketService.deleteFile(`rewards/${process.env.CHAIN_ID}-${process.env.ROOT}.gz`, `merkl-rewards-lake-${process.env.ENV}`, `merkl-data-${process.env.ENV}`);
80
+ }
81
+ };
82
+ main();
@@ -0,0 +1 @@
1
+ export declare const main: () => Promise<void>;
@@ -0,0 +1,102 @@
1
+ // ─── Rewards ETL ─────────────────────────────────────────────────────────────
2
+ if (!process.env.ENV || !process.env.CHAIN_ID || !process.env.ROOT)
3
+ throw new Error("[ENV]: missing variable");
4
+ import { BucketService } from "../../modules/v4/bucket/bucket.service";
5
+ import { log } from "../../utils/logger";
6
+ import { apiDbClient } from "../../utils/prisma";
7
+ import moment from "moment";
8
+ // ─── Constants ───────────────────────────────────────────────
9
+ const BATCH_SIZE = 20_000;
10
+ // ─── Global Variables ────────────────────────────────────────
11
+ const rewardsToCreate = [[]];
12
+ const failedBatches = [];
13
+ // ─── Extract ─────────────────────────────────────────────────────────────────
14
+ const extract = async () => {
15
+ let count = 0;
16
+ let currentBatchIndex = 0;
17
+ await BucketService.readStreamFromBucket(`rewards/${process.env.CHAIN_ID}-${process.env.ROOT}.gz`, `merkl-rewards-lake-${process.env.ENV}`, `merkl-data-${process.env.ENV}`, async (x) => {
18
+ rewardsToCreate[currentBatchIndex].push(transform(JSON.parse(x)));
19
+ if (rewardsToCreate[currentBatchIndex].length >= BATCH_SIZE) {
20
+ try {
21
+ count += await load(rewardsToCreate[currentBatchIndex]);
22
+ log.info(`Successfully inserted a batch of ${count} rewards`);
23
+ }
24
+ catch (err) {
25
+ console.error(`Failed to insert a batch, adding it to the fail queue.\n${err}`);
26
+ failedBatches.push(currentBatchIndex);
27
+ }
28
+ currentBatchIndex++;
29
+ rewardsToCreate.push([]);
30
+ }
31
+ return;
32
+ });
33
+ // ─── Current Batch Not In DB Yet ─────────────────────────────────────
34
+ try {
35
+ const count = await load(rewardsToCreate[currentBatchIndex]);
36
+ if (count !== 0)
37
+ log.info(`Successfully inserted a batch of ${count} rewards`);
38
+ }
39
+ catch (err) {
40
+ console.error(`Failed to insert a batch, adding it to the fail queue.\n${err}`);
41
+ failedBatches.push(currentBatchIndex);
42
+ }
43
+ return count;
44
+ };
45
+ // ─── Transform ───────────────────────────────────────────────────────────────
46
+ const transform = (reward) => {
47
+ const rewardTokenId = Bun.hash(`${process.env.CHAIN_ID}${reward.rewardToken}`).toString();
48
+ const id = Bun.hash(`${process.env.ROOT}${reward.recipient}${rewardTokenId}`).toString();
49
+ return {
50
+ id,
51
+ root: reward.root,
52
+ amount: reward.amount,
53
+ pending: reward.pending,
54
+ claimed: reward.claimed,
55
+ recipient: reward.recipient,
56
+ rewardTokenId,
57
+ proofs: reward.proofs,
58
+ };
59
+ };
60
+ // ─── Load ────────────────────────────────────────────────────────────────────
61
+ const load = async (rewards) => {
62
+ // ─── Load Users ──────────────────────────────────────────────────────
63
+ await apiDbClient.user.createMany({
64
+ data: rewards.map(r => {
65
+ return {
66
+ address: r.recipient,
67
+ };
68
+ }),
69
+ skipDuplicates: true,
70
+ });
71
+ // ─── Load Rewards ────────────────────────────────────────────────────
72
+ return (await apiDbClient.reward.createMany({
73
+ data: rewards,
74
+ skipDuplicates: true,
75
+ })).count;
76
+ };
77
+ // ─────────────────────────────────────────────────────────────────────────────
78
+ export const main = async () => {
79
+ const start = moment().unix();
80
+ // ─── Create Merkle Root If Not Exists ────────────────────────────────
81
+ await apiDbClient.merklRoot.upsert({
82
+ create: {
83
+ root: process.env.ROOT,
84
+ chainId: +process.env.CHAIN_ID,
85
+ epoch: Math.floor(start / 3_600),
86
+ timestamp: start,
87
+ },
88
+ update: {},
89
+ where: {
90
+ root: process.env.ROOT,
91
+ },
92
+ });
93
+ // ─── Start Rewards ETL ───────────────────────────────────────────────
94
+ const count = await extract();
95
+ log.info(`✅ Successfully created ${count} new records in ${moment().unix() - start} sec`);
96
+ if (failedBatches.length !== 0)
97
+ log.info(`${failedBatches.length}/${rewardsToCreate.length} batches failed.`);
98
+ if (failedBatches.length === 0) {
99
+ await BucketService.deleteFile(`rewards/${process.env.CHAIN_ID}-${process.env.ROOT}.gz`, `merkl-rewards-lake-${process.env.ENV}`, `merkl-data-${process.env.ENV}`);
100
+ }
101
+ };
102
+ main();