@varity-labs/sdk 2.0.0-alpha.1

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 (295) hide show
  1. package/LICENSE +31 -0
  2. package/README.md +253 -0
  3. package/dist/analytics/index.d.ts +7 -0
  4. package/dist/analytics/index.d.ts.map +1 -0
  5. package/dist/analytics/index.js +6 -0
  6. package/dist/analytics/tracker.d.ts +128 -0
  7. package/dist/analytics/tracker.d.ts.map +1 -0
  8. package/dist/analytics/tracker.js +203 -0
  9. package/dist/blockchain/BlockchainService.d.ts +100 -0
  10. package/dist/blockchain/BlockchainService.d.ts.map +1 -0
  11. package/dist/blockchain/BlockchainService.js +188 -0
  12. package/dist/blockchain/NFTLicensingService.d.ts +69 -0
  13. package/dist/blockchain/NFTLicensingService.d.ts.map +1 -0
  14. package/dist/blockchain/NFTLicensingService.js +136 -0
  15. package/dist/blockchain/RevenueSplitService.d.ts +71 -0
  16. package/dist/blockchain/RevenueSplitService.d.ts.map +1 -0
  17. package/dist/blockchain/RevenueSplitService.js +111 -0
  18. package/dist/blockchain/index.d.ts +48 -0
  19. package/dist/blockchain/index.d.ts.map +1 -0
  20. package/dist/blockchain/index.js +46 -0
  21. package/dist/blockchain/types.d.ts +63 -0
  22. package/dist/blockchain/types.d.ts.map +1 -0
  23. package/dist/blockchain/types.js +6 -0
  24. package/dist/chains/arbitrum.d.ts +89 -0
  25. package/dist/chains/arbitrum.d.ts.map +1 -0
  26. package/dist/chains/arbitrum.js +134 -0
  27. package/dist/chains/base.d.ts +84 -0
  28. package/dist/chains/base.d.ts.map +1 -0
  29. package/dist/chains/base.js +131 -0
  30. package/dist/chains/index.d.ts +36 -0
  31. package/dist/chains/index.d.ts.map +1 -0
  32. package/dist/chains/index.js +32 -0
  33. package/dist/chains/registry.d.ts +113 -0
  34. package/dist/chains/registry.d.ts.map +1 -0
  35. package/dist/chains/registry.js +201 -0
  36. package/dist/chains/varityL3.d.ts +81 -0
  37. package/dist/chains/varityL3.d.ts.map +1 -0
  38. package/dist/chains/varityL3.js +125 -0
  39. package/dist/cli/commands/clone.d.ts +8 -0
  40. package/dist/cli/commands/clone.d.ts.map +1 -0
  41. package/dist/cli/commands/clone.js +391 -0
  42. package/dist/cli/commands/dev.d.ts +8 -0
  43. package/dist/cli/commands/dev.d.ts.map +1 -0
  44. package/dist/cli/commands/dev.js +40 -0
  45. package/dist/cli/commands/generate.d.ts +8 -0
  46. package/dist/cli/commands/generate.d.ts.map +1 -0
  47. package/dist/cli/commands/generate.js +303 -0
  48. package/dist/cli/commands/init.d.ts +8 -0
  49. package/dist/cli/commands/init.d.ts.map +1 -0
  50. package/dist/cli/commands/init.js +317 -0
  51. package/dist/cli/commands/validate.d.ts +8 -0
  52. package/dist/cli/commands/validate.d.ts.map +1 -0
  53. package/dist/cli/commands/validate.js +69 -0
  54. package/dist/cli/index.d.ts +8 -0
  55. package/dist/cli/index.d.ts.map +1 -0
  56. package/dist/cli/index.js +33 -0
  57. package/dist/cli/utils/logger.d.ts +17 -0
  58. package/dist/cli/utils/logger.d.ts.map +1 -0
  59. package/dist/cli/utils/logger.js +35 -0
  60. package/dist/cli/utils/prompts.d.ts +21 -0
  61. package/dist/cli/utils/prompts.d.ts.map +1 -0
  62. package/dist/cli/utils/prompts.js +103 -0
  63. package/dist/contracts/abis/iso/AccessControlRegistry.json +1468 -0
  64. package/dist/contracts/abis/iso/DataProofRegistry.json +797 -0
  65. package/dist/contracts/abis/iso/MerchantRegistry.json +1237 -0
  66. package/dist/contracts/abis/iso/RepPerformance.json +1351 -0
  67. package/dist/contracts/abis/iso/ResidualCalculator.json +1118 -0
  68. package/dist/contracts/abis/iso/TransactionVault.json +1588 -0
  69. package/dist/contracts/abis/iso/VarityWalletFactory.json +475 -0
  70. package/dist/contracts/addresses.d.ts +88 -0
  71. package/dist/contracts/addresses.d.ts.map +1 -0
  72. package/dist/contracts/addresses.js +94 -0
  73. package/dist/contracts/index.d.ts +7 -0
  74. package/dist/contracts/index.d.ts.map +1 -0
  75. package/dist/contracts/index.js +6 -0
  76. package/dist/core/VaritySDK.d.ts +177 -0
  77. package/dist/core/VaritySDK.d.ts.map +1 -0
  78. package/dist/core/VaritySDK.js +325 -0
  79. package/dist/core/config.d.ts +120 -0
  80. package/dist/core/config.d.ts.map +1 -0
  81. package/dist/core/config.js +187 -0
  82. package/dist/core/credentials-proxy.d.ts +157 -0
  83. package/dist/core/credentials-proxy.d.ts.map +1 -0
  84. package/dist/core/credentials-proxy.js +345 -0
  85. package/dist/core/credentials.d.ts +219 -0
  86. package/dist/core/credentials.d.ts.map +1 -0
  87. package/dist/core/credentials.js +345 -0
  88. package/dist/core/template-loader.d.ts +15 -0
  89. package/dist/core/template-loader.d.ts.map +1 -0
  90. package/dist/core/template-loader.js +380 -0
  91. package/dist/core/template.d.ts +321 -0
  92. package/dist/core/template.d.ts.map +1 -0
  93. package/dist/core/template.js +189 -0
  94. package/dist/core/types.d.ts +572 -0
  95. package/dist/core/types.d.ts.map +1 -0
  96. package/dist/core/types.js +52 -0
  97. package/dist/dev/dev-server.d.ts +16 -0
  98. package/dist/dev/dev-server.d.ts.map +1 -0
  99. package/dist/dev/dev-server.js +119 -0
  100. package/dist/generators/contracts/generator.d.ts +21 -0
  101. package/dist/generators/contracts/generator.d.ts.map +1 -0
  102. package/dist/generators/contracts/generator.js +252 -0
  103. package/dist/generators/tests/generator.d.ts +20 -0
  104. package/dist/generators/tests/generator.d.ts.map +1 -0
  105. package/dist/generators/tests/generator.js +375 -0
  106. package/dist/generators/types/generator.d.ts +19 -0
  107. package/dist/generators/types/generator.d.ts.map +1 -0
  108. package/dist/generators/types/generator.js +165 -0
  109. package/dist/generators/ui/component-generator.d.ts +20 -0
  110. package/dist/generators/ui/component-generator.d.ts.map +1 -0
  111. package/dist/generators/ui/component-generator.js +749 -0
  112. package/dist/generators/ui/dashboard-generator.d.ts +20 -0
  113. package/dist/generators/ui/dashboard-generator.d.ts.map +1 -0
  114. package/dist/generators/ui/dashboard-generator.js +349 -0
  115. package/dist/index.d.ts +61 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +74 -0
  118. package/dist/modules/analytics/AnalyticsModule.d.ts +349 -0
  119. package/dist/modules/analytics/AnalyticsModule.d.ts.map +1 -0
  120. package/dist/modules/analytics/AnalyticsModule.js +274 -0
  121. package/dist/modules/analytics/index.d.ts +3 -0
  122. package/dist/modules/analytics/index.d.ts.map +1 -0
  123. package/dist/modules/analytics/index.js +1 -0
  124. package/dist/modules/auth/AccessKeyModule.d.ts +189 -0
  125. package/dist/modules/auth/AccessKeyModule.d.ts.map +1 -0
  126. package/dist/modules/auth/AccessKeyModule.js +322 -0
  127. package/dist/modules/auth/AuthModule.d.ts +133 -0
  128. package/dist/modules/auth/AuthModule.d.ts.map +1 -0
  129. package/dist/modules/auth/AuthModule.js +214 -0
  130. package/dist/modules/auth/index.d.ts +8 -0
  131. package/dist/modules/auth/index.d.ts.map +1 -0
  132. package/dist/modules/auth/index.js +6 -0
  133. package/dist/modules/cache/CacheModule.d.ts +279 -0
  134. package/dist/modules/cache/CacheModule.d.ts.map +1 -0
  135. package/dist/modules/cache/CacheModule.js +493 -0
  136. package/dist/modules/cache/index.d.ts +3 -0
  137. package/dist/modules/cache/index.d.ts.map +1 -0
  138. package/dist/modules/cache/index.js +1 -0
  139. package/dist/modules/compute/ComputeModule.d.ts +226 -0
  140. package/dist/modules/compute/ComputeModule.d.ts.map +1 -0
  141. package/dist/modules/compute/ComputeModule.js +379 -0
  142. package/dist/modules/compute/index.d.ts +6 -0
  143. package/dist/modules/compute/index.d.ts.map +1 -0
  144. package/dist/modules/compute/index.js +4 -0
  145. package/dist/modules/contracts/ContractsModule.d.ts +164 -0
  146. package/dist/modules/contracts/ContractsModule.d.ts.map +1 -0
  147. package/dist/modules/contracts/ContractsModule.js +242 -0
  148. package/dist/modules/contracts/index.d.ts +6 -0
  149. package/dist/modules/contracts/index.d.ts.map +1 -0
  150. package/dist/modules/contracts/index.js +4 -0
  151. package/dist/modules/export/ExportModule.d.ts +346 -0
  152. package/dist/modules/export/ExportModule.d.ts.map +1 -0
  153. package/dist/modules/export/ExportModule.js +432 -0
  154. package/dist/modules/export/index.d.ts +3 -0
  155. package/dist/modules/export/index.d.ts.map +1 -0
  156. package/dist/modules/export/index.js +1 -0
  157. package/dist/modules/forecasting/ForecastingModule.d.ts +579 -0
  158. package/dist/modules/forecasting/ForecastingModule.d.ts.map +1 -0
  159. package/dist/modules/forecasting/ForecastingModule.js +310 -0
  160. package/dist/modules/forecasting/index.d.ts +3 -0
  161. package/dist/modules/forecasting/index.d.ts.map +1 -0
  162. package/dist/modules/forecasting/index.js +1 -0
  163. package/dist/modules/monitoring/MonitoringModule.d.ts +359 -0
  164. package/dist/modules/monitoring/MonitoringModule.d.ts.map +1 -0
  165. package/dist/modules/monitoring/MonitoringModule.js +483 -0
  166. package/dist/modules/monitoring/index.d.ts +3 -0
  167. package/dist/modules/monitoring/index.d.ts.map +1 -0
  168. package/dist/modules/monitoring/index.js +1 -0
  169. package/dist/modules/notifications/NotificationsModule.d.ts +336 -0
  170. package/dist/modules/notifications/NotificationsModule.d.ts.map +1 -0
  171. package/dist/modules/notifications/NotificationsModule.js +418 -0
  172. package/dist/modules/notifications/index.d.ts +3 -0
  173. package/dist/modules/notifications/index.d.ts.map +1 -0
  174. package/dist/modules/notifications/index.js +1 -0
  175. package/dist/modules/oracle/OracleModule.d.ts +110 -0
  176. package/dist/modules/oracle/OracleModule.d.ts.map +1 -0
  177. package/dist/modules/oracle/OracleModule.js +151 -0
  178. package/dist/modules/oracle/index.d.ts +6 -0
  179. package/dist/modules/oracle/index.d.ts.map +1 -0
  180. package/dist/modules/oracle/index.js +4 -0
  181. package/dist/modules/storage/S3Module.d.ts +377 -0
  182. package/dist/modules/storage/S3Module.d.ts.map +1 -0
  183. package/dist/modules/storage/S3Module.js +680 -0
  184. package/dist/modules/storage/StorageModule.d.ts +157 -0
  185. package/dist/modules/storage/StorageModule.d.ts.map +1 -0
  186. package/dist/modules/storage/StorageModule.js +302 -0
  187. package/dist/modules/storage/adapters/AdapterFactory.d.ts +100 -0
  188. package/dist/modules/storage/adapters/AdapterFactory.d.ts.map +1 -0
  189. package/dist/modules/storage/adapters/AdapterFactory.js +209 -0
  190. package/dist/modules/storage/adapters/FilecoinAdapter.d.ts +94 -0
  191. package/dist/modules/storage/adapters/FilecoinAdapter.d.ts.map +1 -0
  192. package/dist/modules/storage/adapters/FilecoinAdapter.js +263 -0
  193. package/dist/modules/storage/adapters/IStorageAdapter.d.ts +287 -0
  194. package/dist/modules/storage/adapters/IStorageAdapter.d.ts.map +1 -0
  195. package/dist/modules/storage/adapters/IStorageAdapter.js +81 -0
  196. package/dist/modules/storage/adapters/MultiTierAdapter.d.ts +187 -0
  197. package/dist/modules/storage/adapters/MultiTierAdapter.d.ts.map +1 -0
  198. package/dist/modules/storage/adapters/MultiTierAdapter.js +430 -0
  199. package/dist/modules/storage/adapters/index.d.ts +12 -0
  200. package/dist/modules/storage/adapters/index.d.ts.map +1 -0
  201. package/dist/modules/storage/adapters/index.js +12 -0
  202. package/dist/modules/storage/index.d.ts +16 -0
  203. package/dist/modules/storage/index.d.ts.map +1 -0
  204. package/dist/modules/storage/index.js +15 -0
  205. package/dist/modules/storage/tiering/AccessAnalyzer.d.ts +227 -0
  206. package/dist/modules/storage/tiering/AccessAnalyzer.d.ts.map +1 -0
  207. package/dist/modules/storage/tiering/AccessAnalyzer.js +367 -0
  208. package/dist/modules/storage/tiering/CostOptimizer.d.ts +248 -0
  209. package/dist/modules/storage/tiering/CostOptimizer.d.ts.map +1 -0
  210. package/dist/modules/storage/tiering/CostOptimizer.js +356 -0
  211. package/dist/modules/storage/tiering/MetadataStore.d.ts +287 -0
  212. package/dist/modules/storage/tiering/MetadataStore.d.ts.map +1 -0
  213. package/dist/modules/storage/tiering/MetadataStore.js +535 -0
  214. package/dist/modules/storage/tiering/TieringEngine.d.ts +237 -0
  215. package/dist/modules/storage/tiering/TieringEngine.d.ts.map +1 -0
  216. package/dist/modules/storage/tiering/TieringEngine.js +419 -0
  217. package/dist/modules/storage/tiering/example.d.ts +8 -0
  218. package/dist/modules/storage/tiering/example.d.ts.map +1 -0
  219. package/dist/modules/storage/tiering/example.js +250 -0
  220. package/dist/modules/storage/tiering/index.d.ts +17 -0
  221. package/dist/modules/storage/tiering/index.d.ts.map +1 -0
  222. package/dist/modules/storage/tiering/index.js +13 -0
  223. package/dist/modules/webhooks/WebhooksModule.d.ts +476 -0
  224. package/dist/modules/webhooks/WebhooksModule.d.ts.map +1 -0
  225. package/dist/modules/webhooks/WebhooksModule.js +359 -0
  226. package/dist/modules/webhooks/index.d.ts +3 -0
  227. package/dist/modules/webhooks/index.d.ts.map +1 -0
  228. package/dist/modules/webhooks/index.js +1 -0
  229. package/dist/modules/zk/ZKModule.d.ts +153 -0
  230. package/dist/modules/zk/ZKModule.d.ts.map +1 -0
  231. package/dist/modules/zk/ZKModule.js +262 -0
  232. package/dist/modules/zk/index.d.ts +7 -0
  233. package/dist/modules/zk/index.d.ts.map +1 -0
  234. package/dist/modules/zk/index.js +4 -0
  235. package/dist/thirdweb/BridgeClient.d.ts +228 -0
  236. package/dist/thirdweb/BridgeClient.d.ts.map +1 -0
  237. package/dist/thirdweb/BridgeClient.js +160 -0
  238. package/dist/thirdweb/EngineClient.d.ts +396 -0
  239. package/dist/thirdweb/EngineClient.d.ts.map +1 -0
  240. package/dist/thirdweb/EngineClient.js +386 -0
  241. package/dist/thirdweb/GatewayClient.d.ts +190 -0
  242. package/dist/thirdweb/GatewayClient.d.ts.map +1 -0
  243. package/dist/thirdweb/GatewayClient.js +257 -0
  244. package/dist/thirdweb/NebulaClient.d.ts +292 -0
  245. package/dist/thirdweb/NebulaClient.d.ts.map +1 -0
  246. package/dist/thirdweb/NebulaClient.js +180 -0
  247. package/dist/thirdweb/StorageClient.d.ts +445 -0
  248. package/dist/thirdweb/StorageClient.d.ts.map +1 -0
  249. package/dist/thirdweb/StorageClient.js +405 -0
  250. package/dist/thirdweb/ThirdwebWrapper.d.ts +236 -0
  251. package/dist/thirdweb/ThirdwebWrapper.d.ts.map +1 -0
  252. package/dist/thirdweb/ThirdwebWrapper.js +332 -0
  253. package/dist/thirdweb/index.d.ts +21 -0
  254. package/dist/thirdweb/index.d.ts.map +1 -0
  255. package/dist/thirdweb/index.js +28 -0
  256. package/dist/thirdweb/varity-chain.d.ts +48 -0
  257. package/dist/thirdweb/varity-chain.d.ts.map +1 -0
  258. package/dist/thirdweb/varity-chain.js +64 -0
  259. package/dist/thirdweb/x402Client.d.ts +319 -0
  260. package/dist/thirdweb/x402Client.d.ts.map +1 -0
  261. package/dist/thirdweb/x402Client.js +223 -0
  262. package/dist/tracking/gasTracker.d.ts +158 -0
  263. package/dist/tracking/gasTracker.d.ts.map +1 -0
  264. package/dist/tracking/gasTracker.js +227 -0
  265. package/dist/tracking/index.d.ts +10 -0
  266. package/dist/tracking/index.d.ts.map +1 -0
  267. package/dist/tracking/index.js +8 -0
  268. package/dist/tracking/types.d.ts +327 -0
  269. package/dist/tracking/types.d.ts.map +1 -0
  270. package/dist/tracking/types.js +8 -0
  271. package/dist/ui/components/ChartWidget.d.ts +36 -0
  272. package/dist/ui/components/ChartWidget.d.ts.map +1 -0
  273. package/dist/ui/components/ChartWidget.js +82 -0
  274. package/dist/ui/components/DashboardLayout.d.ts +41 -0
  275. package/dist/ui/components/DashboardLayout.d.ts.map +1 -0
  276. package/dist/ui/components/DashboardLayout.js +102 -0
  277. package/dist/ui/components/DataTable.d.ts +49 -0
  278. package/dist/ui/components/DataTable.d.ts.map +1 -0
  279. package/dist/ui/components/DataTable.js +96 -0
  280. package/dist/ui/components/EntityForm.d.ts +60 -0
  281. package/dist/ui/components/EntityForm.d.ts.map +1 -0
  282. package/dist/ui/components/EntityForm.js +182 -0
  283. package/dist/ui/components/KPICard.d.ts +29 -0
  284. package/dist/ui/components/KPICard.d.ts.map +1 -0
  285. package/dist/ui/components/KPICard.js +61 -0
  286. package/dist/ui/components/Modal.d.ts +34 -0
  287. package/dist/ui/components/Modal.d.ts.map +1 -0
  288. package/dist/ui/components/Modal.js +30 -0
  289. package/dist/ui/components/index.d.ts +18 -0
  290. package/dist/ui/components/index.d.ts.map +1 -0
  291. package/dist/ui/components/index.js +11 -0
  292. package/dist/validation/template-validator.d.ts +25 -0
  293. package/dist/validation/template-validator.d.ts.map +1 -0
  294. package/dist/validation/template-validator.js +305 -0
  295. package/package.json +102 -0
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Varity SDK - Cost Optimizer
3
+ *
4
+ * Calculates optimal storage tier placement based on access patterns,
5
+ * object characteristics, and cost models. Provides cost-benefit analysis
6
+ * and savings estimation for intelligent tiering decisions.
7
+ *
8
+ * Features:
9
+ * - Multi-factor cost calculation
10
+ * - Tier optimization algorithms
11
+ * - Savings estimation
12
+ * - Cost-benefit analysis
13
+ * - What-if scenarios
14
+ *
15
+ * @packageDocumentation
16
+ */
17
+ import { StorageTier, type AccessPattern } from '@varity-labs/types';
18
+ /**
19
+ * Cost model for a storage tier
20
+ */
21
+ export interface TierCostModel {
22
+ /** Tier identifier */
23
+ tier: StorageTier;
24
+ /** Storage cost per GB per month (USD) */
25
+ storageCostPerGB: number;
26
+ /** Retrieval cost per GB (USD) */
27
+ retrievalCostPerGB: number;
28
+ /** Request cost per 1000 requests (USD) */
29
+ requestCostPer1000: number;
30
+ /** Data transfer cost per GB (USD) */
31
+ transferCostPerGB: number;
32
+ /** Minimum storage duration in days */
33
+ minStorageDays?: number;
34
+ /** Early deletion fee per GB (USD) */
35
+ earlyDeletionFeePerGB?: number;
36
+ }
37
+ /**
38
+ * Cost breakdown for an object in a tier
39
+ */
40
+ export interface CostBreakdown {
41
+ /** Storage tier */
42
+ tier: StorageTier;
43
+ /** Monthly storage cost (USD) */
44
+ storageCost: number;
45
+ /** Monthly retrieval cost estimate (USD) */
46
+ retrievalCost: number;
47
+ /** Monthly request cost estimate (USD) */
48
+ requestCost: number;
49
+ /** Monthly transfer cost estimate (USD) */
50
+ transferCost: number;
51
+ /** Total monthly cost (USD) */
52
+ totalMonthlyCost: number;
53
+ /** Cost per access (USD) */
54
+ costPerAccess: number;
55
+ /** Assumptions used in calculation */
56
+ assumptions: Record<string, any>;
57
+ }
58
+ /**
59
+ * Optimization result
60
+ */
61
+ export interface OptimizationResult {
62
+ /** Object identifier */
63
+ identifier: string;
64
+ /** Current tier */
65
+ currentTier: StorageTier;
66
+ /** Optimal tier */
67
+ optimalTier: StorageTier;
68
+ /** Current monthly cost (USD) */
69
+ currentCost: number;
70
+ /** Optimal tier monthly cost (USD) */
71
+ optimalCost: number;
72
+ /** Monthly savings (USD) */
73
+ monthlySavings: number;
74
+ /** Annual savings (USD) */
75
+ annualSavings: number;
76
+ /** Savings percentage */
77
+ savingsPercent: number;
78
+ /** Cost breakdown for current tier */
79
+ currentBreakdown: CostBreakdown;
80
+ /** Cost breakdown for optimal tier */
81
+ optimalBreakdown: CostBreakdown;
82
+ /** Confidence in optimization (0-1) */
83
+ confidence: number;
84
+ /** Reason for optimization */
85
+ reason: string;
86
+ }
87
+ /**
88
+ * What-if scenario parameters
89
+ */
90
+ export interface WhatIfScenario {
91
+ /** Object size in bytes */
92
+ size: number;
93
+ /** Access frequency (accesses per month) */
94
+ accessesPerMonth: number;
95
+ /** Average data transfer per access (bytes) */
96
+ avgTransferPerAccess: number;
97
+ /** Storage duration (months) */
98
+ durationMonths: number;
99
+ /** Tiers to compare */
100
+ tiersToCompare?: StorageTier[];
101
+ }
102
+ /**
103
+ * What-if scenario result
104
+ */
105
+ export interface WhatIfResult {
106
+ /** Scenario parameters */
107
+ scenario: WhatIfScenario;
108
+ /** Cost analysis per tier */
109
+ tierCosts: Record<StorageTier, CostBreakdown>;
110
+ /** Most cost-effective tier */
111
+ bestTier: StorageTier;
112
+ /** Cost difference from best tier */
113
+ costComparisons: Record<StorageTier, number>;
114
+ }
115
+ /**
116
+ * Cost optimizer configuration
117
+ */
118
+ export interface CostOptimizerConfig {
119
+ /** Cost models for each tier */
120
+ tierCosts: Record<StorageTier, TierCostModel>;
121
+ /** Default access frequency for objects without history */
122
+ defaultAccessesPerMonth?: number;
123
+ /** Default data transfer ratio (bytes transferred / object size) */
124
+ defaultTransferRatio?: number;
125
+ /** Optimization threshold (min savings to recommend change) */
126
+ optimizationThreshold?: number;
127
+ }
128
+ /**
129
+ * Advanced cost optimizer for storage tier selection
130
+ *
131
+ * @example
132
+ * ```typescript
133
+ * const optimizer = new CostOptimizer({
134
+ * tierCosts: {
135
+ * [StorageTier.HOT]: {
136
+ * tier: StorageTier.HOT,
137
+ * storageCostPerGB: 0.023,
138
+ * retrievalCostPerGB: 0,
139
+ * requestCostPer1000: 0.005,
140
+ * transferCostPerGB: 0.09
141
+ * },
142
+ * [StorageTier.COLD]: {
143
+ * tier: StorageTier.COLD,
144
+ * storageCostPerGB: 0.01,
145
+ * retrievalCostPerGB: 0.01,
146
+ * requestCostPer1000: 0.01,
147
+ * transferCostPerGB: 0.09
148
+ * }
149
+ * }
150
+ * })
151
+ *
152
+ * const optimal = optimizer.calculateOptimalTier(
153
+ * 'obj-123',
154
+ * 1024 * 1024 * 100, // 100 MB
155
+ * accessPattern
156
+ * )
157
+ *
158
+ * console.log(`Optimal tier: ${optimal.optimalTier}`)
159
+ * console.log(`Monthly savings: $${optimal.monthlySavings}`)
160
+ * ```
161
+ */
162
+ export declare class CostOptimizer {
163
+ private config;
164
+ constructor(config: CostOptimizerConfig);
165
+ /**
166
+ * Calculate optimal tier for an object
167
+ *
168
+ * @param identifier - Object identifier
169
+ * @param size - Object size in bytes
170
+ * @param accessPattern - Access pattern data
171
+ * @returns Optimization result
172
+ */
173
+ calculateOptimalTier(identifier: string, size: number, accessPattern: AccessPattern): OptimizationResult;
174
+ /**
175
+ * Estimate savings from moving to target tier
176
+ *
177
+ * @param currentTier - Current storage tier
178
+ * @param targetTier - Target storage tier
179
+ * @param size - Object size in bytes
180
+ * @param accessPattern - Access pattern data
181
+ * @returns Estimated monthly savings (positive = savings, negative = increase)
182
+ */
183
+ estimateSavings(currentTier: StorageTier, targetTier: StorageTier, size: number, accessPattern: AccessPattern): number;
184
+ /**
185
+ * Calculate detailed cost breakdown for a tier
186
+ *
187
+ * @param size - Object size in bytes
188
+ * @param tier - Storage tier
189
+ * @param accessesPerMonth - Number of accesses per month
190
+ * @param transferBytes - Total bytes transferred per month
191
+ * @returns Cost breakdown
192
+ */
193
+ calculateTierCost(size: number, tier: StorageTier, accessesPerMonth?: number, transferBytes?: number): CostBreakdown;
194
+ /**
195
+ * Run what-if scenario analysis
196
+ *
197
+ * @param scenario - Scenario parameters
198
+ * @returns What-if result
199
+ */
200
+ runWhatIfScenario(scenario: WhatIfScenario): WhatIfResult;
201
+ /**
202
+ * Calculate total cost for multiple objects
203
+ *
204
+ * @param objects - Array of object data
205
+ * @returns Total cost breakdown by tier
206
+ */
207
+ calculateTotalCost(objects: Array<{
208
+ identifier: string;
209
+ size: number;
210
+ tier: StorageTier;
211
+ accessPattern: AccessPattern;
212
+ }>): {
213
+ totalMonthlyCost: number;
214
+ byTier: Record<StorageTier, {
215
+ cost: number;
216
+ count: number;
217
+ size: number;
218
+ }>;
219
+ optimizationOpportunities: OptimizationResult[];
220
+ };
221
+ /**
222
+ * Get cost model for a tier
223
+ */
224
+ getTierCostModel(tier: StorageTier): TierCostModel;
225
+ /**
226
+ * Update cost model for a tier
227
+ */
228
+ updateTierCostModel(tier: StorageTier, model: Partial<TierCostModel>): void;
229
+ /**
230
+ * Get configuration
231
+ */
232
+ getConfig(): Required<CostOptimizerConfig>;
233
+ /**
234
+ * Generate human-readable optimization reason
235
+ */
236
+ private generateOptimizationReason;
237
+ }
238
+ /**
239
+ * Default DePin-optimized cost models
240
+ *
241
+ * Based on Filecoin/IPFS pricing with significant savings over AWS S3/GCS
242
+ */
243
+ export declare const DEFAULT_DEPIN_COST_MODELS: Record<StorageTier, TierCostModel>;
244
+ /**
245
+ * AWS S3 cost models for comparison
246
+ */
247
+ export declare const AWS_S3_COST_MODELS: Record<StorageTier, TierCostModel>;
248
+ //# sourceMappingURL=CostOptimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CostOptimizer.d.ts","sourceRoot":"","sources":["../../../../src/modules/storage/tiering/CostOptimizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,356 @@
1
+ /**
2
+ * Varity SDK - Cost Optimizer
3
+ *
4
+ * Calculates optimal storage tier placement based on access patterns,
5
+ * object characteristics, and cost models. Provides cost-benefit analysis
6
+ * and savings estimation for intelligent tiering decisions.
7
+ *
8
+ * Features:
9
+ * - Multi-factor cost calculation
10
+ * - Tier optimization algorithms
11
+ * - Savings estimation
12
+ * - Cost-benefit analysis
13
+ * - What-if scenarios
14
+ *
15
+ * @packageDocumentation
16
+ */
17
+ import { StorageTier } from '@varity-labs/types';
18
+ /**
19
+ * Advanced cost optimizer for storage tier selection
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const optimizer = new CostOptimizer({
24
+ * tierCosts: {
25
+ * [StorageTier.HOT]: {
26
+ * tier: StorageTier.HOT,
27
+ * storageCostPerGB: 0.023,
28
+ * retrievalCostPerGB: 0,
29
+ * requestCostPer1000: 0.005,
30
+ * transferCostPerGB: 0.09
31
+ * },
32
+ * [StorageTier.COLD]: {
33
+ * tier: StorageTier.COLD,
34
+ * storageCostPerGB: 0.01,
35
+ * retrievalCostPerGB: 0.01,
36
+ * requestCostPer1000: 0.01,
37
+ * transferCostPerGB: 0.09
38
+ * }
39
+ * }
40
+ * })
41
+ *
42
+ * const optimal = optimizer.calculateOptimalTier(
43
+ * 'obj-123',
44
+ * 1024 * 1024 * 100, // 100 MB
45
+ * accessPattern
46
+ * )
47
+ *
48
+ * console.log(`Optimal tier: ${optimal.optimalTier}`)
49
+ * console.log(`Monthly savings: $${optimal.monthlySavings}`)
50
+ * ```
51
+ */
52
+ export class CostOptimizer {
53
+ constructor(config) {
54
+ this.config = {
55
+ ...config,
56
+ defaultAccessesPerMonth: config.defaultAccessesPerMonth ?? 1,
57
+ defaultTransferRatio: config.defaultTransferRatio ?? 1.0,
58
+ optimizationThreshold: config.optimizationThreshold ?? 0.5 // $0.50/month minimum savings
59
+ };
60
+ }
61
+ /**
62
+ * Calculate optimal tier for an object
63
+ *
64
+ * @param identifier - Object identifier
65
+ * @param size - Object size in bytes
66
+ * @param accessPattern - Access pattern data
67
+ * @returns Optimization result
68
+ */
69
+ calculateOptimalTier(identifier, size, accessPattern) {
70
+ const currentTier = accessPattern.currentTier;
71
+ // Calculate costs for all tiers
72
+ const tierCosts = new Map();
73
+ for (const tier of Object.values(StorageTier)) {
74
+ const cost = this.calculateTierCost(size, tier, accessPattern.accessCount, accessPattern.totalBandwidth);
75
+ tierCosts.set(tier, cost);
76
+ }
77
+ // Find optimal tier (lowest total cost)
78
+ let optimalTier = currentTier;
79
+ let lowestCost = tierCosts.get(currentTier).totalMonthlyCost;
80
+ for (const [tier, cost] of tierCosts.entries()) {
81
+ if (cost.totalMonthlyCost < lowestCost) {
82
+ lowestCost = cost.totalMonthlyCost;
83
+ optimalTier = tier;
84
+ }
85
+ }
86
+ const currentBreakdown = tierCosts.get(currentTier);
87
+ const optimalBreakdown = tierCosts.get(optimalTier);
88
+ const monthlySavings = currentBreakdown.totalMonthlyCost - optimalBreakdown.totalMonthlyCost;
89
+ const annualSavings = monthlySavings * 12;
90
+ const savingsPercent = currentBreakdown.totalMonthlyCost > 0
91
+ ? (monthlySavings / currentBreakdown.totalMonthlyCost) * 100
92
+ : 0;
93
+ // Calculate confidence based on access pattern confidence
94
+ const confidence = accessPattern.recommendationConfidence;
95
+ // Generate reason
96
+ const reason = this.generateOptimizationReason(currentTier, optimalTier, accessPattern, monthlySavings);
97
+ return {
98
+ identifier,
99
+ currentTier,
100
+ optimalTier,
101
+ currentCost: currentBreakdown.totalMonthlyCost,
102
+ optimalCost: optimalBreakdown.totalMonthlyCost,
103
+ monthlySavings,
104
+ annualSavings,
105
+ savingsPercent,
106
+ currentBreakdown,
107
+ optimalBreakdown,
108
+ confidence,
109
+ reason
110
+ };
111
+ }
112
+ /**
113
+ * Estimate savings from moving to target tier
114
+ *
115
+ * @param currentTier - Current storage tier
116
+ * @param targetTier - Target storage tier
117
+ * @param size - Object size in bytes
118
+ * @param accessPattern - Access pattern data
119
+ * @returns Estimated monthly savings (positive = savings, negative = increase)
120
+ */
121
+ estimateSavings(currentTier, targetTier, size, accessPattern) {
122
+ const currentCost = this.calculateTierCost(size, currentTier, accessPattern.accessCount, accessPattern.totalBandwidth).totalMonthlyCost;
123
+ const targetCost = this.calculateTierCost(size, targetTier, accessPattern.accessCount, accessPattern.totalBandwidth).totalMonthlyCost;
124
+ return currentCost - targetCost;
125
+ }
126
+ /**
127
+ * Calculate detailed cost breakdown for a tier
128
+ *
129
+ * @param size - Object size in bytes
130
+ * @param tier - Storage tier
131
+ * @param accessesPerMonth - Number of accesses per month
132
+ * @param transferBytes - Total bytes transferred per month
133
+ * @returns Cost breakdown
134
+ */
135
+ calculateTierCost(size, tier, accessesPerMonth = this.config.defaultAccessesPerMonth, transferBytes = size * this.config.defaultTransferRatio) {
136
+ const model = this.config.tierCosts[tier];
137
+ const sizeGB = size / (1024 * 1024 * 1024);
138
+ const transferGB = transferBytes / (1024 * 1024 * 1024);
139
+ // Storage cost (monthly)
140
+ const storageCost = sizeGB * model.storageCostPerGB;
141
+ // Retrieval cost (based on accesses)
142
+ const retrievalGB = (transferBytes * accessesPerMonth) / (1024 * 1024 * 1024);
143
+ const retrievalCost = retrievalGB * model.retrievalCostPerGB;
144
+ // Request cost
145
+ const requestCost = (accessesPerMonth / 1000) * model.requestCostPer1000;
146
+ // Transfer cost
147
+ const transferCost = transferGB * accessesPerMonth * model.transferCostPerGB;
148
+ const totalMonthlyCost = storageCost + retrievalCost + requestCost + transferCost;
149
+ const costPerAccess = accessesPerMonth > 0 ? totalMonthlyCost / accessesPerMonth : 0;
150
+ return {
151
+ tier,
152
+ storageCost,
153
+ retrievalCost,
154
+ requestCost,
155
+ transferCost,
156
+ totalMonthlyCost,
157
+ costPerAccess,
158
+ assumptions: {
159
+ sizeGB,
160
+ accessesPerMonth,
161
+ transferGB,
162
+ model
163
+ }
164
+ };
165
+ }
166
+ /**
167
+ * Run what-if scenario analysis
168
+ *
169
+ * @param scenario - Scenario parameters
170
+ * @returns What-if result
171
+ */
172
+ runWhatIfScenario(scenario) {
173
+ const tiersToCompare = scenario.tiersToCompare || Object.values(StorageTier);
174
+ const tierCosts = {};
175
+ for (const tier of tiersToCompare) {
176
+ tierCosts[tier] = this.calculateTierCost(scenario.size, tier, scenario.accessesPerMonth, scenario.avgTransferPerAccess * scenario.accessesPerMonth);
177
+ }
178
+ // Find best tier
179
+ let bestTier = tiersToCompare[0];
180
+ let lowestCost = tierCosts[bestTier].totalMonthlyCost;
181
+ for (const tier of tiersToCompare) {
182
+ if (tierCosts[tier].totalMonthlyCost < lowestCost) {
183
+ lowestCost = tierCosts[tier].totalMonthlyCost;
184
+ bestTier = tier;
185
+ }
186
+ }
187
+ // Calculate cost differences
188
+ const costComparisons = {};
189
+ for (const tier of tiersToCompare) {
190
+ costComparisons[tier] = tierCosts[tier].totalMonthlyCost - lowestCost;
191
+ }
192
+ return {
193
+ scenario,
194
+ tierCosts,
195
+ bestTier,
196
+ costComparisons
197
+ };
198
+ }
199
+ /**
200
+ * Calculate total cost for multiple objects
201
+ *
202
+ * @param objects - Array of object data
203
+ * @returns Total cost breakdown by tier
204
+ */
205
+ calculateTotalCost(objects) {
206
+ let totalMonthlyCost = 0;
207
+ const byTier = {
208
+ [StorageTier.HOT]: { cost: 0, count: 0, size: 0 },
209
+ [StorageTier.WARM]: { cost: 0, count: 0, size: 0 },
210
+ [StorageTier.COLD]: { cost: 0, count: 0, size: 0 },
211
+ [StorageTier.GLACIER]: { cost: 0, count: 0, size: 0 }
212
+ };
213
+ const optimizationOpportunities = [];
214
+ for (const obj of objects) {
215
+ const cost = this.calculateTierCost(obj.size, obj.tier, obj.accessPattern.accessCount, obj.accessPattern.totalBandwidth);
216
+ totalMonthlyCost += cost.totalMonthlyCost;
217
+ byTier[obj.tier].cost += cost.totalMonthlyCost;
218
+ byTier[obj.tier].count++;
219
+ byTier[obj.tier].size += obj.size;
220
+ // Check for optimization opportunities
221
+ const optimization = this.calculateOptimalTier(obj.identifier, obj.size, obj.accessPattern);
222
+ if (optimization.monthlySavings >= this.config.optimizationThreshold &&
223
+ optimization.optimalTier !== obj.tier) {
224
+ optimizationOpportunities.push(optimization);
225
+ }
226
+ }
227
+ // Sort optimization opportunities by savings
228
+ optimizationOpportunities.sort((a, b) => b.monthlySavings - a.monthlySavings);
229
+ return {
230
+ totalMonthlyCost,
231
+ byTier,
232
+ optimizationOpportunities
233
+ };
234
+ }
235
+ /**
236
+ * Get cost model for a tier
237
+ */
238
+ getTierCostModel(tier) {
239
+ return this.config.tierCosts[tier];
240
+ }
241
+ /**
242
+ * Update cost model for a tier
243
+ */
244
+ updateTierCostModel(tier, model) {
245
+ this.config.tierCosts[tier] = {
246
+ ...this.config.tierCosts[tier],
247
+ ...model
248
+ };
249
+ }
250
+ /**
251
+ * Get configuration
252
+ */
253
+ getConfig() {
254
+ return { ...this.config };
255
+ }
256
+ // ========================================================================
257
+ // Private helper methods
258
+ // ========================================================================
259
+ /**
260
+ * Generate human-readable optimization reason
261
+ */
262
+ generateOptimizationReason(currentTier, optimalTier, accessPattern, savings) {
263
+ if (currentTier === optimalTier) {
264
+ return 'Current tier is already optimal';
265
+ }
266
+ const tierOrder = [StorageTier.GLACIER, StorageTier.COLD, StorageTier.WARM, StorageTier.HOT];
267
+ const isPromotion = tierOrder.indexOf(optimalTier) > tierOrder.indexOf(currentTier);
268
+ if (savings < this.config.optimizationThreshold) {
269
+ return `Minor optimization available (${isPromotion ? 'promote' : 'demote'} to ${optimalTier}), but below threshold`;
270
+ }
271
+ const accessFreq = accessPattern.accessCount / Math.max(1, accessPattern.averageAccessInterval);
272
+ if (isPromotion) {
273
+ return `Promote to ${optimalTier} for better performance (access freq: ${accessFreq.toFixed(2)}/day, savings: $${savings.toFixed(2)}/mo)`;
274
+ }
275
+ else {
276
+ return `Demote to ${optimalTier} for cost savings (low access freq: ${accessFreq.toFixed(2)}/day, savings: $${savings.toFixed(2)}/mo)`;
277
+ }
278
+ }
279
+ }
280
+ /**
281
+ * Default DePin-optimized cost models
282
+ *
283
+ * Based on Filecoin/IPFS pricing with significant savings over AWS S3/GCS
284
+ */
285
+ export const DEFAULT_DEPIN_COST_MODELS = {
286
+ [StorageTier.HOT]: {
287
+ tier: StorageTier.HOT,
288
+ storageCostPerGB: 0.002, // Filecoin with IPFS pinning
289
+ retrievalCostPerGB: 0.001,
290
+ requestCostPer1000: 0.0005,
291
+ transferCostPerGB: 0.01, // DePin egress
292
+ minStorageDays: 0
293
+ },
294
+ [StorageTier.WARM]: {
295
+ tier: StorageTier.WARM,
296
+ storageCostPerGB: 0.0015,
297
+ retrievalCostPerGB: 0.002,
298
+ requestCostPer1000: 0.001,
299
+ transferCostPerGB: 0.01,
300
+ minStorageDays: 7
301
+ },
302
+ [StorageTier.COLD]: {
303
+ tier: StorageTier.COLD,
304
+ storageCostPerGB: 0.001, // Filecoin standard
305
+ retrievalCostPerGB: 0.005,
306
+ requestCostPer1000: 0.002,
307
+ transferCostPerGB: 0.01,
308
+ minStorageDays: 30
309
+ },
310
+ [StorageTier.GLACIER]: {
311
+ tier: StorageTier.GLACIER,
312
+ storageCostPerGB: 0.0005, // Filecoin archive
313
+ retrievalCostPerGB: 0.01,
314
+ requestCostPer1000: 0.005,
315
+ transferCostPerGB: 0.01,
316
+ minStorageDays: 90,
317
+ earlyDeletionFeePerGB: 0.001
318
+ }
319
+ };
320
+ /**
321
+ * AWS S3 cost models for comparison
322
+ */
323
+ export const AWS_S3_COST_MODELS = {
324
+ [StorageTier.HOT]: {
325
+ tier: StorageTier.HOT,
326
+ storageCostPerGB: 0.023, // S3 Standard
327
+ retrievalCostPerGB: 0,
328
+ requestCostPer1000: 0.005,
329
+ transferCostPerGB: 0.09
330
+ },
331
+ [StorageTier.WARM]: {
332
+ tier: StorageTier.WARM,
333
+ storageCostPerGB: 0.0125, // S3 Standard-IA
334
+ retrievalCostPerGB: 0.01,
335
+ requestCostPer1000: 0.01,
336
+ transferCostPerGB: 0.09,
337
+ minStorageDays: 30
338
+ },
339
+ [StorageTier.COLD]: {
340
+ tier: StorageTier.COLD,
341
+ storageCostPerGB: 0.004, // S3 Glacier Instant
342
+ retrievalCostPerGB: 0.03,
343
+ requestCostPer1000: 0.02,
344
+ transferCostPerGB: 0.09,
345
+ minStorageDays: 90
346
+ },
347
+ [StorageTier.GLACIER]: {
348
+ tier: StorageTier.GLACIER,
349
+ storageCostPerGB: 0.001, // S3 Glacier Deep Archive
350
+ retrievalCostPerGB: 0.02,
351
+ requestCostPer1000: 0.05,
352
+ transferCostPerGB: 0.09,
353
+ minStorageDays: 180,
354
+ earlyDeletionFeePerGB: 0.001
355
+ }
356
+ };