Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 122 additions & 0 deletions contracts/subscription/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ use subtrackr_types::{
Subscription, SubscriptionStatus, TimeRange,
};

mod plan_templates;

/// Billing interval in seconds.
const MAX_PAUSE_DURATION: u64 = 2_592_000; // 30 days
const DEFAULT_COMMIT_REVEAL_THRESHOLD: i128 = i128::MAX;
Expand Down Expand Up @@ -646,6 +648,126 @@ impl SubTrackrSubscription {
);
}

// ── Plan Templates ──

pub fn create_plan_template(
env: Env,
proxy: Address,
storage: Address,
owner: Address,
name: String,
description: String,
base_price: i128,
token: Address,
interval: Interval,
tiers: Vec<plan_templates::PricingTier>,
features: Vec<String>,
) -> u64 {
proxy.require_auth();
owner.require_auth();
plan_templates::create_template(
&env, &storage, &owner, name, description, base_price, token, interval, tiers, features,
)
}

pub fn publish_plan_template_version(
env: Env,
proxy: Address,
storage: Address,
owner: Address,
template_id: u64,
name: String,
description: String,
base_price: i128,
tiers: Vec<plan_templates::PricingTier>,
features: Vec<String>,
) -> u64 {
proxy.require_auth();
owner.require_auth();
plan_templates::publish_version(
&env, &storage, &owner, template_id, name, description, base_price, tiers, features,
)
}

pub fn set_plan_template_shared(
env: Env,
proxy: Address,
storage: Address,
owner: Address,
template_id: u64,
shared: bool,
) {
proxy.require_auth();
owner.require_auth();
plan_templates::set_shared(&env, &storage, &owner, template_id, shared);
}

pub fn instantiate_plan_template(
env: Env,
proxy: Address,
storage: Address,
caller: Address,
template_id: u64,
overrides: plan_templates::TemplateOverrides,
) -> plan_templates::ResolvedPlan {
proxy.require_auth();
caller.require_auth();
plan_templates::instantiate(&env, &storage, &caller, template_id, overrides)
}

pub fn quote_plan_template(
env: Env,
proxy: Address,
storage: Address,
template_id: u64,
units: u64,
) -> i128 {
proxy.require_auth();
let template = plan_templates::get_template(&env, &storage, template_id)
.expect("Template not found");
plan_templates::quote_template(&template, units)
}

pub fn get_plan_template(
env: Env,
proxy: Address,
storage: Address,
template_id: u64,
) -> Option<plan_templates::PlanTemplate> {
proxy.require_auth();
plan_templates::get_template(&env, &storage, template_id)
}

pub fn get_plan_template_analytics(
env: Env,
proxy: Address,
storage: Address,
template_id: u64,
) -> plan_templates::TemplateAnalytics {
proxy.require_auth();
plan_templates::get_analytics(&env, &storage, template_id)
}

pub fn record_plan_template_view(
env: Env,
proxy: Address,
storage: Address,
template_id: u64,
) {
proxy.require_auth();
plan_templates::record_view(&env, &storage, template_id);
}

pub fn record_plan_template_subscription(
env: Env,
proxy: Address,
storage: Address,
template_id: u64,
) {
proxy.require_auth();
plan_templates::record_subscription(&env, &storage, template_id);
}

// ── Plan Management ──

pub fn create_plan(
Expand Down
15 changes: 15 additions & 0 deletions contracts/types/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,18 @@ pub struct UpgradeEvent {
pub type SubscriptionId = u64;
pub type MerchantId = Address;

/// Secondary keys used by the reusable plan-template library.
#[contracttype]
#[derive(Clone, Debug, PartialEq)]
pub enum TemplateKey {
Template(u64),
ByOwner(Address),
Shared,
Versions(u64),
Analytics(u64),
Count,
}

#[contracttype]
#[derive(Clone, Debug, PartialEq)]
pub enum FraudAction {
Expand Down Expand Up @@ -402,6 +414,9 @@ pub enum StorageKey {
/// Usage record for a subscription and metric (sub_id, metric -> UsageRecord)
SubscriptionUsage(u64, QuotaMetric),

// ── Plan templates (appended for storage compatibility) ──
PlanTemplate(TemplateKey),

// Added for MEV-resistant subscription charging
MevProtectionConfig,
ChargeCommitment(u64),
Expand Down