@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.
- package/LICENSE +31 -0
- package/README.md +253 -0
- package/dist/analytics/index.d.ts +7 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +6 -0
- package/dist/analytics/tracker.d.ts +128 -0
- package/dist/analytics/tracker.d.ts.map +1 -0
- package/dist/analytics/tracker.js +203 -0
- package/dist/blockchain/BlockchainService.d.ts +100 -0
- package/dist/blockchain/BlockchainService.d.ts.map +1 -0
- package/dist/blockchain/BlockchainService.js +188 -0
- package/dist/blockchain/NFTLicensingService.d.ts +69 -0
- package/dist/blockchain/NFTLicensingService.d.ts.map +1 -0
- package/dist/blockchain/NFTLicensingService.js +136 -0
- package/dist/blockchain/RevenueSplitService.d.ts +71 -0
- package/dist/blockchain/RevenueSplitService.d.ts.map +1 -0
- package/dist/blockchain/RevenueSplitService.js +111 -0
- package/dist/blockchain/index.d.ts +48 -0
- package/dist/blockchain/index.d.ts.map +1 -0
- package/dist/blockchain/index.js +46 -0
- package/dist/blockchain/types.d.ts +63 -0
- package/dist/blockchain/types.d.ts.map +1 -0
- package/dist/blockchain/types.js +6 -0
- package/dist/chains/arbitrum.d.ts +89 -0
- package/dist/chains/arbitrum.d.ts.map +1 -0
- package/dist/chains/arbitrum.js +134 -0
- package/dist/chains/base.d.ts +84 -0
- package/dist/chains/base.d.ts.map +1 -0
- package/dist/chains/base.js +131 -0
- package/dist/chains/index.d.ts +36 -0
- package/dist/chains/index.d.ts.map +1 -0
- package/dist/chains/index.js +32 -0
- package/dist/chains/registry.d.ts +113 -0
- package/dist/chains/registry.d.ts.map +1 -0
- package/dist/chains/registry.js +201 -0
- package/dist/chains/varityL3.d.ts +81 -0
- package/dist/chains/varityL3.d.ts.map +1 -0
- package/dist/chains/varityL3.js +125 -0
- package/dist/cli/commands/clone.d.ts +8 -0
- package/dist/cli/commands/clone.d.ts.map +1 -0
- package/dist/cli/commands/clone.js +391 -0
- package/dist/cli/commands/dev.d.ts +8 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +40 -0
- package/dist/cli/commands/generate.d.ts +8 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +303 -0
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +317 -0
- package/dist/cli/commands/validate.d.ts +8 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +69 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +33 -0
- package/dist/cli/utils/logger.d.ts +17 -0
- package/dist/cli/utils/logger.d.ts.map +1 -0
- package/dist/cli/utils/logger.js +35 -0
- package/dist/cli/utils/prompts.d.ts +21 -0
- package/dist/cli/utils/prompts.d.ts.map +1 -0
- package/dist/cli/utils/prompts.js +103 -0
- package/dist/contracts/abis/iso/AccessControlRegistry.json +1468 -0
- package/dist/contracts/abis/iso/DataProofRegistry.json +797 -0
- package/dist/contracts/abis/iso/MerchantRegistry.json +1237 -0
- package/dist/contracts/abis/iso/RepPerformance.json +1351 -0
- package/dist/contracts/abis/iso/ResidualCalculator.json +1118 -0
- package/dist/contracts/abis/iso/TransactionVault.json +1588 -0
- package/dist/contracts/abis/iso/VarityWalletFactory.json +475 -0
- package/dist/contracts/addresses.d.ts +88 -0
- package/dist/contracts/addresses.d.ts.map +1 -0
- package/dist/contracts/addresses.js +94 -0
- package/dist/contracts/index.d.ts +7 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +6 -0
- package/dist/core/VaritySDK.d.ts +177 -0
- package/dist/core/VaritySDK.d.ts.map +1 -0
- package/dist/core/VaritySDK.js +325 -0
- package/dist/core/config.d.ts +120 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +187 -0
- package/dist/core/credentials-proxy.d.ts +157 -0
- package/dist/core/credentials-proxy.d.ts.map +1 -0
- package/dist/core/credentials-proxy.js +345 -0
- package/dist/core/credentials.d.ts +219 -0
- package/dist/core/credentials.d.ts.map +1 -0
- package/dist/core/credentials.js +345 -0
- package/dist/core/template-loader.d.ts +15 -0
- package/dist/core/template-loader.d.ts.map +1 -0
- package/dist/core/template-loader.js +380 -0
- package/dist/core/template.d.ts +321 -0
- package/dist/core/template.d.ts.map +1 -0
- package/dist/core/template.js +189 -0
- package/dist/core/types.d.ts +572 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +52 -0
- package/dist/dev/dev-server.d.ts +16 -0
- package/dist/dev/dev-server.d.ts.map +1 -0
- package/dist/dev/dev-server.js +119 -0
- package/dist/generators/contracts/generator.d.ts +21 -0
- package/dist/generators/contracts/generator.d.ts.map +1 -0
- package/dist/generators/contracts/generator.js +252 -0
- package/dist/generators/tests/generator.d.ts +20 -0
- package/dist/generators/tests/generator.d.ts.map +1 -0
- package/dist/generators/tests/generator.js +375 -0
- package/dist/generators/types/generator.d.ts +19 -0
- package/dist/generators/types/generator.d.ts.map +1 -0
- package/dist/generators/types/generator.js +165 -0
- package/dist/generators/ui/component-generator.d.ts +20 -0
- package/dist/generators/ui/component-generator.d.ts.map +1 -0
- package/dist/generators/ui/component-generator.js +749 -0
- package/dist/generators/ui/dashboard-generator.d.ts +20 -0
- package/dist/generators/ui/dashboard-generator.d.ts.map +1 -0
- package/dist/generators/ui/dashboard-generator.js +349 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +74 -0
- package/dist/modules/analytics/AnalyticsModule.d.ts +349 -0
- package/dist/modules/analytics/AnalyticsModule.d.ts.map +1 -0
- package/dist/modules/analytics/AnalyticsModule.js +274 -0
- package/dist/modules/analytics/index.d.ts +3 -0
- package/dist/modules/analytics/index.d.ts.map +1 -0
- package/dist/modules/analytics/index.js +1 -0
- package/dist/modules/auth/AccessKeyModule.d.ts +189 -0
- package/dist/modules/auth/AccessKeyModule.d.ts.map +1 -0
- package/dist/modules/auth/AccessKeyModule.js +322 -0
- package/dist/modules/auth/AuthModule.d.ts +133 -0
- package/dist/modules/auth/AuthModule.d.ts.map +1 -0
- package/dist/modules/auth/AuthModule.js +214 -0
- package/dist/modules/auth/index.d.ts +8 -0
- package/dist/modules/auth/index.d.ts.map +1 -0
- package/dist/modules/auth/index.js +6 -0
- package/dist/modules/cache/CacheModule.d.ts +279 -0
- package/dist/modules/cache/CacheModule.d.ts.map +1 -0
- package/dist/modules/cache/CacheModule.js +493 -0
- package/dist/modules/cache/index.d.ts +3 -0
- package/dist/modules/cache/index.d.ts.map +1 -0
- package/dist/modules/cache/index.js +1 -0
- package/dist/modules/compute/ComputeModule.d.ts +226 -0
- package/dist/modules/compute/ComputeModule.d.ts.map +1 -0
- package/dist/modules/compute/ComputeModule.js +379 -0
- package/dist/modules/compute/index.d.ts +6 -0
- package/dist/modules/compute/index.d.ts.map +1 -0
- package/dist/modules/compute/index.js +4 -0
- package/dist/modules/contracts/ContractsModule.d.ts +164 -0
- package/dist/modules/contracts/ContractsModule.d.ts.map +1 -0
- package/dist/modules/contracts/ContractsModule.js +242 -0
- package/dist/modules/contracts/index.d.ts +6 -0
- package/dist/modules/contracts/index.d.ts.map +1 -0
- package/dist/modules/contracts/index.js +4 -0
- package/dist/modules/export/ExportModule.d.ts +346 -0
- package/dist/modules/export/ExportModule.d.ts.map +1 -0
- package/dist/modules/export/ExportModule.js +432 -0
- package/dist/modules/export/index.d.ts +3 -0
- package/dist/modules/export/index.d.ts.map +1 -0
- package/dist/modules/export/index.js +1 -0
- package/dist/modules/forecasting/ForecastingModule.d.ts +579 -0
- package/dist/modules/forecasting/ForecastingModule.d.ts.map +1 -0
- package/dist/modules/forecasting/ForecastingModule.js +310 -0
- package/dist/modules/forecasting/index.d.ts +3 -0
- package/dist/modules/forecasting/index.d.ts.map +1 -0
- package/dist/modules/forecasting/index.js +1 -0
- package/dist/modules/monitoring/MonitoringModule.d.ts +359 -0
- package/dist/modules/monitoring/MonitoringModule.d.ts.map +1 -0
- package/dist/modules/monitoring/MonitoringModule.js +483 -0
- package/dist/modules/monitoring/index.d.ts +3 -0
- package/dist/modules/monitoring/index.d.ts.map +1 -0
- package/dist/modules/monitoring/index.js +1 -0
- package/dist/modules/notifications/NotificationsModule.d.ts +336 -0
- package/dist/modules/notifications/NotificationsModule.d.ts.map +1 -0
- package/dist/modules/notifications/NotificationsModule.js +418 -0
- package/dist/modules/notifications/index.d.ts +3 -0
- package/dist/modules/notifications/index.d.ts.map +1 -0
- package/dist/modules/notifications/index.js +1 -0
- package/dist/modules/oracle/OracleModule.d.ts +110 -0
- package/dist/modules/oracle/OracleModule.d.ts.map +1 -0
- package/dist/modules/oracle/OracleModule.js +151 -0
- package/dist/modules/oracle/index.d.ts +6 -0
- package/dist/modules/oracle/index.d.ts.map +1 -0
- package/dist/modules/oracle/index.js +4 -0
- package/dist/modules/storage/S3Module.d.ts +377 -0
- package/dist/modules/storage/S3Module.d.ts.map +1 -0
- package/dist/modules/storage/S3Module.js +680 -0
- package/dist/modules/storage/StorageModule.d.ts +157 -0
- package/dist/modules/storage/StorageModule.d.ts.map +1 -0
- package/dist/modules/storage/StorageModule.js +302 -0
- package/dist/modules/storage/adapters/AdapterFactory.d.ts +100 -0
- package/dist/modules/storage/adapters/AdapterFactory.d.ts.map +1 -0
- package/dist/modules/storage/adapters/AdapterFactory.js +209 -0
- package/dist/modules/storage/adapters/FilecoinAdapter.d.ts +94 -0
- package/dist/modules/storage/adapters/FilecoinAdapter.d.ts.map +1 -0
- package/dist/modules/storage/adapters/FilecoinAdapter.js +263 -0
- package/dist/modules/storage/adapters/IStorageAdapter.d.ts +287 -0
- package/dist/modules/storage/adapters/IStorageAdapter.d.ts.map +1 -0
- package/dist/modules/storage/adapters/IStorageAdapter.js +81 -0
- package/dist/modules/storage/adapters/MultiTierAdapter.d.ts +187 -0
- package/dist/modules/storage/adapters/MultiTierAdapter.d.ts.map +1 -0
- package/dist/modules/storage/adapters/MultiTierAdapter.js +430 -0
- package/dist/modules/storage/adapters/index.d.ts +12 -0
- package/dist/modules/storage/adapters/index.d.ts.map +1 -0
- package/dist/modules/storage/adapters/index.js +12 -0
- package/dist/modules/storage/index.d.ts +16 -0
- package/dist/modules/storage/index.d.ts.map +1 -0
- package/dist/modules/storage/index.js +15 -0
- package/dist/modules/storage/tiering/AccessAnalyzer.d.ts +227 -0
- package/dist/modules/storage/tiering/AccessAnalyzer.d.ts.map +1 -0
- package/dist/modules/storage/tiering/AccessAnalyzer.js +367 -0
- package/dist/modules/storage/tiering/CostOptimizer.d.ts +248 -0
- package/dist/modules/storage/tiering/CostOptimizer.d.ts.map +1 -0
- package/dist/modules/storage/tiering/CostOptimizer.js +356 -0
- package/dist/modules/storage/tiering/MetadataStore.d.ts +287 -0
- package/dist/modules/storage/tiering/MetadataStore.d.ts.map +1 -0
- package/dist/modules/storage/tiering/MetadataStore.js +535 -0
- package/dist/modules/storage/tiering/TieringEngine.d.ts +237 -0
- package/dist/modules/storage/tiering/TieringEngine.d.ts.map +1 -0
- package/dist/modules/storage/tiering/TieringEngine.js +419 -0
- package/dist/modules/storage/tiering/example.d.ts +8 -0
- package/dist/modules/storage/tiering/example.d.ts.map +1 -0
- package/dist/modules/storage/tiering/example.js +250 -0
- package/dist/modules/storage/tiering/index.d.ts +17 -0
- package/dist/modules/storage/tiering/index.d.ts.map +1 -0
- package/dist/modules/storage/tiering/index.js +13 -0
- package/dist/modules/webhooks/WebhooksModule.d.ts +476 -0
- package/dist/modules/webhooks/WebhooksModule.d.ts.map +1 -0
- package/dist/modules/webhooks/WebhooksModule.js +359 -0
- package/dist/modules/webhooks/index.d.ts +3 -0
- package/dist/modules/webhooks/index.d.ts.map +1 -0
- package/dist/modules/webhooks/index.js +1 -0
- package/dist/modules/zk/ZKModule.d.ts +153 -0
- package/dist/modules/zk/ZKModule.d.ts.map +1 -0
- package/dist/modules/zk/ZKModule.js +262 -0
- package/dist/modules/zk/index.d.ts +7 -0
- package/dist/modules/zk/index.d.ts.map +1 -0
- package/dist/modules/zk/index.js +4 -0
- package/dist/thirdweb/BridgeClient.d.ts +228 -0
- package/dist/thirdweb/BridgeClient.d.ts.map +1 -0
- package/dist/thirdweb/BridgeClient.js +160 -0
- package/dist/thirdweb/EngineClient.d.ts +396 -0
- package/dist/thirdweb/EngineClient.d.ts.map +1 -0
- package/dist/thirdweb/EngineClient.js +386 -0
- package/dist/thirdweb/GatewayClient.d.ts +190 -0
- package/dist/thirdweb/GatewayClient.d.ts.map +1 -0
- package/dist/thirdweb/GatewayClient.js +257 -0
- package/dist/thirdweb/NebulaClient.d.ts +292 -0
- package/dist/thirdweb/NebulaClient.d.ts.map +1 -0
- package/dist/thirdweb/NebulaClient.js +180 -0
- package/dist/thirdweb/StorageClient.d.ts +445 -0
- package/dist/thirdweb/StorageClient.d.ts.map +1 -0
- package/dist/thirdweb/StorageClient.js +405 -0
- package/dist/thirdweb/ThirdwebWrapper.d.ts +236 -0
- package/dist/thirdweb/ThirdwebWrapper.d.ts.map +1 -0
- package/dist/thirdweb/ThirdwebWrapper.js +332 -0
- package/dist/thirdweb/index.d.ts +21 -0
- package/dist/thirdweb/index.d.ts.map +1 -0
- package/dist/thirdweb/index.js +28 -0
- package/dist/thirdweb/varity-chain.d.ts +48 -0
- package/dist/thirdweb/varity-chain.d.ts.map +1 -0
- package/dist/thirdweb/varity-chain.js +64 -0
- package/dist/thirdweb/x402Client.d.ts +319 -0
- package/dist/thirdweb/x402Client.d.ts.map +1 -0
- package/dist/thirdweb/x402Client.js +223 -0
- package/dist/tracking/gasTracker.d.ts +158 -0
- package/dist/tracking/gasTracker.d.ts.map +1 -0
- package/dist/tracking/gasTracker.js +227 -0
- package/dist/tracking/index.d.ts +10 -0
- package/dist/tracking/index.d.ts.map +1 -0
- package/dist/tracking/index.js +8 -0
- package/dist/tracking/types.d.ts +327 -0
- package/dist/tracking/types.d.ts.map +1 -0
- package/dist/tracking/types.js +8 -0
- package/dist/ui/components/ChartWidget.d.ts +36 -0
- package/dist/ui/components/ChartWidget.d.ts.map +1 -0
- package/dist/ui/components/ChartWidget.js +82 -0
- package/dist/ui/components/DashboardLayout.d.ts +41 -0
- package/dist/ui/components/DashboardLayout.d.ts.map +1 -0
- package/dist/ui/components/DashboardLayout.js +102 -0
- package/dist/ui/components/DataTable.d.ts +49 -0
- package/dist/ui/components/DataTable.d.ts.map +1 -0
- package/dist/ui/components/DataTable.js +96 -0
- package/dist/ui/components/EntityForm.d.ts +60 -0
- package/dist/ui/components/EntityForm.d.ts.map +1 -0
- package/dist/ui/components/EntityForm.js +182 -0
- package/dist/ui/components/KPICard.d.ts +29 -0
- package/dist/ui/components/KPICard.d.ts.map +1 -0
- package/dist/ui/components/KPICard.js +61 -0
- package/dist/ui/components/Modal.d.ts +34 -0
- package/dist/ui/components/Modal.d.ts.map +1 -0
- package/dist/ui/components/Modal.js +30 -0
- package/dist/ui/components/index.d.ts +18 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/index.js +11 -0
- package/dist/validation/template-validator.d.ts +25 -0
- package/dist/validation/template-validator.d.ts.map +1 -0
- package/dist/validation/template-validator.js +305 -0
- 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
|
+
};
|