diff --git a/contracts/Cargo.toml b/contracts/Cargo.toml index 95748d3..075fdd3 100644 --- a/contracts/Cargo.toml +++ b/contracts/Cargo.toml @@ -1,20 +1,3 @@ -[package] -name = "subtrackr-subscription" -version = "0.2.0" -edition = "2021" -authors = ["SubTrackr Team"] -description = "SubTrackr subscription implementation contract (Soroban)" - -[lib] -crate-type = ["cdylib", "rlib"] - -[dependencies] -soroban-sdk = "21.0.0" -subtrackr-types = { path = "../types" } - -[dev-dependencies] -soroban-sdk = { version = "21.0.0", features = ["testutils"] } -arbitrary = { version = "1.3", features = ["derive"] } [workspace] resolver = "2" members = [ diff --git a/contracts/proxy/src/lib.rs b/contracts/proxy/src/lib.rs index d0cfa16..12b1276 100644 --- a/contracts/proxy/src/lib.rs +++ b/contracts/proxy/src/lib.rs @@ -1,4 +1,5 @@ #![no_std] +#![allow(clippy::too_many_arguments)] mod storage; @@ -13,11 +14,7 @@ fn current_proxy_address(env: &Env) -> Address { env.current_contract_address() } -fn invoke_impl>( - env: &Env, - func: &str, - args: Vec, -) -> T { +fn invoke_impl>(env: &Env, func: &str, args: Vec) -> T { let impl_addr = proxy_storage::implementation(env); env.invoke_contract(&impl_addr, &soroban_sdk::Symbol::new(env, func), args) } @@ -92,11 +89,7 @@ impl UpgradeableProxy { let target_version: u32 = env.invoke_contract( &implementation, &soroban_sdk::Symbol::new(&env, "get_version"), - soroban_sdk::vec![ - &env, - proxy_addr.into_val(&env), - storage.into_val(&env) - ], + soroban_sdk::vec![&env, proxy_addr.into_val(&env), storage.into_val(&env)], ); proxy_storage::set_version(&env, target_version); } @@ -133,13 +126,13 @@ impl UpgradeableProxy { // Basic interface validation: ensure new implementation supports expected interface. let proxy_addr = current_proxy_address(&env); let storage_addr = proxy_storage::storage_address(&env); - let args: Vec = soroban_sdk::vec![ - &env, - proxy_addr.into_val(&env), - storage_addr.into_val(&env) - ]; - let _target_version: u32 = - env.invoke_contract(&implementation, &soroban_sdk::Symbol::new(&env, "get_version"), args); + let args: Vec = + soroban_sdk::vec![&env, proxy_addr.into_val(&env), storage_addr.into_val(&env)]; + let _target_version: u32 = env.invoke_contract( + &implementation, + &soroban_sdk::Symbol::new(&env, "get_version"), + args, + ); proxy_storage::set_scheduled_upgrade( &env, @@ -194,7 +187,10 @@ impl UpgradeableProxy { ); let now = env.ledger().timestamp(); - assert!(now >= scheduled.execute_after, "Upgrade timelock not expired"); + assert!( + now >= scheduled.execute_after, + "Upgrade timelock not expired" + ); let proxy_addr = current_proxy_address(&env); let storage_addr = proxy_storage::storage_address(&env); @@ -471,12 +467,7 @@ impl UpgradeableProxy { ); } - pub fn pause_by_subscriber( - env: Env, - subscriber: Address, - subscription_id: u64, - duration: u64, - ) { + pub fn pause_by_subscriber(env: Env, subscriber: Address, subscription_id: u64, duration: u64) { let proxy_addr = current_proxy_address(&env); let storage_addr = proxy_storage::storage_address(&env); invoke_impl::<()>( diff --git a/contracts/proxy/src/storage.rs b/contracts/proxy/src/storage.rs index 0052dc1..2de5f2d 100644 --- a/contracts/proxy/src/storage.rs +++ b/contracts/proxy/src/storage.rs @@ -80,7 +80,9 @@ pub(crate) fn set_rollback_delay_secs(env: &Env, delay_secs: u64) { } pub(crate) fn scheduled_upgrade(env: &Env) -> Option { - env.storage().instance().get(&StorageKey::ProxyScheduledUpgrade) + env.storage() + .instance() + .get(&StorageKey::ProxyScheduledUpgrade) } pub(crate) fn set_scheduled_upgrade(env: &Env, upgrade: &ScheduledUpgrade) { @@ -90,7 +92,9 @@ pub(crate) fn set_scheduled_upgrade(env: &Env, upgrade: &ScheduledUpgrade) { } pub(crate) fn clear_scheduled_upgrade(env: &Env) { - env.storage().instance().remove(&StorageKey::ProxyScheduledUpgrade); + env.storage() + .instance() + .remove(&StorageKey::ProxyScheduledUpgrade); } pub(crate) fn previous_count(env: &Env) -> u32 { @@ -112,9 +116,10 @@ pub(crate) fn previous_top(env: &Env) -> Option
{ pub(crate) fn push_previous(env: &Env, implementation: &Address) { let count = previous_count(env); - env.storage() - .instance() - .set(&StorageKey::ProxyPreviousImplementation(count), implementation); + env.storage().instance().set( + &StorageKey::ProxyPreviousImplementation(count), + implementation, + ); env.storage() .instance() .set(&StorageKey::ProxyPreviousImplementationCount, &(count + 1)); diff --git a/contracts/proxy/test_snapshots/integration_cross_contract_call_charges_subscription.1.json b/contracts/proxy/test_snapshots/integration_cross_contract_call_charges_subscription.1.json index b48de0a..1884720 100644 --- a/contracts/proxy/test_snapshots/integration_cross_contract_call_charges_subscription.1.json +++ b/contracts/proxy/test_snapshots/integration_cross_contract_call_charges_subscription.1.json @@ -630,6 +630,264 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueDeferredBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueDeferredBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueMerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueMerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 1 + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueRecognisedBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueRecognisedBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueSchedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueSchedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 1705184020 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 1702592020 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -4250,6 +4508,544 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_get" + } + ], + "data": { + "vec": [ + { + "symbol": "RevenueRecognitionRule" + }, + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_get" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_set" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "RevenueSchedule" + }, + { + "u64": 1 + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 1705184020 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 1702592020 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_set" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_get" + } + ], + "data": { + "vec": [ + { + "symbol": "RevenueRecognisedBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_get" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_get" + } + ], + "data": { + "vec": [ + { + "symbol": "RevenueDeferredBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_get" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_set" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "RevenueRecognisedBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + { + "i128": { + "hi": 0, + "lo": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_set" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_set" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "RevenueDeferredBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_set" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_get" + } + ], + "data": { + "vec": [ + { + "symbol": "RevenueMerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_get" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_set" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "RevenueMerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + { + "vec": [ + { + "u64": 1 + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_set" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", diff --git a/contracts/proxy/test_snapshots/integration_multiple_contract_interactions_work.1.json b/contracts/proxy/test_snapshots/integration_multiple_contract_interactions_work.1.json index 1a44bd2..4661613 100644 --- a/contracts/proxy/test_snapshots/integration_multiple_contract_interactions_work.1.json +++ b/contracts/proxy/test_snapshots/integration_multiple_contract_interactions_work.1.json @@ -1106,10 +1106,10 @@ "key": { "vec": [ { - "symbol": "Subscription" + "symbol": "RevenueDeferredBalance" }, { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } ] }, @@ -1126,131 +1126,19 @@ "key": { "vec": [ { - "symbol": "Subscription" + "symbol": "RevenueDeferredBalance" }, { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } ] }, "durability": "persistent", "val": { - "map": [ - { - "key": { - "symbol": "charge_count" - }, - "val": { - "u32": 1 - } - }, - { - "key": { - "symbol": "id" - }, - "val": { - "u64": 1 - } - }, - { - "key": { - "symbol": "last_charged_at" - }, - "val": { - "u64": 1702592030 - } - }, - { - "key": { - "symbol": "next_charge_at" - }, - "val": { - "u64": 1705184030 - } - }, - { - "key": { - "symbol": "pause_duration" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "paused_at" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "plan_id" - }, - "val": { - "u64": 1 - } - }, - { - "key": { - "symbol": "refund_requested_amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 0 - } - } - }, - { - "key": { - "symbol": "started_at" - }, - "val": { - "u64": 1700000000 - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Active" - } - ] - } - }, - { - "key": { - "symbol": "subscriber" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - } - }, - { - "key": { - "symbol": "total_gas_spent" - }, - "val": { - "u64": 100000 - } - }, - { - "key": { - "symbol": "total_paid" - }, - "val": { - "i128": { - "hi": 0, - "lo": 500 - } - } - } - ] + "i128": { + "hi": 0, + "lo": 500 + } } } }, @@ -1266,10 +1154,10 @@ "key": { "vec": [ { - "symbol": "Subscription" + "symbol": "RevenueDeferredBalance" }, { - "u64": 2 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" } ] }, @@ -1286,131 +1174,19 @@ "key": { "vec": [ { - "symbol": "Subscription" + "symbol": "RevenueDeferredBalance" }, { - "u64": 2 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" } ] }, "durability": "persistent", "val": { - "map": [ - { - "key": { - "symbol": "charge_count" - }, - "val": { - "u32": 1 - } - }, - { - "key": { - "symbol": "id" - }, - "val": { - "u64": 2 - } - }, - { - "key": { - "symbol": "last_charged_at" - }, - "val": { - "u64": 1702592030 - } - }, - { - "key": { - "symbol": "next_charge_at" - }, - "val": { - "u64": 1705184030 - } - }, - { - "key": { - "symbol": "pause_duration" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "paused_at" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "plan_id" - }, - "val": { - "u64": 2 - } - }, - { - "key": { - "symbol": "refund_requested_amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 0 - } - } - }, - { - "key": { - "symbol": "started_at" - }, - "val": { - "u64": 1700000000 - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Active" - } - ] - } - }, - { - "key": { - "symbol": "subscriber" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - } - }, - { - "key": { - "symbol": "total_gas_spent" - }, - "val": { - "u64": 100000 - } - }, - { - "key": { - "symbol": "total_paid" - }, - "val": { - "i128": { - "hi": 0, - "lo": 900 - } - } - } - ] + "i128": { + "hi": 0, + "lo": 900 + } } } }, @@ -1426,13 +1202,10 @@ "key": { "vec": [ { - "symbol": "UserPlanIndex" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "symbol": "RevenueMerchantSubscriptions" }, { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } ] }, @@ -1449,19 +1222,20 @@ "key": { "vec": [ { - "symbol": "UserPlanIndex" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "symbol": "RevenueMerchantSubscriptions" }, { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } ] }, "durability": "persistent", "val": { - "u64": 1 + "vec": [ + { + "u64": 1 + } + ] } } }, @@ -1477,13 +1251,10 @@ "key": { "vec": [ { - "symbol": "UserPlanIndex" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "symbol": "RevenueMerchantSubscriptions" }, { - "u64": 2 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" } ] }, @@ -1500,19 +1271,20 @@ "key": { "vec": [ { - "symbol": "UserPlanIndex" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "symbol": "RevenueMerchantSubscriptions" }, { - "u64": 2 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" } ] }, "durability": "persistent", "val": { - "u64": 2 + "vec": [ + { + "u64": 2 + } + ] } } }, @@ -1528,10 +1300,10 @@ "key": { "vec": [ { - "symbol": "UserSubscriptions" + "symbol": "RevenueRecognisedBalance" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } ] }, @@ -1548,23 +1320,19 @@ "key": { "vec": [ { - "symbol": "UserSubscriptions" + "symbol": "RevenueRecognisedBalance" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } ] }, "durability": "persistent", "val": { - "vec": [ - { - "u64": 1 - }, - { - "u64": 2 - } - ] + "i128": { + "hi": 0, + "lo": 0 + } } } }, @@ -1577,7 +1345,16 @@ { "contract_data": { "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "key": "ledger_key_contract_instance", + "key": { + "vec": [ + { + "symbol": "RevenueRecognisedBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, "durability": "persistent" } }, @@ -1588,63 +1365,21 @@ "contract_data": { "ext": "v0", "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "key": "ledger_key_contract_instance", + "key": { + "vec": [ + { + "symbol": "RevenueRecognisedBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, "durability": "persistent", "val": { - "contract_instance": { - "executable": { - "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - }, - "storage": [ - { - "key": { - "vec": [ - { - "symbol": "Admin" - } - ] - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - }, - { - "key": { - "vec": [ - { - "symbol": "PlanCount" - } - ] - }, - "val": { - "u64": 2 - } - }, - { - "key": { - "vec": [ - { - "symbol": "ProxyImplementation" - } - ] - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" - } - }, - { - "key": { - "vec": [ - { - "symbol": "SubscriptionCount" - } - ] - }, - "val": { - "u64": 2 - } - } - ] + "i128": { + "hi": 0, + "lo": 0 } } } @@ -1657,8 +1392,17 @@ [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "key": "ledger_key_contract_instance", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueSchedule" + }, + { + "u64": 1 + } + ] + }, "durability": "persistent" } }, @@ -1668,16 +1412,88 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", - "key": "ledger_key_contract_instance", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueSchedule" + }, + { + "u64": 1 + } + ] + }, "durability": "persistent", "val": { - "contract_instance": { - "executable": { - "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 1705184030 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 1702592030 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + ] + } }, - "storage": null - } + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] } } }, @@ -1689,8 +1505,17 @@ [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", - "key": "ledger_key_contract_instance", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueSchedule" + }, + { + "u64": 2 + } + ] + }, "durability": "persistent" } }, @@ -1700,101 +1525,88 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", - "key": "ledger_key_contract_instance", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueSchedule" + }, + { + "u64": 2 + } + ] + }, "durability": "persistent", "val": { - "contract_instance": { - "executable": { - "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - }, - "storage": [ - { - "key": { - "vec": [ - { - "symbol": "ProxyImplementation" - } - ] - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" - } - }, - { - "key": { - "vec": [ - { - "symbol": "ProxyPreviousImplementationCount" - } - ] - }, - "val": { - "u32": 0 - } + "map": [ + { + "key": { + "symbol": "entries" }, - { - "key": { - "vec": [ - { - "symbol": "ProxyRollbackDelaySecs" - } - ] - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "vec": [ - { - "symbol": "ProxyStorage" - } - ] - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" - } - }, - { - "key": { - "vec": [ - { - "symbol": "ProxyUpgradeDelaySecs" - } - ] - }, - "val": { - "u64": 0 - } + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 1705184030 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 1702592030 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 900 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" }, - { - "key": { - "vec": [ - { - "symbol": "ProxyUpgradeHistoryCount" - } - ] - }, - "val": { - "u32": 0 - } + "val": { + "u64": 2 + } + }, + { + "key": { + "symbol": "total_amount" }, - { - "key": { - "vec": [ - { - "symbol": "ProxyVersion" - } - ] - }, - "val": { - "u32": 2 + "val": { + "i128": { + "hi": 0, + "lo": 900 } } - ] - } + } + ] } } }, @@ -1806,80 +1618,14 @@ [ { "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", - "key": { - "ledger_key_nonce": { - "nonce": 6277191135259896685 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", - "key": { - "ledger_key_nonce": { - "nonce": 6277191135259896685 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", - "key": { - "ledger_key_nonce": { - "nonce": 8370022561469687789 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", - "key": { - "ledger_key_nonce": { - "nonce": 8370022561469687789 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], - [ - { - "contract_data": { - "contract": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Subscription" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "u64": 1 } ] }, @@ -1892,14 +1638,14 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Subscription" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "u64": 1 } ] }, @@ -1908,287 +1654,116 @@ "map": [ { "key": { - "symbol": "amount" + "symbol": "charge_count" }, "val": { - "i128": { - "hi": 0, - "lo": 69100 - } + "u32": 1 } }, { "key": { - "symbol": "authorized" + "symbol": "id" }, "val": { - "bool": true + "u64": 1 } }, { "key": { - "symbol": "clawback" + "symbol": "last_charged_at" }, "val": { - "bool": false + "u64": 1702592030 } - } - ] - } - } - }, - "ext": "v0" - }, - 518400 - ] - ], - [ - { - "contract_data": { - "contract": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45", - "key": { - "vec": [ - { - "symbol": "Balance" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" - } - ] - }, - "durability": "persistent" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45", - "key": { - "vec": [ + }, { - "symbol": "Balance" + "key": { + "symbol": "next_charge_at" + }, + "val": { + "u64": 1705184030 + } }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" - } - ] - }, - "durability": "persistent", - "val": { - "map": [ + "key": { + "symbol": "pause_duration" + }, + "val": { + "u64": 0 + } + }, { "key": { - "symbol": "amount" + "symbol": "paused_at" }, "val": { - "i128": { - "hi": 0, - "lo": 900 - } + "u64": 0 } }, { "key": { - "symbol": "authorized" + "symbol": "plan_id" }, "val": { - "bool": true + "u64": 1 } }, { "key": { - "symbol": "clawback" + "symbol": "refund_requested_amount" }, "val": { - "bool": false + "i128": { + "hi": 0, + "lo": 0 + } } - } - ] - } - } - }, - "ext": "v0" - }, - 518400 - ] - ], - [ - { - "contract_data": { - "contract": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45", - "key": "ledger_key_contract_instance", - "durability": "persistent" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45", - "key": "ledger_key_contract_instance", - "durability": "persistent", - "val": { - "contract_instance": { - "executable": "stellar_asset", - "storage": [ - { - "key": { - "symbol": "METADATA" - }, - "val": { - "map": [ - { - "key": { - "symbol": "decimal" - }, - "val": { - "u32": 7 - } - }, - { - "key": { - "symbol": "name" - }, - "val": { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWM2U" - } - }, - { - "key": { - "symbol": "symbol" - }, - "val": { - "string": "aaa" - } - } - ] - } - }, - { - "key": { - "vec": [ - { - "symbol": "Admin" - } - ] - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" - } + }, + { + "key": { + "symbol": "started_at" }, - { - "key": { - "vec": [ - { - "symbol": "AssetInfo" - } - ] - }, - "val": { - "vec": [ - { - "symbol": "AlphaNum4" - }, - { - "map": [ - { - "key": { - "symbol": "asset_code" - }, - "val": { - "string": "aaa\\0" - } - }, - { - "key": { - "symbol": "issuer" - }, - "val": { - "bytes": "000000000000000000000000000000000000000000000000000000000000000b" - } - } - ] - } - ] - } + "val": { + "u64": 1700000000 } - ] - } - } - } - }, - "ext": "v0" - }, - 120960 - ] - ], - [ - { - "contract_data": { - "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", - "key": { - "vec": [ - { - "symbol": "Balance" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - }, - "durability": "persistent" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", - "key": { - "vec": [ - { - "symbol": "Balance" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - ] - }, - "durability": "persistent", - "val": { - "map": [ + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + }, { "key": { - "symbol": "amount" + "symbol": "subscriber" }, "val": { - "i128": { - "hi": 0, - "lo": 500 - } + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } }, { "key": { - "symbol": "authorized" + "symbol": "total_gas_spent" }, "val": { - "bool": true + "u64": 100000 } }, { "key": { - "symbol": "clawback" + "symbol": "total_paid" }, "val": { - "bool": false + "i128": { + "hi": 0, + "lo": 500 + } } } ] @@ -2197,20 +1772,20 @@ }, "ext": "v0" }, - 518400 + 4095 ] ], [ { "contract_data": { - "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Subscription" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "u64": 2 } ] }, @@ -2223,14 +1798,14 @@ "data": { "contract_data": { "ext": "v0", - "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "vec": [ { - "symbol": "Balance" + "symbol": "Subscription" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "u64": 2 } ] }, @@ -2239,176 +1814,1499 @@ "map": [ { "key": { - "symbol": "amount" + "symbol": "charge_count" }, "val": { - "i128": { - "hi": 0, - "lo": 49500 - } + "u32": 1 } }, { "key": { - "symbol": "authorized" + "symbol": "id" }, "val": { - "bool": true + "u64": 2 } }, { "key": { - "symbol": "clawback" + "symbol": "last_charged_at" }, "val": { - "bool": false + "u64": 1702592030 } - } - ] - } - } - }, - "ext": "v0" - }, - 518400 - ] - ], - [ - { - "contract_data": { - "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", - "key": "ledger_key_contract_instance", - "durability": "persistent" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", - "key": "ledger_key_contract_instance", - "durability": "persistent", - "val": { - "contract_instance": { - "executable": "stellar_asset", - "storage": [ - { - "key": { - "symbol": "METADATA" - }, - "val": { - "map": [ - { - "key": { - "symbol": "decimal" - }, - "val": { - "u32": 7 - } - }, - { - "key": { - "symbol": "name" - }, - "val": { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE" - } - }, - { - "key": { - "symbol": "symbol" - }, - "val": { - "string": "aaa" - } - } - ] - } + }, + { + "key": { + "symbol": "next_charge_at" }, - { - "key": { - "vec": [ - { - "symbol": "Admin" - } - ] - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "val": { + "u64": 1705184030 + } + }, + { + "key": { + "symbol": "pause_duration" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "paused_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "plan_id" + }, + "val": { + "u64": 2 + } + }, + { + "key": { + "symbol": "refund_requested_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 } + } + }, + { + "key": { + "symbol": "started_at" }, - { - "key": { - "vec": [ - { - "symbol": "AssetInfo" - } - ] - }, - "val": { - "vec": [ - { - "symbol": "AlphaNum4" - }, - { - "map": [ - { - "key": { - "symbol": "asset_code" - }, - "val": { - "string": "aaa\\0" - } - }, - { - "key": { - "symbol": "issuer" - }, - "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000008" - } - } - ] - } - ] + "val": { + "u64": 1700000000 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + }, + { + "key": { + "symbol": "subscriber" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 100000 + } + }, + { + "key": { + "symbol": "total_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 900 } } - ] + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "UserPlanIndex" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "UserPlanIndex" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "u64": 1 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "UserPlanIndex" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "UserPlanIndex" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "u64": 2 + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "UserSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "UserSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 1 + }, + { + "u64": 2 + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "PlanCount" + } + ] + }, + "val": { + "u64": 2 + } + }, + { + "key": { + "vec": [ + { + "symbol": "ProxyImplementation" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "SubscriptionCount" + } + ] + }, + "val": { + "u64": 2 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "ProxyImplementation" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ProxyPreviousImplementationCount" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "ProxyRollbackDelaySecs" + } + ] + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "ProxyStorage" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ProxyUpgradeDelaySecs" + } + ] + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "ProxyUpgradeHistoryCount" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "ProxyVersion" + } + ] + }, + "val": { + "u32": 2 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 69100 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 900 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWM2U" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "000000000000000000000000000000000000000000000000000000000000000b" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_data": { + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 49500 + } + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + 518400 + ] + ], + [ + { + "contract_data": { + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000008" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000007" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "u64": 0 + }, + { + "u64": 0 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "initialize" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "get_version" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_version" + } + ], + "data": { + "u32": 2 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44" + }, + { + "symbol": "init_asset" + } + ], + "data": { + "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000008" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "init_asset" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44" + }, + { + "symbol": "set_admin" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "set_admin" + }, + { + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44" + }, + { + "symbol": "mint" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 50000 } } - } - }, - "ext": "v0" - }, - 120960 - ] - ], - [ - { - "contract_code": { - "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + ] + } } - }, - [ - { - "last_modified_ledger_seq": 0, + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE" + } + ], "data": { - "contract_code": { - "ext": "v0", - "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "code": "" + "i128": { + "hi": 0, + "lo": 50000 } - }, - "ext": "v0" - }, - 4095 - ] - ] - ] - }, - "events": [ + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "mint" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -2424,25 +3322,117 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" }, { - "symbol": "initialize" + "symbol": "create_plan" } ], "data": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "string": "Integration Plan" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23" + }, + { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_plan" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" }, { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" }, { - "u64": 0 + "string": "Integration Plan" }, { - "u64": 0 + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23" + }, + { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "instance_get" + } + ], + "data": { + "vec": [ + { + "symbol": "Admin" } ] } @@ -2454,7 +3444,30 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "instance_get" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", "type_": "diagnostic", "body": { "v0": { @@ -2466,16 +3479,16 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "initialize" + "symbol": "instance_get" } ], "data": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + "symbol": "RateLimit" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + "string": "create_plan" } ] } @@ -2496,7 +3509,7 @@ "symbol": "fn_return" }, { - "symbol": "initialize" + "symbol": "instance_get" } ], "data": "void" @@ -2508,7 +3521,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", "type_": "diagnostic", "body": { "v0": { @@ -2517,19 +3530,16 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "get_version" + "symbol": "instance_get" } ], "data": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + "symbol": "PlanCount" } ] } @@ -2541,7 +3551,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", "type_": "diagnostic", "body": { "v0": { @@ -2550,11 +3560,11 @@ "symbol": "fn_return" }, { - "symbol": "get_version" + "symbol": "instance_get" } ], "data": { - "u32": 2 + "u64": 0 } } } @@ -2564,19 +3574,118 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "fn_return" + "symbol": "fn_call" }, { - "symbol": "initialize" + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_set" } ], - "data": "void" + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "Plan" + }, + { + "u64": 1 + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1700000000 + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Integration Plan" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "subscriber_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23" + } + } + ] + } + ] + } } } }, @@ -2585,24 +3694,19 @@ { "event": { "ext": "v0", - "contract_id": null, + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "fn_call" - }, - { - "bytes": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44" + "symbol": "fn_return" }, { - "symbol": "init_asset" + "symbol": "persistent_set" } ], - "data": { - "bytes": "0000000161616100000000000000000000000000000000000000000000000000000000000000000000000008" - } + "data": "void" } } }, @@ -2611,19 +3715,35 @@ { "event": { "ext": "v0", - "contract_id": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "fn_return" + "symbol": "fn_call" }, { - "symbol": "init_asset" + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "instance_set" } ], - "data": "void" + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "PlanCount" + } + ] + }, + { + "u64": 1 + } + ] + } } } }, @@ -2632,24 +3752,19 @@ { "event": { "ext": "v0", - "contract_id": null, + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "fn_call" - }, - { - "bytes": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44" + "symbol": "fn_return" }, { - "symbol": "set_admin" + "symbol": "instance_set" } ], - "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } + "data": "void" } } }, @@ -2658,23 +3773,30 @@ { "event": { "ext": "v0", - "contract_id": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44", - "type_": "contract", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "set_admin" + "symbol": "fn_call" }, { - "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE" + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE" + "symbol": "persistent_get" } ], "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + "vec": [ + { + "symbol": "MerchantPlans" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] } } } @@ -2684,7 +3806,7 @@ { "event": { "ext": "v0", - "contract_id": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", "type_": "diagnostic", "body": { "v0": { @@ -2693,7 +3815,7 @@ "symbol": "fn_return" }, { - "symbol": "set_admin" + "symbol": "persistent_get" } ], "data": "void" @@ -2705,7 +3827,7 @@ { "event": { "ext": "v0", - "contract_id": null, + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", "type_": "diagnostic", "body": { "v0": { @@ -2714,22 +3836,30 @@ "symbol": "fn_call" }, { - "bytes": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44" + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "mint" + "symbol": "persistent_set" } ], "data": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "vec": [ + { + "symbol": "MerchantPlans" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] }, { - "i128": { - "hi": 0, - "lo": 50000 - } + "vec": [ + { + "u64": 1 + } + ] } ] } @@ -2741,29 +3871,41 @@ { "event": { "ext": "v0", - "contract_id": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44", - "type_": "contract", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_set" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "mint" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "symbol": "fn_return" }, { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE" + "symbol": "create_plan" } ], "data": { - "i128": { - "hi": 0, - "lo": 50000 - } + "u64": 1 } } } @@ -2773,7 +3915,7 @@ { "event": { "ext": "v0", - "contract_id": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", "type_": "diagnostic", "body": { "v0": { @@ -2782,10 +3924,12 @@ "symbol": "fn_return" }, { - "symbol": "mint" + "symbol": "create_plan" } ], - "data": "void" + "data": { + "u64": 1 + } } } }, @@ -2806,32 +3950,16 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" }, { - "symbol": "create_plan" + "symbol": "subscribe" } ], "data": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "string": "Integration Plan" - }, - { - "i128": { - "hi": 0, - "lo": 500 - } - }, - { - "address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "vec": [ - { - "symbol": "Monthly" - } - ] + "u64": 1 } ] } @@ -2855,7 +3983,7 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "create_plan" + "symbol": "subscribe" } ], "data": { @@ -2867,26 +3995,10 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "string": "Integration Plan" - }, - { - "i128": { - "hi": 0, - "lo": 500 - } - }, - { - "address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "vec": [ - { - "symbol": "Monthly" - } - ] + "u64": 1 } ] } @@ -2972,7 +4084,7 @@ "symbol": "RateLimit" }, { - "string": "create_plan" + "string": "subscribe" } ] } @@ -3017,13 +4129,16 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "instance_get" + "symbol": "persistent_get" } ], "data": { "vec": [ { - "symbol": "PlanCount" + "symbol": "Plan" + }, + { + "u64": 1 } ] } @@ -3044,129 +4159,89 @@ "symbol": "fn_return" }, { - "symbol": "instance_get" - } - ], - "data": { - "u64": 0 - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "symbol": "persistent_set" + "symbol": "persistent_get" } ], "data": { - "vec": [ + "map": [ { - "vec": [ - { - "symbol": "Plan" - }, - { - "u64": 1 - } - ] + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } }, { - "map": [ - { - "key": { - "symbol": "active" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "created_at" - }, - "val": { - "u64": 1700000000 - } - }, - { - "key": { - "symbol": "id" - }, - "val": { - "u64": 1 - } - }, - { - "key": { - "symbol": "interval" - }, - "val": { - "vec": [ - { - "symbol": "Monthly" - } - ] - } - }, - { - "key": { - "symbol": "merchant" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - }, - { - "key": { - "symbol": "name" - }, - "val": { - "string": "Integration Plan" - } - }, - { - "key": { - "symbol": "price" - }, - "val": { - "i128": { - "hi": 0, - "lo": 500 - } - } - }, - { - "key": { - "symbol": "subscriber_count" - }, - "val": { - "u32": 0 - } - }, - { - "key": { - "symbol": "token" - }, - "val": { - "address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23" + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1700000000 + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "vec": [ + { + "symbol": "Monthly" } + ] + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Integration Plan" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 } - ] + } + }, + { + "key": { + "symbol": "subscriber_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23" + } } ] } @@ -3175,27 +4250,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "persistent_set" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -3211,17 +4265,16 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "instance_set" + "symbol": "persistent_get" } ], "data": { "vec": [ { - "vec": [ - { - "symbol": "PlanCount" - } - ] + "symbol": "UserPlanIndex" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { "u64": 1 @@ -3245,7 +4298,7 @@ "symbol": "fn_return" }, { - "symbol": "instance_set" + "symbol": "persistent_get" } ], "data": "void" @@ -3269,16 +4322,13 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "persistent_get" + "symbol": "instance_get" } ], "data": { "vec": [ { - "symbol": "MerchantPlans" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "symbol": "SubscriptionCount" } ] } @@ -3299,10 +4349,12 @@ "symbol": "fn_return" }, { - "symbol": "persistent_get" + "symbol": "instance_get" } ], - "data": "void" + "data": { + "u64": 0 + } } } }, @@ -3331,17 +4383,128 @@ { "vec": [ { - "symbol": "MerchantPlans" + "symbol": "Subscription" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "u64": 1 } ] }, { - "vec": [ + "map": [ { - "u64": 1 + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "last_charged_at" + }, + "val": { + "u64": 1700000000 + } + }, + { + "key": { + "symbol": "next_charge_at" + }, + "val": { + "u64": 1702592000 + } + }, + { + "key": { + "symbol": "pause_duration" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "paused_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "plan_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "refund_requested_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "started_at" + }, + "val": { + "u64": 1700000000 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + }, + { + "key": { + "symbol": "subscriber" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "total_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } } ] } @@ -3382,37 +4545,28 @@ "v0": { "topics": [ { - "symbol": "fn_return" + "symbol": "fn_call" }, { - "symbol": "create_plan" - } - ], - "data": { - "u64": 1 - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "create_plan" + "symbol": "instance_set" } ], "data": { - "u64": 1 + "vec": [ + { + "vec": [ + { + "symbol": "SubscriptionCount" + } + ] + }, + { + "u64": 1 + } + ] } } } @@ -3422,31 +4576,19 @@ { "event": { "ext": "v0", - "contract_id": null, + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "fn_call" - }, - { - "bytes": "0000000000000000000000000000000000000000000000000000000000000007" + "symbol": "fn_return" }, { - "symbol": "subscribe" + "symbol": "instance_set" } ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "u64": 1 - } - ] - } + "data": "void" } } }, @@ -3455,7 +4597,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", "type_": "diagnostic", "body": { "v0": { @@ -3464,25 +4606,19 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "subscribe" + "symbol": "persistent_get" } ], "data": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "symbol": "UserSubscriptions" }, { - "u64": 1 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" } ] } @@ -3491,6 +4627,27 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_get" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -3506,13 +4663,27 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "instance_get" + "symbol": "persistent_set" } ], "data": { "vec": [ { - "symbol": "Admin" + "vec": [ + { + "symbol": "UserSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + { + "vec": [ + { + "u64": 1 + } + ] } ] } @@ -3533,12 +4704,10 @@ "symbol": "fn_return" }, { - "symbol": "instance_get" + "symbol": "persistent_set" } ], - "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } + "data": "void" } } }, @@ -3559,16 +4728,26 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "instance_get" + "symbol": "persistent_set" } ], "data": { "vec": [ { - "symbol": "RateLimit" + "vec": [ + { + "symbol": "UserPlanIndex" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": 1 + } + ] }, { - "string": "subscribe" + "u64": 1 } ] } @@ -3589,7 +4768,7 @@ "symbol": "fn_return" }, { - "symbol": "instance_get" + "symbol": "persistent_set" } ], "data": "void" @@ -3613,16 +4792,103 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "persistent_get" + "symbol": "persistent_set" } ], "data": { "vec": [ { - "symbol": "Plan" + "vec": [ + { + "symbol": "Plan" + }, + { + "u64": 1 + } + ] }, { - "u64": 1 + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1700000000 + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Integration Plan" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "subscriber_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23" + } + } + ] } ] } @@ -3643,91 +4909,32 @@ "symbol": "fn_return" }, { - "symbol": "persistent_get" + "symbol": "persistent_set" } ], - "data": { - "map": [ - { - "key": { - "symbol": "active" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "created_at" - }, - "val": { - "u64": 1700000000 - } - }, - { - "key": { - "symbol": "id" - }, - "val": { - "u64": 1 - } - }, - { - "key": { - "symbol": "interval" - }, - "val": { - "vec": [ - { - "symbol": "Monthly" - } - ] - } - }, - { - "key": { - "symbol": "merchant" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - } - }, - { - "key": { - "symbol": "name" - }, - "val": { - "string": "Integration Plan" - } - }, - { - "key": { - "symbol": "price" - }, - "val": { - "i128": { - "hi": 0, - "lo": 500 - } - } - }, - { - "key": { - "symbol": "subscriber_count" - }, - "val": { - "u32": 0 - } - }, - { - "key": { - "symbol": "token" - }, - "val": { - "address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23" - } - } - ] + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "u64": 1 } } } @@ -3737,7 +4944,30 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, "type_": "diagnostic", "body": { "v0": { @@ -3746,24 +4976,14 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + "bytes": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6" }, { - "symbol": "persistent_get" + "symbol": "init_asset" } ], "data": { - "vec": [ - { - "symbol": "UserPlanIndex" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "u64": 1 - } - ] + "bytes": "000000016161610000000000000000000000000000000000000000000000000000000000000000000000000b" } } } @@ -3773,7 +4993,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "contract_id": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6", "type_": "diagnostic", "body": { "v0": { @@ -3782,7 +5002,7 @@ "symbol": "fn_return" }, { - "symbol": "persistent_get" + "symbol": "init_asset" } ], "data": "void" @@ -3794,7 +5014,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": null, "type_": "diagnostic", "body": { "v0": { @@ -3803,18 +5023,14 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + "bytes": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6" }, { - "symbol": "instance_get" + "symbol": "set_admin" } ], "data": { - "vec": [ - { - "symbol": "SubscriptionCount" - } - ] + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" } } } @@ -3824,20 +5040,23 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", - "type_": "diagnostic", + "contract_id": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6", + "type_": "contract", "body": { "v0": { "topics": [ { - "symbol": "fn_return" + "symbol": "set_admin" }, { - "symbol": "instance_get" + "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWM2U" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWM2U" } ], "data": { - "u64": 0 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" } } } @@ -3847,7 +5066,28 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_admin" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, "type_": "diagnostic", "body": { "v0": { @@ -3856,141 +5096,22 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + "bytes": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6" }, { - "symbol": "persistent_set" + "symbol": "mint" } ], "data": { "vec": [ { - "vec": [ - { - "symbol": "Subscription" - }, - { - "u64": 1 - } - ] + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "map": [ - { - "key": { - "symbol": "charge_count" - }, - "val": { - "u32": 0 - } - }, - { - "key": { - "symbol": "id" - }, - "val": { - "u64": 1 - } - }, - { - "key": { - "symbol": "last_charged_at" - }, - "val": { - "u64": 1700000000 - } - }, - { - "key": { - "symbol": "next_charge_at" - }, - "val": { - "u64": 1702592000 - } - }, - { - "key": { - "symbol": "pause_duration" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "paused_at" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "plan_id" - }, - "val": { - "u64": 1 - } - }, - { - "key": { - "symbol": "refund_requested_amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 0 - } - } - }, - { - "key": { - "symbol": "started_at" - }, - "val": { - "u64": 1700000000 - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Active" - } - ] - } - }, - { - "key": { - "symbol": "subscriber" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - } - }, - { - "key": { - "symbol": "total_gas_spent" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "total_paid" - }, - "val": { - "i128": { - "hi": 0, - "lo": 0 - } - } - } - ] + "i128": { + "hi": 0, + "lo": 70000 + } } ] } @@ -4002,7 +5123,39 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "contract_id": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "mint" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWM2U" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 70000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6", "type_": "diagnostic", "body": { "v0": { @@ -4011,7 +5164,7 @@ "symbol": "fn_return" }, { - "symbol": "persistent_set" + "symbol": "mint" } ], "data": "void" @@ -4023,7 +5176,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": null, "type_": "diagnostic", "body": { "v0": { @@ -4032,23 +5185,35 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + "bytes": "0000000000000000000000000000000000000000000000000000000000000007" }, { - "symbol": "instance_set" + "symbol": "create_plan" } ], "data": { "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "string": "Premium Plan" + }, + { + "i128": { + "hi": 0, + "lo": 900 + } + }, + { + "address": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45" + }, { "vec": [ { - "symbol": "SubscriptionCount" + "symbol": "Monthly" } ] - }, - { - "u64": 1 } ] } @@ -4060,19 +5225,53 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "fn_return" + "symbol": "fn_call" }, { - "symbol": "instance_set" + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "create_plan" } ], - "data": "void" + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "string": "Premium Plan" + }, + { + "i128": { + "hi": 0, + "lo": 900 + } + }, + { + "address": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45" + }, + { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + ] + } } } }, @@ -4093,16 +5292,13 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "persistent_get" + "symbol": "instance_get" } ], "data": { "vec": [ { - "symbol": "UserSubscriptions" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "symbol": "Admin" } ] } @@ -4123,10 +5319,12 @@ "symbol": "fn_return" }, { - "symbol": "persistent_get" + "symbol": "instance_get" } ], - "data": "void" + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } } } }, @@ -4147,27 +5345,16 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "persistent_set" + "symbol": "instance_get" } ], "data": { "vec": [ { - "vec": [ - { - "symbol": "UserSubscriptions" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - } - ] + "symbol": "RateLimit" }, { - "vec": [ - { - "u64": 1 - } - ] + "string": "create_plan" } ] } @@ -4188,7 +5375,7 @@ "symbol": "fn_return" }, { - "symbol": "persistent_set" + "symbol": "instance_get" } ], "data": "void" @@ -4212,26 +5399,13 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "persistent_set" + "symbol": "instance_get" } ], "data": { "vec": [ { - "vec": [ - { - "symbol": "UserPlanIndex" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "u64": 1 - } - ] - }, - { - "u64": 1 + "symbol": "PlanCount" } ] } @@ -4252,10 +5426,12 @@ "symbol": "fn_return" }, { - "symbol": "persistent_set" + "symbol": "instance_get" } ], - "data": "void" + "data": { + "u64": 1 + } } } }, @@ -4287,7 +5463,7 @@ "symbol": "Plan" }, { - "u64": 1 + "u64": 2 } ] }, @@ -4314,7 +5490,7 @@ "symbol": "id" }, "val": { - "u64": 1 + "u64": 2 } }, { @@ -4334,7 +5510,7 @@ "symbol": "merchant" }, "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" } }, { @@ -4342,7 +5518,7 @@ "symbol": "name" }, "val": { - "string": "Integration Plan" + "string": "Premium Plan" } }, { @@ -4352,7 +5528,7 @@ "val": { "i128": { "hi": 0, - "lo": 500 + "lo": 900 } } }, @@ -4361,7 +5537,7 @@ "symbol": "subscriber_count" }, "val": { - "u32": 1 + "u32": 0 } }, { @@ -4369,7 +5545,7 @@ "symbol": "token" }, "val": { - "address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23" + "address": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45" } } ] @@ -4411,14 +5587,28 @@ "v0": { "topics": [ { - "symbol": "fn_return" + "symbol": "fn_call" }, { - "symbol": "subscribe" + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "instance_set" } ], "data": { - "u64": 1 + "vec": [ + { + "vec": [ + { + "symbol": "PlanCount" + } + ] + }, + { + "u64": 2 + } + ] } } } @@ -4428,7 +5618,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", "type_": "diagnostic", "body": { "v0": { @@ -4437,11 +5627,42 @@ "symbol": "fn_return" }, { - "symbol": "subscribe" + "symbol": "instance_set" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_get" } ], "data": { - "u64": 1 + "vec": [ + { + "symbol": "MerchantPlans" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] } } } @@ -4451,7 +5672,28 @@ { "event": { "ext": "v0", - "contract_id": null, + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_get" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", "type_": "diagnostic", "body": { "v0": { @@ -4460,14 +5702,32 @@ "symbol": "fn_call" }, { - "bytes": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6" + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "init_asset" + "symbol": "persistent_set" } ], "data": { - "bytes": "000000016161610000000000000000000000000000000000000000000000000000000000000000000000000b" + "vec": [ + { + "vec": [ + { + "symbol": "MerchantPlans" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + { + "vec": [ + { + "u64": 2 + } + ] + } + ] } } } @@ -4477,7 +5737,7 @@ { "event": { "ext": "v0", - "contract_id": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", "type_": "diagnostic", "body": { "v0": { @@ -4486,7 +5746,7 @@ "symbol": "fn_return" }, { - "symbol": "init_asset" + "symbol": "persistent_set" } ], "data": "void" @@ -4498,23 +5758,20 @@ { "event": { "ext": "v0", - "contract_id": null, + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "fn_call" - }, - { - "bytes": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6" + "symbol": "fn_return" }, { - "symbol": "set_admin" + "symbol": "create_plan" } ], "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + "u64": 2 } } } @@ -4524,23 +5781,20 @@ { "event": { "ext": "v0", - "contract_id": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6", - "type_": "contract", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", + "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "set_admin" - }, - { - "address": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWM2U" + "symbol": "fn_return" }, { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWM2U" + "symbol": "create_plan" } ], "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + "u64": 2 } } } @@ -4550,19 +5804,31 @@ { "event": { "ext": "v0", - "contract_id": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6", + "contract_id": null, "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "fn_return" + "symbol": "fn_call" }, { - "symbol": "set_admin" + "bytes": "0000000000000000000000000000000000000000000000000000000000000007" + }, + { + "symbol": "subscribe" } ], - "data": "void" + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": 2 + } + ] + } } } }, @@ -4571,7 +5837,7 @@ { "event": { "ext": "v0", - "contract_id": null, + "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", "type_": "diagnostic", "body": { "v0": { @@ -4580,22 +5846,25 @@ "symbol": "fn_call" }, { - "bytes": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6" + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" }, { - "symbol": "mint" + "symbol": "subscribe" } ], "data": { "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "i128": { - "hi": 0, - "lo": 70000 - } + "u64": 2 } ] } @@ -4607,29 +5876,27 @@ { "event": { "ext": "v0", - "contract_id": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6", - "type_": "contract", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "mint" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + "symbol": "fn_call" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWM2U" + "symbol": "instance_get" } ], "data": { - "i128": { - "hi": 0, - "lo": 70000 - } + "vec": [ + { + "symbol": "Admin" + } + ] } } } @@ -4639,7 +5906,7 @@ { "event": { "ext": "v0", - "contract_id": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", "type_": "diagnostic", "body": { "v0": { @@ -4648,10 +5915,12 @@ "symbol": "fn_return" }, { - "symbol": "mint" + "symbol": "instance_get" } ], - "data": "void" + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } } } }, @@ -4660,7 +5929,7 @@ { "event": { "ext": "v0", - "contract_id": null, + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", "type_": "diagnostic", "body": { "v0": { @@ -4669,35 +5938,19 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000007" + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "create_plan" + "symbol": "instance_get" } ], "data": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" - }, - { - "string": "Premium Plan" - }, - { - "i128": { - "hi": 0, - "lo": 900 - } - }, - { - "address": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45" + "symbol": "RateLimit" }, { - "vec": [ - { - "symbol": "Monthly" - } - ] + "string": "subscribe" } ] } @@ -4709,7 +5962,28 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "instance_get" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", "type_": "diagnostic", "body": { "v0": { @@ -4718,41 +5992,19 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "create_plan" + "symbol": "persistent_get" } ], "data": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" - }, - { - "string": "Premium Plan" - }, - { - "i128": { - "hi": 0, - "lo": 900 - } - }, - { - "address": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45" + "symbol": "Plan" }, { - "vec": [ - { - "symbol": "Monthly" - } - ] + "u64": 2 } ] } @@ -4764,25 +6016,98 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "fn_call" - }, - { - "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + "symbol": "fn_return" }, { - "symbol": "instance_get" + "symbol": "persistent_get" } ], "data": { - "vec": [ + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1700000000 + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 2 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Premium Plan" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": { + "hi": 0, + "lo": 900 + } + } + }, + { + "key": { + "symbol": "subscriber_count" + }, + "val": { + "u32": 0 + } + }, { - "symbol": "Admin" + "key": { + "symbol": "token" + }, + "val": { + "address": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45" + } } ] } @@ -4791,29 +6116,6 @@ }, "failed_call": false }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "instance_get" - } - ], - "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - } - } - }, - "failed_call": false - }, { "event": { "ext": "v0", @@ -4829,16 +6131,19 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "instance_get" + "symbol": "persistent_get" } ], "data": { "vec": [ { - "symbol": "RateLimit" + "symbol": "UserPlanIndex" }, { - "string": "create_plan" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": 2 } ] } @@ -4859,7 +6164,7 @@ "symbol": "fn_return" }, { - "symbol": "instance_get" + "symbol": "persistent_get" } ], "data": "void" @@ -4889,7 +6194,7 @@ "data": { "vec": [ { - "symbol": "PlanCount" + "symbol": "SubscriptionCount" } ] } @@ -4944,7 +6249,7 @@ { "vec": [ { - "symbol": "Plan" + "symbol": "Subscription" }, { "u64": 2 @@ -4955,15 +6260,23 @@ "map": [ { "key": { - "symbol": "active" + "symbol": "charge_count" }, "val": { - "bool": true + "u32": 0 } }, { "key": { - "symbol": "created_at" + "symbol": "id" + }, + "val": { + "u64": 2 + } + }, + { + "key": { + "symbol": "last_charged_at" }, "val": { "u64": 1700000000 @@ -4971,65 +6284,92 @@ }, { "key": { - "symbol": "id" + "symbol": "next_charge_at" }, "val": { - "u64": 2 + "u64": 1702592000 } }, { "key": { - "symbol": "interval" + "symbol": "pause_duration" }, "val": { - "vec": [ - { - "symbol": "Monthly" - } - ] + "u64": 0 } }, { "key": { - "symbol": "merchant" + "symbol": "paused_at" }, "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + "u64": 0 } }, { "key": { - "symbol": "name" + "symbol": "plan_id" }, "val": { - "string": "Premium Plan" + "u64": 2 } }, { "key": { - "symbol": "price" + "symbol": "refund_requested_amount" }, "val": { "i128": { "hi": 0, - "lo": 900 + "lo": 0 } } }, { "key": { - "symbol": "subscriber_count" + "symbol": "started_at" }, "val": { - "u32": 0 + "u64": 1700000000 } }, { "key": { - "symbol": "token" + "symbol": "status" }, "val": { - "address": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45" + "vec": [ + { + "symbol": "Active" + } + ] + } + }, + { + "key": { + "symbol": "subscriber" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "total_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } } } ] @@ -5085,7 +6425,7 @@ { "vec": [ { - "symbol": "PlanCount" + "symbol": "SubscriptionCount" } ] }, @@ -5141,10 +6481,148 @@ "data": { "vec": [ { - "symbol": "MerchantPlans" + "symbol": "UserSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_get" + } + ], + "data": { + "vec": [ + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_set" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "UserSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + { + "vec": [ + { + "u64": 1 + }, + { + "u64": 2 + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_set" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_set" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "UserPlanIndex" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "u64": 2 + } + ] }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + "u64": 2 } ] } @@ -5165,7 +6643,7 @@ "symbol": "fn_return" }, { - "symbol": "persistent_get" + "symbol": "persistent_set" } ], "data": "void" @@ -5197,17 +6675,93 @@ { "vec": [ { - "symbol": "MerchantPlans" + "symbol": "Plan" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + "u64": 2 } ] }, { - "vec": [ + "map": [ { - "u64": 2 + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 1700000000 + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 2 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Premium Plan" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": { + "hi": 0, + "lo": 900 + } + } + }, + { + "key": { + "symbol": "subscriber_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45" + } } ] } @@ -5251,7 +6805,7 @@ "symbol": "fn_return" }, { - "symbol": "create_plan" + "symbol": "subscribe" } ], "data": { @@ -5274,7 +6828,7 @@ "symbol": "fn_return" }, { - "symbol": "create_plan" + "symbol": "subscribe" } ], "data": { @@ -5300,16 +6854,45 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000007" }, { - "symbol": "subscribe" + "symbol": "charge_subscription" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + }, + { + "symbol": "charge_subscription" } ], "data": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" }, { - "u64": 2 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "u64": 1 } ] } @@ -5321,7 +6904,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", "type_": "diagnostic", "body": { "v0": { @@ -5330,25 +6913,157 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "subscribe" + "symbol": "persistent_get" } ], "data": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + "symbol": "Subscription" + }, + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_get" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "last_charged_at" + }, + "val": { + "u64": 1700000000 + } + }, + { + "key": { + "symbol": "next_charge_at" + }, + "val": { + "u64": 1702592000 + } + }, + { + "key": { + "symbol": "pause_duration" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "paused_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "plan_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "refund_requested_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "started_at" + }, + "val": { + "u64": 1700000000 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + "key": { + "symbol": "subscriber" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } }, { - "u64": 2 + "key": { + "symbol": "total_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } } ] } @@ -5434,7 +7149,7 @@ "symbol": "RateLimit" }, { - "string": "subscribe" + "string": "charge_subscription" } ] } @@ -5488,7 +7203,7 @@ "symbol": "Plan" }, { - "u64": 2 + "u64": 1 } ] } @@ -5535,7 +7250,7 @@ "symbol": "id" }, "val": { - "u64": 2 + "u64": 1 } }, { @@ -5555,7 +7270,7 @@ "symbol": "merchant" }, "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } }, { @@ -5563,7 +7278,7 @@ "symbol": "name" }, "val": { - "string": "Premium Plan" + "string": "Integration Plan" } }, { @@ -5573,7 +7288,7 @@ "val": { "i128": { "hi": 0, - "lo": 900 + "lo": 500 } } }, @@ -5582,7 +7297,7 @@ "symbol": "subscriber_count" }, "val": { - "u32": 0 + "u32": 1 } }, { @@ -5590,7 +7305,7 @@ "symbol": "token" }, "val": { - "address": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45" + "address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23" } } ] @@ -5612,22 +7327,25 @@ "symbol": "fn_call" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + "bytes": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44" }, { - "symbol": "persistent_get" + "symbol": "transfer" } ], "data": { "vec": [ { - "symbol": "UserPlanIndex" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" }, { - "u64": 2 + "i128": { + "hi": 0, + "lo": 500 + } } ] } @@ -5639,48 +7357,29 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", - "type_": "diagnostic", + "contract_id": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44", + "type_": "contract", "body": { "v0": { "topics": [ { - "symbol": "fn_return" + "symbol": "transfer" }, { - "symbol": "persistent_get" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" }, { - "symbol": "instance_get" + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE" } ], "data": { - "vec": [ - { - "symbol": "SubscriptionCount" - } - ] + "i128": { + "hi": 0, + "lo": 500 + } } } } @@ -5690,7 +7389,7 @@ { "event": { "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "contract_id": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44", "type_": "diagnostic", "body": { "v0": { @@ -5699,12 +7398,10 @@ "symbol": "fn_return" }, { - "symbol": "instance_get" + "symbol": "transfer" } ], - "data": { - "u64": 1 - } + "data": "void" } } }, @@ -5736,7 +7433,7 @@ "symbol": "Subscription" }, { - "u64": 2 + "u64": 1 } ] }, @@ -5747,7 +7444,7 @@ "symbol": "charge_count" }, "val": { - "u32": 0 + "u32": 1 } }, { @@ -5755,7 +7452,7 @@ "symbol": "id" }, "val": { - "u64": 2 + "u64": 1 } }, { @@ -5763,7 +7460,7 @@ "symbol": "last_charged_at" }, "val": { - "u64": 1700000000 + "u64": 1702592030 } }, { @@ -5771,7 +7468,7 @@ "symbol": "next_charge_at" }, "val": { - "u64": 1702592000 + "u64": 1705184030 } }, { @@ -5795,64 +7492,247 @@ "symbol": "plan_id" }, "val": { - "u64": 2 + "u64": 1 + } + }, + { + "key": { + "symbol": "refund_requested_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "started_at" + }, + "val": { + "u64": 1700000000 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + }, + { + "key": { + "symbol": "subscriber" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 100000 } }, { - "key": { - "symbol": "refund_requested_amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 0 - } - } + "key": { + "symbol": "total_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_set" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_get" + } + ], + "data": { + "vec": [ + { + "symbol": "RevenueRecognitionRule" + }, + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_get" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_set" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "RevenueSchedule" }, { - "key": { - "symbol": "started_at" - }, - "val": { - "u64": 1700000000 - } - }, + "u64": 1 + } + ] + }, + { + "map": [ { "key": { - "symbol": "status" + "symbol": "entries" }, "val": { "vec": [ { - "symbol": "Active" + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 1705184030 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 1702592030 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] } ] } }, { "key": { - "symbol": "subscriber" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - } - }, - { - "key": { - "symbol": "total_gas_spent" + "symbol": "subscription_id" }, "val": { - "u64": 0 + "u64": 1 } }, { "key": { - "symbol": "total_paid" + "symbol": "total_amount" }, "val": { "i128": { "hi": 0, - "lo": 0 + "lo": 500 } } } @@ -5901,20 +7781,16 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "instance_set" + "symbol": "persistent_get" } ], "data": { "vec": [ { - "vec": [ - { - "symbol": "SubscriptionCount" - } - ] + "symbol": "RevenueRecognisedBalance" }, { - "u64": 2 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } ] } @@ -5935,7 +7811,7 @@ "symbol": "fn_return" }, { - "symbol": "instance_set" + "symbol": "persistent_get" } ], "data": "void" @@ -5965,10 +7841,10 @@ "data": { "vec": [ { - "symbol": "UserSubscriptions" + "symbol": "RevenueDeferredBalance" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } ] } @@ -5992,13 +7868,7 @@ "symbol": "persistent_get" } ], - "data": { - "vec": [ - { - "u64": 1 - } - ] - } + "data": "void" } } }, @@ -6027,22 +7897,18 @@ { "vec": [ { - "symbol": "UserSubscriptions" + "symbol": "RevenueRecognisedBalance" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } ] }, { - "vec": [ - { - "u64": 1 - }, - { - "u64": 2 - } - ] + "i128": { + "hi": 0, + "lo": 0 + } } ] } @@ -6095,18 +7961,18 @@ { "vec": [ { - "symbol": "UserPlanIndex" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "symbol": "RevenueDeferredBalance" }, { - "u64": 2 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } ] }, { - "u64": 2 + "i128": { + "hi": 0, + "lo": 500 + } } ] } @@ -6136,6 +8002,60 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_get" + } + ], + "data": { + "vec": [ + { + "symbol": "RevenueMerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_get" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -6159,93 +8079,17 @@ { "vec": [ { - "symbol": "Plan" + "symbol": "RevenueMerchantSubscriptions" }, { - "u64": 2 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" } - ] - }, - { - "map": [ - { - "key": { - "symbol": "active" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "created_at" - }, - "val": { - "u64": 1700000000 - } - }, - { - "key": { - "symbol": "id" - }, - "val": { - "u64": 2 - } - }, - { - "key": { - "symbol": "interval" - }, - "val": { - "vec": [ - { - "symbol": "Monthly" - } - ] - } - }, - { - "key": { - "symbol": "merchant" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" - } - }, - { - "key": { - "symbol": "name" - }, - "val": { - "string": "Premium Plan" - } - }, - { - "key": { - "symbol": "price" - }, - "val": { - "i128": { - "hi": 0, - "lo": 900 - } - } - }, - { - "key": { - "symbol": "subscriber_count" - }, - "val": { - "u32": 1 - } - }, - { - "key": { - "symbol": "token" - }, - "val": { - "address": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45" - } + ] + }, + { + "vec": [ + { + "u64": 1 } ] } @@ -6281,25 +8125,62 @@ "event": { "ext": "v0", "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", + "type_": "contract", "body": { "v0": { "topics": [ { - "symbol": "fn_return" + "string": "subscription_charged" }, { - "symbol": "subscribe" + "u64": 1 } ], "data": { - "u64": 2 + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "u64": 100000 + }, + { + "u64": 1702592030 + } + ] } } } }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "charge_subscription" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -6312,12 +8193,10 @@ "symbol": "fn_return" }, { - "symbol": "subscribe" + "symbol": "charge_subscription" } ], - "data": { - "u64": 2 - } + "data": "void" } } }, @@ -6342,7 +8221,7 @@ } ], "data": { - "u64": 1 + "u64": 2 } } } @@ -6376,7 +8255,7 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" }, { - "u64": 1 + "u64": 2 } ] } @@ -6409,7 +8288,7 @@ "symbol": "Subscription" }, { - "u64": 1 + "u64": 2 } ] } @@ -6448,7 +8327,7 @@ "symbol": "id" }, "val": { - "u64": 1 + "u64": 2 } }, { @@ -6488,7 +8367,7 @@ "symbol": "plan_id" }, "val": { - "u64": 1 + "u64": 2 } }, { @@ -6687,7 +8566,7 @@ "symbol": "Plan" }, { - "u64": 1 + "u64": 2 } ] } @@ -6734,7 +8613,7 @@ "symbol": "id" }, "val": { - "u64": 1 + "u64": 2 } }, { @@ -6754,7 +8633,7 @@ "symbol": "merchant" }, "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" } }, { @@ -6762,7 +8641,7 @@ "symbol": "name" }, "val": { - "string": "Integration Plan" + "string": "Premium Plan" } }, { @@ -6772,7 +8651,7 @@ "val": { "i128": { "hi": 0, - "lo": 500 + "lo": 900 } } }, @@ -6789,7 +8668,7 @@ "symbol": "token" }, "val": { - "address": "CD3FXVGYSLQFFTW3UH6WFF2OKZH7VERGZJZAMJHTGHBWO4F6URWEJL23" + "address": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45" } } ] @@ -6811,7 +8690,7 @@ "symbol": "fn_call" }, { - "bytes": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44" + "bytes": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6" }, { "symbol": "transfer" @@ -6823,12 +8702,12 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" }, { "i128": { "hi": 0, - "lo": 500 + "lo": 900 } } ] @@ -6841,7 +8720,7 @@ { "event": { "ext": "v0", - "contract_id": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44", + "contract_id": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6", "type_": "contract", "body": { "v0": { @@ -6853,16 +8732,16 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" }, { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUDE" + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWM2U" } ], "data": { "i128": { "hi": 0, - "lo": 500 + "lo": 900 } } } @@ -6873,7 +8752,7 @@ { "event": { "ext": "v0", - "contract_id": "f65bd4d892e052cedba1fd62974e564ffa9226ca720624f331c36770bea46c44", + "contract_id": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6", "type_": "diagnostic", "body": { "v0": { @@ -6917,7 +8796,7 @@ "symbol": "Subscription" }, { - "u64": 1 + "u64": 2 } ] }, @@ -6936,7 +8815,7 @@ "symbol": "id" }, "val": { - "u64": 1 + "u64": 2 } }, { @@ -6976,7 +8855,7 @@ "symbol": "plan_id" }, "val": { - "u64": 1 + "u64": 2 } }, { @@ -7033,7 +8912,7 @@ "val": { "i128": { "hi": 0, - "lo": 500 + "lo": 900 } } } @@ -7052,159 +8931,16 @@ "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", "type_": "diagnostic", "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "persistent_set" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "contract", - "body": { - "v0": { - "topics": [ - { - "string": "subscription_charged" - }, - { - "u64": 1 - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "i128": { - "hi": 0, - "lo": 500 - } - }, - { - "u64": 100000 - }, - { - "u64": 1702592030 - } - ] - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "charge_subscription" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_return" - }, - { - "symbol": "charge_subscription" - } - ], - "data": "void" - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": null, - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "0000000000000000000000000000000000000000000000000000000000000007" - }, - { - "symbol": "charge_subscription" - } - ], - "data": { - "u64": 2 - } - } - } - }, - "failed_call": false - }, - { - "event": { - "ext": "v0", - "contract_id": "0000000000000000000000000000000000000000000000000000000000000007", - "type_": "diagnostic", - "body": { - "v0": { - "topics": [ - { - "symbol": "fn_call" - }, - { - "bytes": "0000000000000000000000000000000000000000000000000000000000000006" - }, - { - "symbol": "charge_subscription" - } - ], - "data": { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" - }, - { - "u64": 2 - } - ] - } + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_set" + } + ], + "data": "void" } } }, @@ -7231,7 +8967,7 @@ "data": { "vec": [ { - "symbol": "Subscription" + "symbol": "RevenueRecognitionRule" }, { "u64": 2 @@ -7258,124 +8994,7 @@ "symbol": "persistent_get" } ], - "data": { - "map": [ - { - "key": { - "symbol": "charge_count" - }, - "val": { - "u32": 0 - } - }, - { - "key": { - "symbol": "id" - }, - "val": { - "u64": 2 - } - }, - { - "key": { - "symbol": "last_charged_at" - }, - "val": { - "u64": 1700000000 - } - }, - { - "key": { - "symbol": "next_charge_at" - }, - "val": { - "u64": 1702592000 - } - }, - { - "key": { - "symbol": "pause_duration" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "paused_at" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "plan_id" - }, - "val": { - "u64": 2 - } - }, - { - "key": { - "symbol": "refund_requested_amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 0 - } - } - }, - { - "key": { - "symbol": "started_at" - }, - "val": { - "u64": 1700000000 - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Active" - } - ] - } - }, - { - "key": { - "symbol": "subscriber" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - } - }, - { - "key": { - "symbol": "total_gas_spent" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "total_paid" - }, - "val": { - "i128": { - "hi": 0, - "lo": 0 - } - } - } - ] - } + "data": "void" } } }, @@ -7396,13 +9015,91 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "instance_get" + "symbol": "persistent_set" } ], "data": { "vec": [ { - "symbol": "Admin" + "vec": [ + { + "symbol": "RevenueSchedule" + }, + { + "u64": 2 + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 1705184030 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 1702592030 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 900 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 2 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 900 + } + } + } + ] } ] } @@ -7423,12 +9120,10 @@ "symbol": "fn_return" }, { - "symbol": "instance_get" + "symbol": "persistent_set" } ], - "data": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } + "data": "void" } } }, @@ -7449,16 +9144,16 @@ "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "instance_get" + "symbol": "persistent_get" } ], "data": { "vec": [ { - "symbol": "RateLimit" + "symbol": "RevenueRecognisedBalance" }, { - "string": "charge_subscription" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" } ] } @@ -7479,7 +9174,7 @@ "symbol": "fn_return" }, { - "symbol": "instance_get" + "symbol": "persistent_get" } ], "data": "void" @@ -7509,10 +9204,10 @@ "data": { "vec": [ { - "symbol": "Plan" + "symbol": "RevenueDeferredBalance" }, { - "u64": 2 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" } ] } @@ -7534,87 +9229,48 @@ }, { "symbol": "persistent_get" - } - ], - "data": { - "map": [ - { - "key": { - "symbol": "active" - }, - "val": { - "bool": true - } - }, - { - "key": { - "symbol": "created_at" - }, - "val": { - "u64": 1700000000 - } - }, - { - "key": { - "symbol": "id" - }, - "val": { - "u64": 2 - } - }, - { - "key": { - "symbol": "interval" - }, - "val": { - "vec": [ - { - "symbol": "Monthly" - } - ] - } - }, - { - "key": { - "symbol": "merchant" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" - } - }, - { - "key": { - "symbol": "name" - }, - "val": { - "string": "Premium Plan" - } - }, + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_set" + } + ], + "data": { + "vec": [ { - "key": { - "symbol": "price" - }, - "val": { - "i128": { - "hi": 0, - "lo": 900 + "vec": [ + { + "symbol": "RevenueRecognisedBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" } - } - }, - { - "key": { - "symbol": "subscriber_count" - }, - "val": { - "u32": 1 - } + ] }, { - "key": { - "symbol": "token" - }, - "val": { - "address": "CCVQTUQIJR624NNEI5TORM2BHEXTSDMY5ZB3CYJKAATGJQCY7LU2MD45" + "i128": { + "hi": 0, + "lo": 0 } } ] @@ -7624,6 +9280,27 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_set" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -7636,19 +9313,23 @@ "symbol": "fn_call" }, { - "bytes": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6" + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "symbol": "transfer" + "symbol": "persistent_set" } ], "data": { "vec": [ { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + "vec": [ + { + "symbol": "RevenueDeferredBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] }, { "i128": { @@ -7666,29 +9347,51 @@ { "event": { "ext": "v0", - "contract_id": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6", - "type_": "contract", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", "body": { "v0": { "topics": [ { - "symbol": "transfer" + "symbol": "fn_return" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + "symbol": "persistent_set" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" }, { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" }, { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWM2U" + "symbol": "persistent_get" } ], "data": { - "i128": { - "hi": 0, - "lo": 900 - } + "vec": [ + { + "symbol": "RevenueMerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] } } } @@ -7698,7 +9401,7 @@ { "event": { "ext": "v0", - "contract_id": "ab09d2084c7dae35a44766e8b341392f390d98ee43b1612a002664c058fae9a6", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", "type_": "diagnostic", "body": { "v0": { @@ -7707,7 +9410,7 @@ "symbol": "fn_return" }, { - "symbol": "transfer" + "symbol": "persistent_get" } ], "data": "void" @@ -7739,128 +9442,17 @@ { "vec": [ { - "symbol": "Subscription" + "symbol": "RevenueMerchantSubscriptions" }, { - "u64": 2 + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" } ] }, { - "map": [ - { - "key": { - "symbol": "charge_count" - }, - "val": { - "u32": 1 - } - }, - { - "key": { - "symbol": "id" - }, - "val": { - "u64": 2 - } - }, - { - "key": { - "symbol": "last_charged_at" - }, - "val": { - "u64": 1702592030 - } - }, - { - "key": { - "symbol": "next_charge_at" - }, - "val": { - "u64": 1705184030 - } - }, - { - "key": { - "symbol": "pause_duration" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "paused_at" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "plan_id" - }, - "val": { - "u64": 2 - } - }, - { - "key": { - "symbol": "refund_requested_amount" - }, - "val": { - "i128": { - "hi": 0, - "lo": 0 - } - } - }, - { - "key": { - "symbol": "started_at" - }, - "val": { - "u64": 1700000000 - } - }, - { - "key": { - "symbol": "status" - }, - "val": { - "vec": [ - { - "symbol": "Active" - } - ] - } - }, - { - "key": { - "symbol": "subscriber" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" - } - }, - { - "key": { - "symbol": "total_gas_spent" - }, - "val": { - "u64": 100000 - } - }, + "vec": [ { - "key": { - "symbol": "total_paid" - }, - "val": { - "i128": { - "hi": 0, - "lo": 900 - } - } + "u64": 2 } ] } diff --git a/contracts/proxy/test_snapshots/integration_uses_actual_token_contract_for_charges.1.json b/contracts/proxy/test_snapshots/integration_uses_actual_token_contract_for_charges.1.json index 062f218..7568a61 100644 --- a/contracts/proxy/test_snapshots/integration_uses_actual_token_contract_for_charges.1.json +++ b/contracts/proxy/test_snapshots/integration_uses_actual_token_contract_for_charges.1.json @@ -634,6 +634,264 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueDeferredBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueDeferredBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueMerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueMerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 1 + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueRecognisedBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueRecognisedBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueSchedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "RevenueSchedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 1705184010 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 1702592010 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -4293,6 +4551,544 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_get" + } + ], + "data": { + "vec": [ + { + "symbol": "RevenueRecognitionRule" + }, + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_get" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_set" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "RevenueSchedule" + }, + { + "u64": 1 + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 1705184010 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 1702592010 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_set" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_get" + } + ], + "data": { + "vec": [ + { + "symbol": "RevenueRecognisedBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_get" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_get" + } + ], + "data": { + "vec": [ + { + "symbol": "RevenueDeferredBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_get" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_set" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "RevenueRecognisedBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + { + "i128": { + "hi": 0, + "lo": 0 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_set" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_set" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "RevenueDeferredBalance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_set" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_get" + } + ], + "data": { + "vec": [ + { + "symbol": "RevenueMerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_get" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000006", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000005" + }, + { + "symbol": "persistent_set" + } + ], + "data": { + "vec": [ + { + "vec": [ + { + "symbol": "RevenueMerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + { + "vec": [ + { + "u64": 1 + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000005", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "persistent_set" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", diff --git a/contracts/proxy/tests/upgrade_flow.rs b/contracts/proxy/tests/upgrade_flow.rs index 8ebdc5b..cb48551 100644 --- a/contracts/proxy/tests/upgrade_flow.rs +++ b/contracts/proxy/tests/upgrade_flow.rs @@ -1,3 +1,4 @@ +#![allow(clippy::too_many_arguments)] use soroban_sdk::{ contract, contractimpl, testutils::{Address as _, Ledger}, @@ -18,15 +19,27 @@ fn storage_instance_get>( key: StorageKey, ) -> Option { let args: Vec = soroban_sdk::vec![env, key.into_val(env)]; - let val_opt: Option = - env.invoke_contract(storage, &soroban_sdk::Symbol::new(env, "instance_get"), args); + let val_opt: Option = env.invoke_contract( + storage, + &soroban_sdk::Symbol::new(env, "instance_get"), + args, + ); val_opt.map(|val| V::try_from_val(env, &val).unwrap()) } -fn storage_instance_set>(env: &Env, storage: &Address, key: StorageKey, value: V) { +fn storage_instance_set>( + env: &Env, + storage: &Address, + key: StorageKey, + value: V, +) { let val: Val = value.into_val(env); let args: Vec = soroban_sdk::vec![env, key.into_val(env), val]; - env.invoke_contract::<()>(storage, &soroban_sdk::Symbol::new(env, "instance_set"), args); + env.invoke_contract::<()>( + storage, + &soroban_sdk::Symbol::new(env, "instance_set"), + args, + ); } fn storage_persistent_get>( @@ -35,12 +48,20 @@ fn storage_persistent_get>( key: StorageKey, ) -> Option { let args: Vec = soroban_sdk::vec![env, key.into_val(env)]; - let val_opt: Option = - env.invoke_contract(storage, &soroban_sdk::Symbol::new(env, "persistent_get"), args); + let val_opt: Option = env.invoke_contract( + storage, + &soroban_sdk::Symbol::new(env, "persistent_get"), + args, + ); val_opt.map(|val| V::try_from_val(env, &val).unwrap()) } -fn storage_persistent_set>(env: &Env, storage: &Address, key: StorageKey, value: V) { +fn storage_persistent_set>( + env: &Env, + storage: &Address, + key: StorageKey, + value: V, +) { let val: Val = value.into_val(env); let args: Vec = soroban_sdk::vec![env, key.into_val(env), val]; env.invoke_contract::<()>( @@ -134,8 +155,8 @@ mod v1_impl { .expect("Plan not found"); assert!(plan.active, "Plan is not active"); - let mut sub_count: u64 = storage_instance_get(&env, &storage, StorageKey::SubscriptionCount) - .unwrap_or(0); + let mut sub_count: u64 = + storage_instance_get(&env, &storage, StorageKey::SubscriptionCount).unwrap_or(0); sub_count += 1; let now = env.ledger().timestamp(); @@ -163,7 +184,8 @@ mod v1_impl { pub fn get_plan(env: Env, proxy: Address, storage: Address, plan_id: u64) -> Plan { proxy.require_auth(); - storage_persistent_get(&env, &storage, StorageKey::Plan(plan_id)).expect("Plan not found") + storage_persistent_get(&env, &storage, StorageKey::Plan(plan_id)) + .expect("Plan not found") } pub fn get_subscription( diff --git a/contracts/subscription/src/lib.rs b/contracts/subscription/src/lib.rs index 5d4ba7d..33369fa 100644 --- a/contracts/subscription/src/lib.rs +++ b/contracts/subscription/src/lib.rs @@ -1,4 +1,7 @@ #![no_std] +#![allow(clippy::too_many_arguments)] + +pub mod revenue; use soroban_sdk::{token, Address, Env, IntoVal, String, TryFromVal, Val, Vec}; use subtrackr_types::{Interval, Plan, StorageKey, Subscription, SubscriptionStatus}; @@ -22,7 +25,12 @@ fn storage_instance_get>( val_opt.map(|val| V::try_from_val(env, &val).unwrap()) } -fn storage_instance_set>(env: &Env, storage: &Address, key: StorageKey, value: V) { +fn storage_instance_set>( + env: &Env, + storage: &Address, + key: StorageKey, + value: V, +) { let val: Val = value.into_val(env); let args: Vec = soroban_sdk::vec![env, key.into_val(env), val]; env.invoke_contract::<()>( @@ -55,7 +63,12 @@ fn storage_persistent_get>( val_opt.map(|val| V::try_from_val(env, &val).unwrap()) } -fn storage_persistent_set>(env: &Env, storage: &Address, key: StorageKey, value: V) { +fn storage_persistent_set>( + env: &Env, + storage: &Address, + key: StorageKey, + value: V, +) { let val: Val = value.into_val(env); let args: Vec = soroban_sdk::vec![env, key.into_val(env), val]; env.invoke_contract::<()>( @@ -100,7 +113,10 @@ fn enforce_rate_limit(env: &Env, storage: &Address, caller: &Address, function_n if let Some(last) = last_opt { if now < last + min_secs { env.events().publish( - (String::from_str(env, "rate_limit_violation"), caller.clone()), + ( + String::from_str(env, "rate_limit_violation"), + caller.clone(), + ), (fname.clone(), last, now, min_secs), ); panic!("Rate limited: please wait before calling this function again"); @@ -144,11 +160,24 @@ fn set_user_plan_index( } fn remove_user_plan_index(env: &Env, storage: &Address, subscriber: &Address, plan_id: u64) { - storage_persistent_remove(env, storage, StorageKey::UserPlanIndex(subscriber.clone(), plan_id)); + storage_persistent_remove( + env, + storage, + StorageKey::UserPlanIndex(subscriber.clone(), plan_id), + ); } -fn get_user_plan_index(env: &Env, storage: &Address, subscriber: &Address, plan_id: u64) -> Option { - storage_persistent_get(env, storage, StorageKey::UserPlanIndex(subscriber.clone(), plan_id)) +fn get_user_plan_index( + env: &Env, + storage: &Address, + subscriber: &Address, + plan_id: u64, +) -> Option { + storage_persistent_get( + env, + storage, + StorageKey::UserPlanIndex(subscriber.clone(), plan_id), + ) } // ───────────────────────────────────────────────────────────────────────────── @@ -194,8 +223,8 @@ impl SubTrackrSubscription { assert!(from_version < STORAGE_VERSION, "Unsupported migration path"); if from_version == 1 { - let sub_count: u64 = storage_instance_get(&env, &storage, StorageKey::SubscriptionCount) - .unwrap_or(0); + let sub_count: u64 = + storage_instance_get(&env, &storage, StorageKey::SubscriptionCount).unwrap_or(0); let mut i: u64 = 1; while i <= sub_count { let sub_opt: Option = @@ -270,7 +299,8 @@ impl SubTrackrSubscription { merchant.require_auth(); assert!(price > 0, "Price must be positive"); - let mut count: u64 = storage_instance_get(&env, &storage, StorageKey::PlanCount).unwrap_or(0); + let mut count: u64 = + storage_instance_get(&env, &storage, StorageKey::PlanCount).unwrap_or(0); count += 1; let plan = Plan { @@ -288,12 +318,9 @@ impl SubTrackrSubscription { storage_persistent_set(&env, &storage, StorageKey::Plan(count), plan.clone()); storage_instance_set(&env, &storage, StorageKey::PlanCount, count); - let mut merchant_plans: Vec = storage_persistent_get( - &env, - &storage, - StorageKey::MerchantPlans(merchant.clone()), - ) - .unwrap_or(Vec::new(&env)); + let mut merchant_plans: Vec = + storage_persistent_get(&env, &storage, StorageKey::MerchantPlans(merchant.clone())) + .unwrap_or(Vec::new(&env)); merchant_plans.push_back(count); storage_persistent_set( &env, @@ -305,7 +332,13 @@ impl SubTrackrSubscription { count } - pub fn deactivate_plan(env: Env, proxy: Address, storage: Address, merchant: Address, plan_id: u64) { + pub fn deactivate_plan( + env: Env, + proxy: Address, + storage: Address, + merchant: Address, + plan_id: u64, + ) { proxy.require_auth(); if merchant != get_admin(&env, &storage) { enforce_rate_limit(&env, &storage, &merchant, "deactivate_plan"); @@ -323,7 +356,13 @@ impl SubTrackrSubscription { // ── Subscription Management ── - pub fn subscribe(env: Env, proxy: Address, storage: Address, subscriber: Address, plan_id: u64) -> u64 { + pub fn subscribe( + env: Env, + proxy: Address, + storage: Address, + subscriber: Address, + plan_id: u64, + ) -> u64 { proxy.require_auth(); if subscriber != get_admin(&env, &storage) { enforce_rate_limit(&env, &storage, &subscriber, "subscribe"); @@ -369,7 +408,12 @@ impl SubTrackrSubscription { refund_requested_amount: 0, }; - storage_persistent_set(&env, &storage, StorageKey::Subscription(sub_count), subscription); + storage_persistent_set( + &env, + &storage, + StorageKey::Subscription(sub_count), + subscription, + ); storage_instance_set(&env, &storage, StorageKey::SubscriptionCount, sub_count); let mut user_subs: Vec = storage_persistent_get( @@ -395,7 +439,13 @@ impl SubTrackrSubscription { sub_count } - pub fn cancel_subscription(env: Env, proxy: Address, storage: Address, subscriber: Address, subscription_id: u64) { + pub fn cancel_subscription( + env: Env, + proxy: Address, + storage: Address, + subscriber: Address, + subscription_id: u64, + ) { proxy.require_auth(); if subscriber != get_admin(&env, &storage) { enforce_rate_limit(&env, &storage, &subscriber, "cancel_subscription"); @@ -413,7 +463,12 @@ impl SubTrackrSubscription { ); sub.status = SubscriptionStatus::Cancelled; - storage_persistent_set(&env, &storage, StorageKey::Subscription(subscription_id), sub.clone()); + storage_persistent_set( + &env, + &storage, + StorageKey::Subscription(subscription_id), + sub.clone(), + ); // Remove index remove_user_plan_index(&env, &storage, &subscriber, sub.plan_id); @@ -479,7 +534,12 @@ impl SubTrackrSubscription { sub.paused_at = env.ledger().timestamp(); sub.pause_duration = duration; - storage_persistent_set(&env, &storage, StorageKey::Subscription(subscription_id), sub.clone()); + storage_persistent_set( + &env, + &storage, + StorageKey::Subscription(subscription_id), + sub.clone(), + ); env.events().publish( (String::from_str(&env, "subscription_paused"), subscriber), @@ -506,8 +566,7 @@ impl SubTrackrSubscription { assert!(sub.subscriber == subscriber, "Only subscriber can resume"); assert!( - sub.status == SubscriptionStatus::Paused - || check_and_resume_internal(&env, &mut sub), + sub.status == SubscriptionStatus::Paused || check_and_resume_internal(&env, &mut sub), "Only paused subscriptions can be resumed" ); @@ -520,7 +579,12 @@ impl SubTrackrSubscription { sub.paused_at = 0; sub.pause_duration = 0; - storage_persistent_set(&env, &storage, StorageKey::Subscription(subscription_id), sub); + storage_persistent_set( + &env, + &storage, + StorageKey::Subscription(subscription_id), + sub, + ); env.events().publish( (String::from_str(&env, "subscription_resumed"), subscriber), @@ -562,7 +626,11 @@ impl SubTrackrSubscription { let plan: Plan = storage_persistent_get(&env, &storage, StorageKey::Plan(sub.plan_id)) .expect("Plan not found"); - token::Client::new(&env, &plan.token).transfer(&sub.subscriber, &plan.merchant, &plan.price); + token::Client::new(&env, &plan.token).transfer( + &sub.subscriber, + &plan.merchant, + &plan.price, + ); sub.last_charged_at = now; sub.next_charge_at = now + plan.interval.seconds(); @@ -570,10 +638,31 @@ impl SubTrackrSubscription { sub.total_gas_spent += 100_000; sub.charge_count += 1; - storage_persistent_set(&env, &storage, StorageKey::Subscription(subscription_id), sub.clone()); + storage_persistent_set( + &env, + &storage, + StorageKey::Subscription(subscription_id), + sub.clone(), + ); + + // Generate revenue recognition schedule and defer the full charge amount. + revenue::generate_revenue_schedule( + &env, + &storage, + subscription_id, + sub.plan_id, + plan.price, + now, + plan.interval.seconds(), + ); + revenue::update_merchant_revenue_balances(&env, &storage, &plan.merchant, 0, plan.price); + revenue::track_merchant_subscription(&env, &storage, &plan.merchant, subscription_id); env.events().publish( - (String::from_str(&env, "subscription_charged"), subscription_id), + ( + String::from_str(&env, "subscription_charged"), + subscription_id, + ), (sub.subscriber.clone(), plan.price, 100_000u64, now), ); } @@ -603,7 +692,12 @@ impl SubTrackrSubscription { ); sub.refund_requested_amount = amount; - storage_persistent_set(&env, &storage, StorageKey::Subscription(subscription_id), sub.clone()); + storage_persistent_set( + &env, + &storage, + StorageKey::Subscription(subscription_id), + sub.clone(), + ); env.events().publish( (String::from_str(&env, "refund_requested"), subscription_id), @@ -629,7 +723,12 @@ impl SubTrackrSubscription { sub.total_paid -= amount; sub.refund_requested_amount = 0; - storage_persistent_set(&env, &storage, StorageKey::Subscription(subscription_id), sub.clone()); + storage_persistent_set( + &env, + &storage, + StorageKey::Subscription(subscription_id), + sub.clone(), + ); env.events().publish( (String::from_str(&env, "refund_approved"), subscription_id), @@ -649,7 +748,12 @@ impl SubTrackrSubscription { assert!(sub.refund_requested_amount > 0, "No pending refund request"); sub.refund_requested_amount = 0; - storage_persistent_set(&env, &storage, StorageKey::Subscription(subscription_id), sub.clone()); + storage_persistent_set( + &env, + &storage, + StorageKey::Subscription(subscription_id), + sub.clone(), + ); env.events().publish( (String::from_str(&env, "refund_rejected"), subscription_id), @@ -690,7 +794,10 @@ impl SubTrackrSubscription { ); env.events().publish( - (String::from_str(&env, "transfer_requested"), subscription_id), + ( + String::from_str(&env, "transfer_requested"), + subscription_id, + ), (sub.subscriber.clone(), recipient), ); } @@ -759,7 +866,12 @@ impl SubTrackrSubscription { let old = sub.subscriber.clone(); sub.subscriber = recipient.clone(); - storage_persistent_set(&env, &storage, StorageKey::Subscription(subscription_id), sub); + storage_persistent_set( + &env, + &storage, + StorageKey::Subscription(subscription_id), + sub, + ); storage_instance_remove(&env, &storage, StorageKey::PendingTransfer(subscription_id)); @@ -776,7 +888,12 @@ impl SubTrackrSubscription { storage_persistent_get(&env, &storage, StorageKey::Plan(plan_id)).expect("Plan not found") } - pub fn get_subscription(env: Env, proxy: Address, storage: Address, subscription_id: u64) -> Subscription { + pub fn get_subscription( + env: Env, + proxy: Address, + storage: Address, + subscription_id: u64, + ) -> Subscription { proxy.require_auth(); let mut sub: Subscription = storage_persistent_get(&env, &storage, StorageKey::Subscription(subscription_id)) @@ -786,15 +903,26 @@ impl SubTrackrSubscription { sub } - pub fn get_user_subscriptions(env: Env, proxy: Address, storage: Address, subscriber: Address) -> Vec { + pub fn get_user_subscriptions( + env: Env, + proxy: Address, + storage: Address, + subscriber: Address, + ) -> Vec { proxy.require_auth(); storage_persistent_get(&env, &storage, StorageKey::UserSubscriptions(subscriber)) .unwrap_or(Vec::new(&env)) } - pub fn get_merchant_plans(env: Env, proxy: Address, storage: Address, merchant: Address) -> Vec { + pub fn get_merchant_plans( + env: Env, + proxy: Address, + storage: Address, + merchant: Address, + ) -> Vec { proxy.require_auth(); - storage_persistent_get(&env, &storage, StorageKey::MerchantPlans(merchant)).unwrap_or(Vec::new(&env)) + storage_persistent_get(&env, &storage, StorageKey::MerchantPlans(merchant)) + .unwrap_or(Vec::new(&env)) } pub fn get_plan_count(env: Env, proxy: Address, storage: Address) -> u64 { @@ -806,4 +934,74 @@ impl SubTrackrSubscription { proxy.require_auth(); storage_instance_get(&env, &storage, StorageKey::SubscriptionCount).unwrap_or(0) } + + // ── Revenue Recognition API ── + + /// Set a revenue recognition rule for a plan (merchant only). + pub fn set_revenue_rule( + env: Env, + proxy: Address, + storage: Address, + merchant: Address, + plan_id: u64, + method: revenue::RecognitionMethod, + recognition_period: u64, + ) { + proxy.require_auth(); + merchant.require_auth(); + let plan: Plan = storage_persistent_get(&env, &storage, StorageKey::Plan(plan_id)) + .expect("Plan not found"); + assert!( + plan.merchant == merchant, + "Only plan owner can set revenue rule" + ); + revenue::set_recognition_rule( + &env, + &storage, + revenue::RevenueRecognitionRule { + plan_id, + method, + recognition_period, + }, + ); + } + + /// Compute a recognition snapshot for a subscription as of the current ledger time. + pub fn recognize_revenue( + env: Env, + proxy: Address, + storage: Address, + subscription_id: u64, + ) -> revenue::Recognition { + proxy.require_auth(); + let sub: Subscription = + storage_persistent_get(&env, &storage, StorageKey::Subscription(subscription_id)) + .expect("Subscription not found"); + let plan: Plan = storage_persistent_get(&env, &storage, StorageKey::Plan(sub.plan_id)) + .expect("Plan not found"); + let now = env.ledger().timestamp(); + revenue::recognize_revenue(&env, &storage, subscription_id, plan.merchant, now) + } + + /// Return the cumulative deferred revenue balance for a merchant. + pub fn get_deferred_revenue( + env: Env, + proxy: Address, + storage: Address, + merchant_id: Address, + ) -> i128 { + proxy.require_auth(); + revenue::get_deferred_revenue(&env, &storage, &merchant_id) + } + + /// Return the revenue schedule for a subscription (None if not yet generated). + pub fn get_revenue_schedule( + env: Env, + proxy: Address, + storage: Address, + subscription_id: u64, + ) -> Option { + proxy.require_auth(); + revenue::get_revenue_schedule(&env, &storage, subscription_id) + } } diff --git a/contracts/subscription/src/revenue.rs b/contracts/subscription/src/revenue.rs new file mode 100644 index 0000000..c33c884 --- /dev/null +++ b/contracts/subscription/src/revenue.rs @@ -0,0 +1,387 @@ +/// Revenue recognition module for SubTrackr subscriptions. +/// +/// Implements ASC 606 / IFRS 15 compliant revenue recognition: +/// - Straight-line: revenue spread evenly across the billing period. +/// - Usage-based: revenue deferred until actual usage is reported. +/// +/// All storage is delegated to the shared storage contract via the +/// `storage_persistent_*` helpers defined in the parent module. +use soroban_sdk::{contracttype, Address, Env, Vec}; +use subtrackr_types::StorageKey; + +use crate::{storage_persistent_get, storage_persistent_set}; + +// ── Types ───────────────────────────────────────────────────────────────────── + +#[contracttype] +#[derive(Clone, Debug, PartialEq)] +pub enum RecognitionMethod { + StraightLine, + UsageBased, +} + +#[contracttype] +#[derive(Clone, Debug)] +pub struct RevenueRecognitionRule { + pub plan_id: u64, + pub method: RecognitionMethod, + /// Length of one recognition period in seconds. + pub recognition_period: u64, +} + +#[contracttype] +#[derive(Clone, Debug)] +pub struct RevenueScheduleEntry { + pub period_start: u64, + pub period_end: u64, + pub recognised_amount: i128, + pub is_recognised: bool, +} + +#[contracttype] +#[derive(Clone, Debug)] +pub struct RevenueSchedule { + pub subscription_id: u64, + pub total_amount: i128, + pub entries: Vec, +} + +#[contracttype] +#[derive(Clone, Debug)] +pub struct Recognition { + pub subscription_id: u64, + pub merchant: Address, + pub recognised_revenue: i128, + pub deferred_revenue: i128, + pub as_of: u64, +} + +#[contracttype] +#[derive(Clone, Debug)] +pub struct PeriodRevenue { + pub period_start: u64, + pub period_end: u64, + pub recognised_amount: i128, + pub subscription_count: u32, +} + +// ── Pure schedule builders ──────────────────────────────────────────────────── + +pub fn build_straight_line_schedule( + env: &Env, + subscription_id: u64, + total_amount: i128, + charge_time: u64, + period_secs: u64, + num_periods: u32, +) -> RevenueSchedule { + assert!(num_periods > 0, "num_periods must be > 0"); + assert!(period_secs > 0, "period_secs must be > 0"); + assert!(total_amount >= 0, "total_amount must be non-negative"); + + let slice = total_amount / num_periods as i128; + let remainder = total_amount - slice * num_periods as i128; + + let mut entries: Vec = Vec::new(env); + for i in 0..num_periods { + let start = charge_time + (i as u64) * period_secs; + let end = start + period_secs; + let amount = if i == num_periods - 1 { + slice + remainder + } else { + slice + }; + entries.push_back(RevenueScheduleEntry { + period_start: start, + period_end: end, + recognised_amount: amount, + is_recognised: false, + }); + } + RevenueSchedule { + subscription_id, + total_amount, + entries, + } +} + +pub fn build_usage_based_schedule( + env: &Env, + subscription_id: u64, + total_amount: i128, + charge_time: u64, + interval_secs: u64, +) -> RevenueSchedule { + let mut entries: Vec = Vec::new(env); + entries.push_back(RevenueScheduleEntry { + period_start: charge_time, + period_end: charge_time + interval_secs, + recognised_amount: total_amount, + is_recognised: false, + }); + RevenueSchedule { + subscription_id, + total_amount, + entries, + } +} + +/// Pro-rate a schedule as of `now` → (recognised, deferred). +pub fn split_recognised_deferred(schedule: &RevenueSchedule, now: u64) -> (i128, i128) { + let mut recognised: i128 = 0; + let mut deferred: i128 = 0; + for entry in schedule.entries.iter() { + if now >= entry.period_end { + recognised += entry.recognised_amount; + } else if now >= entry.period_start { + let elapsed = now - entry.period_start; + let duration = entry.period_end - entry.period_start; + let partial = entry.recognised_amount * elapsed as i128 / duration as i128; + recognised += partial; + deferred += entry.recognised_amount - partial; + } else { + deferred += entry.recognised_amount; + } + } + (recognised, deferred) +} + +// ── Storage helpers ─────────────────────────────────────────────────────────── + +pub fn set_recognition_rule(env: &Env, storage: &Address, rule: RevenueRecognitionRule) { + storage_persistent_set( + env, + storage, + StorageKey::RevenueRecognitionRule(rule.plan_id), + rule, + ); +} + +pub fn get_recognition_rule( + env: &Env, + storage: &Address, + plan_id: u64, +) -> Option { + storage_persistent_get(env, storage, StorageKey::RevenueRecognitionRule(plan_id)) +} + +pub fn get_revenue_schedule( + env: &Env, + storage: &Address, + subscription_id: u64, +) -> Option { + storage_persistent_get(env, storage, StorageKey::RevenueSchedule(subscription_id)) +} + +pub fn get_deferred_revenue(env: &Env, storage: &Address, merchant: &Address) -> i128 { + storage_persistent_get( + env, + storage, + StorageKey::RevenueDeferredBalance(merchant.clone()), + ) + .unwrap_or(0i128) +} + +/// Generate and persist a revenue schedule for a charge. +pub fn generate_revenue_schedule( + env: &Env, + storage: &Address, + subscription_id: u64, + plan_id: u64, + total_amount: i128, + charge_time: u64, + interval_secs: u64, +) -> RevenueSchedule { + let rule = get_recognition_rule(env, storage, plan_id); + + let schedule = match rule { + Some(r) => { + let num_periods = if r.recognition_period > 0 { + interval_secs.div_ceil(r.recognition_period) as u32 + } else { + 1 + }; + match r.method { + RecognitionMethod::StraightLine => build_straight_line_schedule( + env, + subscription_id, + total_amount, + charge_time, + r.recognition_period, + num_periods, + ), + RecognitionMethod::UsageBased => build_usage_based_schedule( + env, + subscription_id, + total_amount, + charge_time, + interval_secs, + ), + } + } + None => build_straight_line_schedule( + env, + subscription_id, + total_amount, + charge_time, + interval_secs, + 1, + ), + }; + + storage_persistent_set( + env, + storage, + StorageKey::RevenueSchedule(subscription_id), + schedule.clone(), + ); + schedule +} + +/// Compute a Recognition snapshot as of `now`. +pub fn recognize_revenue( + env: &Env, + storage: &Address, + subscription_id: u64, + merchant: Address, + now: u64, +) -> Recognition { + match get_revenue_schedule(env, storage, subscription_id) { + None => Recognition { + subscription_id, + merchant, + recognised_revenue: 0, + deferred_revenue: 0, + as_of: now, + }, + Some(schedule) => { + let (recognised, deferred) = split_recognised_deferred(&schedule, now); + Recognition { + subscription_id, + merchant, + recognised_revenue: recognised, + deferred_revenue: deferred, + as_of: now, + } + } + } +} + +/// Update merchant cumulative balances after a charge (all revenue starts deferred). +pub fn update_merchant_revenue_balances( + env: &Env, + storage: &Address, + merchant: &Address, + recognised_delta: i128, + deferred_delta: i128, +) { + let prev_rec: i128 = storage_persistent_get( + env, + storage, + StorageKey::RevenueRecognisedBalance(merchant.clone()), + ) + .unwrap_or(0i128); + let prev_def: i128 = storage_persistent_get( + env, + storage, + StorageKey::RevenueDeferredBalance(merchant.clone()), + ) + .unwrap_or(0i128); + + storage_persistent_set( + env, + storage, + StorageKey::RevenueRecognisedBalance(merchant.clone()), + prev_rec + recognised_delta, + ); + storage_persistent_set( + env, + storage, + StorageKey::RevenueDeferredBalance(merchant.clone()), + prev_def + deferred_delta, + ); +} + +/// Register a subscription under a merchant for analytics (deduplicates). +pub fn track_merchant_subscription( + env: &Env, + storage: &Address, + merchant: &Address, + subscription_id: u64, +) { + let mut ids: Vec = storage_persistent_get( + env, + storage, + StorageKey::RevenueMerchantSubscriptions(merchant.clone()), + ) + .unwrap_or(Vec::new(env)); + for existing in ids.iter() { + if existing == subscription_id { + return; + } + } + ids.push_back(subscription_id); + storage_persistent_set( + env, + storage, + StorageKey::RevenueMerchantSubscriptions(merchant.clone()), + ids, + ); +} + +/// Compute per-period revenue analytics for a merchant. +pub fn get_revenue_analytics_by_period( + env: &Env, + storage: &Address, + merchant: &Address, + period_secs: u64, + from: u64, + to: u64, +) -> Vec { + assert!(period_secs > 0, "period_secs must be > 0"); + assert!(to >= from, "to must be >= from"); + + let sub_ids: Vec = storage_persistent_get( + env, + storage, + StorageKey::RevenueMerchantSubscriptions(merchant.clone()), + ) + .unwrap_or(Vec::new(env)); + + let num_buckets = (to - from).div_ceil(period_secs) as u32; + let mut buckets: Vec = Vec::new(env); + for i in 0..num_buckets { + let start = from + (i as u64) * period_secs; + buckets.push_back(PeriodRevenue { + period_start: start, + period_end: start + period_secs, + recognised_amount: 0, + subscription_count: 0, + }); + } + + for sub_id in sub_ids.iter() { + let maybe: Option = + storage_persistent_get(env, storage, StorageKey::RevenueSchedule(sub_id)); + if let Some(schedule) = maybe { + let mut contributed = false; + for entry in schedule.entries.iter() { + if entry.period_start < from || entry.period_start >= to { + continue; + } + let idx = ((entry.period_start - from) / period_secs) as u32; + if idx < num_buckets { + let mut bucket = buckets.get_unchecked(idx); + bucket.recognised_amount += entry.recognised_amount; + if !contributed { + bucket.subscription_count += 1; + contributed = true; + } + buckets.set(idx, bucket); + } + } + } + } + + buckets +} diff --git a/contracts/test_snapshots/revenue/tests/test_deferred_revenue_balance_accumulates.1.json b/contracts/test_snapshots/revenue/tests/test_deferred_revenue_balance_accumulates.1.json new file mode 100644 index 0000000..6fcab55 --- /dev/null +++ b/contracts/test_snapshots/revenue/tests/test_deferred_revenue_balance_accumulates.1.json @@ -0,0 +1,348 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [[], [], []], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "DeferredRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "DeferredRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 800 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognisedRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognisedRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "update_balances" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 0 + } + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "update_balances" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "update_balances" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 0 + } + }, + { + "i128": { + "hi": 0, + "lo": 300 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "update_balances" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "get_deferred" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_deferred" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 800 + } + } + } + } + }, + "failed_call": false + } + ] +} diff --git a/contracts/test_snapshots/revenue/tests/test_deferred_revenue_balance_zero_for_unknown_merchant.1.json b/contracts/test_snapshots/revenue/tests/test_deferred_revenue_balance_zero_for_unknown_merchant.1.json new file mode 100644 index 0000000..c49e11c --- /dev/null +++ b/contracts/test_snapshots/revenue/tests/test_deferred_revenue_balance_zero_for_unknown_merchant.1.json @@ -0,0 +1,126 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [[]], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "get_deferred" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_deferred" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + } + }, + "failed_call": false + } + ] +} diff --git a/contracts/test_snapshots/revenue/tests/test_generate_revenue_schedule_no_rule_defaults_to_single_period.1.json b/contracts/test_snapshots/revenue/tests/test_generate_revenue_schedule_no_rule_defaults_to_single_period.1.json new file mode 100644 index 0000000..f1050dc --- /dev/null +++ b/contracts/test_snapshots/revenue/tests/test_generate_revenue_schedule_no_rule_defaults_to_single_period.1.json @@ -0,0 +1,323 @@ +{ + "generators": { + "address": 1, + "nonce": 0 + }, + "auth": [[]], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 600 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 600 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "u64": 99 + }, + { + "i128": { + "hi": 0, + "lo": 600 + } + }, + { + "u64": 0 + }, + { + "u64": 2592000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 600 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 600 + } + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} diff --git a/contracts/test_snapshots/revenue/tests/test_generate_revenue_schedule_straight_line_rule.1.json b/contracts/test_snapshots/revenue/tests/test_generate_revenue_schedule_straight_line_rule.1.json new file mode 100644 index 0000000..5627cc9 --- /dev/null +++ b/contracts/test_snapshots/revenue/tests/test_generate_revenue_schedule_straight_line_rule.1.json @@ -0,0 +1,458 @@ +{ + "generators": { + "address": 1, + "nonce": 0 + }, + "auth": [[], []], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognitionRule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognitionRule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "method" + }, + "val": { + "vec": [ + { + "symbol": "StraightLine" + } + ] + } + }, + { + "key": { + "symbol": "plan_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "recognition_period" + }, + "val": { + "u64": 2592000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "set_rule" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "vec": [ + { + "symbol": "StraightLine" + } + ] + }, + { + "u64": 2592000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_rule" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "u64": 1 + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "u64": 0 + }, + { + "u64": 2592000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} diff --git a/contracts/test_snapshots/revenue/tests/test_generate_revenue_schedule_usage_based_rule.1.json b/contracts/test_snapshots/revenue/tests/test_generate_revenue_schedule_usage_based_rule.1.json new file mode 100644 index 0000000..2685d05 --- /dev/null +++ b/contracts/test_snapshots/revenue/tests/test_generate_revenue_schedule_usage_based_rule.1.json @@ -0,0 +1,458 @@ +{ + "generators": { + "address": 1, + "nonce": 0 + }, + "auth": [[], []], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognitionRule" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognitionRule" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "method" + }, + "val": { + "vec": [ + { + "symbol": "UsageBased" + } + ] + } + }, + { + "key": { + "symbol": "plan_id" + }, + "val": { + "u64": 2 + } + }, + { + "key": { + "symbol": "recognition_period" + }, + "val": { + "u64": 2592000 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 800 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 800 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "set_rule" + } + ], + "data": { + "vec": [ + { + "u64": 2 + }, + { + "vec": [ + { + "symbol": "UsageBased" + } + ] + }, + { + "u64": 2592000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_rule" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "u64": 2 + }, + { + "i128": { + "hi": 0, + "lo": 800 + } + }, + { + "u64": 0 + }, + { + "u64": 2592000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 800 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 800 + } + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} diff --git a/contracts/test_snapshots/revenue/tests/test_get_recognition_rule_missing_returns_none.1.json b/contracts/test_snapshots/revenue/tests/test_get_recognition_rule_missing_returns_none.1.json new file mode 100644 index 0000000..da2412a --- /dev/null +++ b/contracts/test_snapshots/revenue/tests/test_get_recognition_rule_missing_returns_none.1.json @@ -0,0 +1,121 @@ +{ + "generators": { + "address": 1, + "nonce": 0 + }, + "auth": [[]], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "get_rule" + } + ], + "data": { + "u64": 999 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_rule" + } + ], + "data": "void" + } + } + }, + "failed_call": false + } + ] +} diff --git a/contracts/test_snapshots/revenue/tests/test_multi_element_arrangement_deferred_balances.1.json b/contracts/test_snapshots/revenue/tests/test_multi_element_arrangement_deferred_balances.1.json new file mode 100644 index 0000000..743412f --- /dev/null +++ b/contracts/test_snapshots/revenue/tests/test_multi_element_arrangement_deferred_balances.1.json @@ -0,0 +1,526 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [[], [], [], [], [], []], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "DeferredRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "DeferredRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognisedRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognisedRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "update_balances" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 0 + } + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "update_balances" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "update_balances" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 0 + } + }, + { + "i128": { + "hi": 0, + "lo": 300 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "update_balances" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "update_balances" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 0 + } + }, + { + "i128": { + "hi": 0, + "lo": 200 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "update_balances" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "get_deferred" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_deferred" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "update_balances" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "i128": { + "hi": -1, + "lo": 18446744073709551116 + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "update_balances" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "get_deferred" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_deferred" + } + ], + "data": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + } + }, + "failed_call": false + } + ] +} diff --git a/contracts/test_snapshots/revenue/tests/test_recognition_rule_can_be_updated.1.json b/contracts/test_snapshots/revenue/tests/test_recognition_rule_can_be_updated.1.json new file mode 100644 index 0000000..a792b94 --- /dev/null +++ b/contracts/test_snapshots/revenue/tests/test_recognition_rule_can_be_updated.1.json @@ -0,0 +1,348 @@ +{ + "generators": { + "address": 1, + "nonce": 0 + }, + "auth": [[], [], []], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognitionRule" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognitionRule" + }, + { + "u64": 5 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "method" + }, + "val": { + "vec": [ + { + "symbol": "UsageBased" + } + ] + } + }, + { + "key": { + "symbol": "plan_id" + }, + "val": { + "u64": 5 + } + }, + { + "key": { + "symbol": "recognition_period" + }, + "val": { + "u64": 86400 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "set_rule" + } + ], + "data": { + "vec": [ + { + "u64": 5 + }, + { + "vec": [ + { + "symbol": "StraightLine" + } + ] + }, + { + "u64": 86400 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_rule" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "set_rule" + } + ], + "data": { + "vec": [ + { + "u64": 5 + }, + { + "vec": [ + { + "symbol": "UsageBased" + } + ] + }, + { + "u64": 86400 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_rule" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "get_rule" + } + ], + "data": { + "u64": 5 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_rule" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "method" + }, + "val": { + "vec": [ + { + "symbol": "UsageBased" + } + ] + } + }, + { + "key": { + "symbol": "plan_id" + }, + "val": { + "u64": 5 + } + }, + { + "key": { + "symbol": "recognition_period" + }, + "val": { + "u64": 86400 + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} diff --git a/contracts/test_snapshots/revenue/tests/test_recognize_revenue_snapshot.1.json b/contracts/test_snapshots/revenue/tests/test_recognize_revenue_snapshot.1.json new file mode 100644 index 0000000..2118166 --- /dev/null +++ b/contracts/test_snapshots/revenue/tests/test_recognize_revenue_snapshot.1.json @@ -0,0 +1,429 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [[], []], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 1000 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "u64": 99 + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u64": 0 + }, + { + "u64": 1000 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 1000 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "recognize" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 600 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "recognize" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "as_of" + }, + "val": { + "u64": 600 + } + }, + { + "key": { + "symbol": "deferred_revenue" + }, + "val": { + "i128": { + "hi": 0, + "lo": 400 + } + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "recognised_revenue" + }, + "val": { + "i128": { + "hi": 0, + "lo": 600 + } + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} diff --git a/contracts/test_snapshots/revenue/tests/test_revenue_analytics_by_period.1.json b/contracts/test_snapshots/revenue/tests/test_revenue_analytics_by_period.1.json new file mode 100644 index 0000000..af3a12c --- /dev/null +++ b/contracts/test_snapshots/revenue/tests/test_revenue_analytics_by_period.1.json @@ -0,0 +1,873 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [[], [], [], [], []], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 1 + }, + { + "u64": 2 + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 100 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 100 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 2 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "u64": 99 + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + }, + { + "u64": 0 + }, + { + "u64": 100 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 100 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "vec": [ + { + "u64": 2 + }, + { + "u64": 99 + }, + { + "i128": { + "hi": 0, + "lo": 2000 + } + }, + { + "u64": 0 + }, + { + "u64": 100 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 100 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 2 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2000 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "track" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "track" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "track" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 2 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "track" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "analytics" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 100 + }, + { + "u64": 0 + }, + { + "u64": 200 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "analytics" + } + ], + "data": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 100 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 3000 + } + } + }, + { + "key": { + "symbol": "subscription_count" + }, + "val": { + "u32": 2 + } + } + ] + }, + { + "map": [ + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 200 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 100 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "subscription_count" + }, + "val": { + "u32": 0 + } + } + ] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} diff --git a/contracts/test_snapshots/revenue/tests/test_set_and_get_recognition_rule.1.json b/contracts/test_snapshots/revenue/tests/test_set_and_get_recognition_rule.1.json new file mode 100644 index 0000000..b47b2d0 --- /dev/null +++ b/contracts/test_snapshots/revenue/tests/test_set_and_get_recognition_rule.1.json @@ -0,0 +1,287 @@ +{ + "generators": { + "address": 1, + "nonce": 0 + }, + "auth": [[], []], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognitionRule" + }, + { + "u64": 42 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognitionRule" + }, + { + "u64": 42 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "method" + }, + "val": { + "vec": [ + { + "symbol": "StraightLine" + } + ] + } + }, + { + "key": { + "symbol": "plan_id" + }, + "val": { + "u64": 42 + } + }, + { + "key": { + "symbol": "recognition_period" + }, + "val": { + "u64": 86400 + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "set_rule" + } + ], + "data": { + "vec": [ + { + "u64": 42 + }, + { + "vec": [ + { + "symbol": "StraightLine" + } + ] + }, + { + "u64": 86400 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_rule" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "get_rule" + } + ], + "data": { + "u64": 42 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_rule" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "method" + }, + "val": { + "vec": [ + { + "symbol": "StraightLine" + } + ] + } + }, + { + "key": { + "symbol": "plan_id" + }, + "val": { + "u64": 42 + } + }, + { + "key": { + "symbol": "recognition_period" + }, + "val": { + "u64": 86400 + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} diff --git a/contracts/test_snapshots/revenue/tests/test_track_merchant_subscription_accumulates.1.json b/contracts/test_snapshots/revenue/tests/test_track_merchant_subscription_accumulates.1.json new file mode 100644 index 0000000..2dc8241 --- /dev/null +++ b/contracts/test_snapshots/revenue/tests/test_track_merchant_subscription_accumulates.1.json @@ -0,0 +1,834 @@ +{ + "generators": { + "address": 2, + "nonce": 0 + }, + "auth": [[], [], [], [], []], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 10 + }, + { + "u64": 20 + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 10 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 10 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 100 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 10 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 20 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 20 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 100 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 200 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 20 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 200 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "track" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 10 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "track" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "track" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 20 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "track" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "vec": [ + { + "u64": 10 + }, + { + "u64": 99 + }, + { + "i128": { + "hi": 0, + "lo": 100 + } + }, + { + "u64": 0 + }, + { + "u64": 100 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 100 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 10 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "vec": [ + { + "u64": 20 + }, + { + "u64": 99 + }, + { + "i128": { + "hi": 0, + "lo": 200 + } + }, + { + "u64": 0 + }, + { + "u64": 100 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "gen_schedule" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 100 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 200 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 20 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 200 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "analytics" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u64": 100 + }, + { + "u64": 0 + }, + { + "u64": 100 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "analytics" + } + ], + "data": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 100 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 300 + } + } + }, + { + "key": { + "symbol": "subscription_count" + }, + "val": { + "u32": 2 + } + } + ] + } + ] + } + } + } + }, + "failed_call": false + } + ] +} diff --git a/contracts/test_snapshots/test/test_admin_override_bypass.1.json b/contracts/test_snapshots/test/test_admin_override_bypass.1.json new file mode 100644 index 0000000..988c14e --- /dev/null +++ b/contracts/test_snapshots/test/test_admin_override_bypass.1.json @@ -0,0 +1,1272 @@ +{ + "generators": { + "address": 5, + "nonce": 0 + }, + "auth": [ + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_plan", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "Basic" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_rate_limit", + "args": [ + { + "string": "create_plan" + }, + { + "u64": 100 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_plan", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "string": "Admin Plan A" + }, + { + "i128": { + "hi": 0, + "lo": 1 + } + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_plan", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "string": "Admin Plan B" + }, + { + "i128": { + "hi": 0, + "lo": 2 + } + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantPlans" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantPlans" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 2 + }, + { + "u64": 3 + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantPlans" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantPlans" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 1 + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Plan" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Plan" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Basic" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "subscriber_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Plan" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Plan" + }, + { + "u64": 2 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 2 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Admin Plan A" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1 + } + } + }, + { + "key": { + "symbol": "subscriber_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Plan" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Plan" + }, + { + "u64": 3 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 3 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Admin Plan B" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": { + "hi": 0, + "lo": 2 + } + } + }, + { + "key": { + "symbol": "subscriber_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "PlanCount" + } + ] + }, + "val": { + "u64": 3 + } + }, + { + "key": { + "vec": [ + { + "symbol": "RateLimit" + }, + { + "string": "create_plan" + } + ] + }, + "val": { + "u64": 100 + } + }, + { + "key": { + "vec": [ + { + "symbol": "SubscriptionCount" + } + ] + }, + "val": { + "u64": 0 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "initialize" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "create_plan" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "Basic" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_plan" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "set_rate_limit" + } + ], + "data": { + "vec": [ + { + "string": "create_plan" + }, + { + "u64": 100 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_rate_limit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "create_plan" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "string": "Admin Plan A" + }, + { + "i128": { + "hi": 0, + "lo": 1 + } + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_plan" + } + ], + "data": { + "u64": 2 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "create_plan" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "string": "Admin Plan B" + }, + { + "i128": { + "hi": 0, + "lo": 2 + } + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_plan" + } + ], + "data": { + "u64": 3 + } + } + } + }, + "failed_call": false + } + ] +} diff --git a/contracts/test_snapshots/test/test_auto_resume.1.json b/contracts/test_snapshots/test/test_auto_resume.1.json index 69d9472..ee062a5 100644 --- a/contracts/test_snapshots/test/test_auto_resume.1.json +++ b/contracts/test_snapshots/test/test_auto_resume.1.json @@ -141,6 +141,54 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "DeferredRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "DeferredRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -190,6 +238,55 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 1 + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -315,6 +412,167 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognisedRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognisedRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 5356800 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 2764800 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -352,6 +610,14 @@ "durability": "persistent", "val": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 1 + } + }, { "key": { "symbol": "id" @@ -439,6 +705,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 100000 + } + }, { "key": { "symbol": "total_paid" @@ -1106,6 +1380,14 @@ ], "data": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -1193,6 +1475,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" @@ -1254,6 +1544,14 @@ ], "data": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -1341,6 +1639,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" @@ -1445,6 +1751,45 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "subscription_charged" + }, + { + "u64": 1 + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "u64": 100000 + }, + { + "u64": 2764800 + } + ] + } + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -1509,6 +1854,14 @@ ], "data": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 1 + } + }, { "key": { "symbol": "id" @@ -1596,6 +1949,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 100000 + } + }, { "key": { "symbol": "total_paid" diff --git a/contracts/test_snapshots/test/test_cancel_subscription.1.json b/contracts/test_snapshots/test/test_cancel_subscription.1.json index e9d09cf..ac99df5 100644 --- a/contracts/test_snapshots/test/test_cancel_subscription.1.json +++ b/contracts/test_snapshots/test/test_cancel_subscription.1.json @@ -329,6 +329,14 @@ "durability": "persistent", "val": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -416,6 +424,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" @@ -1014,6 +1030,14 @@ ], "data": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -1101,6 +1125,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" diff --git a/contracts/test_snapshots/test/test_charge_paused_subscription.1.json b/contracts/test_snapshots/test/test_charge_paused_subscription.1.json index 88fb6d0..6f901a3 100644 --- a/contracts/test_snapshots/test/test_charge_paused_subscription.1.json +++ b/contracts/test_snapshots/test/test_charge_paused_subscription.1.json @@ -328,6 +328,14 @@ "durability": "persistent", "val": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -415,6 +423,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" @@ -1044,7 +1060,7 @@ "data": { "vec": [ { - "string": "caught panic 'Subscription not active' from contract function 'Symbol(obj#231)'" + "string": "caught panic 'Subscription not active' from contract function 'Symbol(obj#277)'" }, { "u64": 1 diff --git a/contracts/test_snapshots/test/test_charge_subscription_not_due.1.json b/contracts/test_snapshots/test/test_charge_subscription_not_due.1.json index 40921dc..4fb5166 100644 --- a/contracts/test_snapshots/test/test_charge_subscription_not_due.1.json +++ b/contracts/test_snapshots/test/test_charge_subscription_not_due.1.json @@ -306,6 +306,14 @@ "durability": "persistent", "val": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -393,6 +401,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" @@ -902,7 +918,7 @@ "data": { "vec": [ { - "string": "caught panic 'Payment not yet due' from contract function 'Symbol(obj#169)'" + "string": "caught panic 'Payment not yet due' from contract function 'Symbol(obj#185)'" }, { "u64": 1 diff --git a/contracts/test_snapshots/test/test_create_plan_and_subscribe.1.json b/contracts/test_snapshots/test/test_create_plan_and_subscribe.1.json index c25ec6c..65eee24 100644 --- a/contracts/test_snapshots/test/test_create_plan_and_subscribe.1.json +++ b/contracts/test_snapshots/test/test_create_plan_and_subscribe.1.json @@ -309,6 +309,14 @@ "durability": "persistent", "val": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -396,6 +404,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" @@ -1051,6 +1067,14 @@ ], "data": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -1138,6 +1162,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" diff --git a/contracts/test_snapshots/test/test_double_subscribe.1.json b/contracts/test_snapshots/test/test_double_subscribe.1.json index 2e95172..1c1d149 100644 --- a/contracts/test_snapshots/test/test_double_subscribe.1.json +++ b/contracts/test_snapshots/test/test_double_subscribe.1.json @@ -306,6 +306,14 @@ "durability": "persistent", "val": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -393,6 +401,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" diff --git a/contracts/test_snapshots/test/test_non_subscriber_cannot_cancel.1.json b/contracts/test_snapshots/test/test_non_subscriber_cannot_cancel.1.json index 3facf9b..a151522 100644 --- a/contracts/test_snapshots/test/test_non_subscriber_cannot_cancel.1.json +++ b/contracts/test_snapshots/test/test_non_subscriber_cannot_cancel.1.json @@ -306,6 +306,14 @@ "durability": "persistent", "val": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -393,6 +401,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" @@ -909,7 +925,7 @@ "data": { "vec": [ { - "string": "caught panic 'Only subscriber can cancel' from contract function 'Symbol(obj#171)'" + "string": "caught panic 'Only subscriber can cancel' from contract function 'Symbol(obj#187)'" }, { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" diff --git a/contracts/test_snapshots/test/test_pause_and_resume.1.json b/contracts/test_snapshots/test/test_pause_and_resume.1.json index b730c01..b0c90e5 100644 --- a/contracts/test_snapshots/test/test_pause_and_resume.1.json +++ b/contracts/test_snapshots/test/test_pause_and_resume.1.json @@ -352,6 +352,14 @@ "durability": "persistent", "val": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -439,6 +447,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" @@ -1016,6 +1032,14 @@ ], "data": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -1103,6 +1127,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" @@ -1251,6 +1283,14 @@ ], "data": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -1338,6 +1378,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" @@ -1476,6 +1524,14 @@ ], "data": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -1563,6 +1619,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" diff --git a/contracts/test_snapshots/test/test_pause_by_subscriber_limit_enforced.1.json b/contracts/test_snapshots/test/test_pause_by_subscriber_limit_enforced.1.json index 8314d67..9da6079 100644 --- a/contracts/test_snapshots/test/test_pause_by_subscriber_limit_enforced.1.json +++ b/contracts/test_snapshots/test/test_pause_by_subscriber_limit_enforced.1.json @@ -306,6 +306,14 @@ "durability": "persistent", "val": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -393,6 +401,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" @@ -912,7 +928,7 @@ "data": { "vec": [ { - "string": "caught panic 'Pause duration exceeds limit' from contract function 'Symbol(obj#169)'" + "string": "caught panic 'Pause duration exceeds limit' from contract function 'Symbol(obj#185)'" }, { "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" diff --git a/contracts/test_snapshots/test/test_plan_deactivation_existing_subscribers_unaffected.1.json b/contracts/test_snapshots/test/test_plan_deactivation_existing_subscribers_unaffected.1.json index 8194c7f..0f3b396 100644 --- a/contracts/test_snapshots/test/test_plan_deactivation_existing_subscribers_unaffected.1.json +++ b/contracts/test_snapshots/test/test_plan_deactivation_existing_subscribers_unaffected.1.json @@ -351,6 +351,14 @@ "durability": "persistent", "val": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -438,6 +446,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" @@ -1285,6 +1301,14 @@ ], "data": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, { "key": { "symbol": "id" @@ -1372,6 +1396,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, { "key": { "symbol": "total_paid" diff --git a/contracts/test_snapshots/test/test_rate_limit_enforced_for_subscribe.1.json b/contracts/test_snapshots/test/test_rate_limit_enforced_for_subscribe.1.json new file mode 100644 index 0000000..d391b05 --- /dev/null +++ b/contracts/test_snapshots/test/test_rate_limit_enforced_for_subscribe.1.json @@ -0,0 +1,1214 @@ +{ + "generators": { + "address": 5, + "nonce": 0 + }, + "auth": [ + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_plan", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "Basic" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "set_rate_limit", + "args": [ + { + "string": "subscribe" + }, + { + "u64": 100 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "u64": 1 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantPlans" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantPlans" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 1 + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Plan" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Plan" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Basic" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "subscriber_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "last_charged_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "next_charge_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "pause_duration" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "paused_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "plan_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "refund_requested_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "started_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + }, + { + "key": { + "symbol": "subscriber" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "total_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "UserSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "UserSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 1 + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "LastCall" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "subscribe" + } + ] + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "PlanCount" + } + ] + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "RateLimit" + }, + { + "string": "subscribe" + } + ] + }, + "val": { + "u64": 100 + } + }, + { + "key": { + "vec": [ + { + "symbol": "SubscriptionCount" + } + ] + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "initialize" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "create_plan" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "Basic" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_plan" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "set_rate_limit" + } + ], + "data": { + "vec": [ + { + "string": "subscribe" + }, + { + "u64": 100 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "set_rate_limit" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "rate_limit_violation" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ], + "data": { + "vec": [ + { + "string": "subscribe" + }, + { + "u64": 0 + }, + { + "u64": 0 + }, + { + "u64": 100 + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "log" + } + ], + "data": { + "vec": [ + { + "string": "caught panic 'Rate limited: please wait before calling this function again' from contract function 'Symbol(subscribe)'" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "caught error from function" + } + } + } + }, + "failed_call": true + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "vec": [ + { + "string": "contract call failed" + }, + { + "symbol": "subscribe" + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "u64": 1 + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "error" + }, + { + "error": { + "wasm_vm": "invalid_action" + } + } + ], + "data": { + "string": "escalating error to panic" + } + } + } + }, + "failed_call": false + } + ] +} diff --git a/contracts/test_snapshots/test/test_refund_flow.1.json b/contracts/test_snapshots/test/test_refund_flow.1.json index f7a7d25..e39c75a 100644 --- a/contracts/test_snapshots/test/test_refund_flow.1.json +++ b/contracts/test_snapshots/test/test_refund_flow.1.json @@ -160,6 +160,54 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "DeferredRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "DeferredRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -209,6 +257,55 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 1 + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -334,6 +431,167 @@ 4095 ] ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognisedRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "RecognisedRevenue" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Schedule" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "entries" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "is_recognised" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "period_end" + }, + "val": { + "u64": 5270400 + } + }, + { + "key": { + "symbol": "period_start" + }, + "val": { + "u64": 2678400 + } + }, + { + "key": { + "symbol": "recognised_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "subscription_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "total_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], [ { "contract_data": { @@ -371,6 +629,14 @@ "durability": "persistent", "val": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 1 + } + }, { "key": { "symbol": "id" @@ -458,6 +724,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 100000 + } + }, { "key": { "symbol": "total_paid" @@ -1111,6 +1385,45 @@ }, "failed_call": false }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "subscription_charged" + }, + { + "u64": 1 + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "u64": 100000 + }, + { + "u64": 2678400 + } + ] + } + } + } + }, + "failed_call": false + }, { "event": { "ext": "v0", @@ -1175,6 +1488,14 @@ ], "data": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 1 + } + }, { "key": { "symbol": "id" @@ -1262,6 +1583,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 100000 + } + }, { "key": { "symbol": "total_paid" @@ -1413,6 +1742,14 @@ ], "data": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 1 + } + }, { "key": { "symbol": "id" @@ -1500,6 +1837,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 100000 + } + }, { "key": { "symbol": "total_paid" @@ -1641,6 +1986,14 @@ ], "data": { "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 1 + } + }, { "key": { "symbol": "id" @@ -1728,6 +2081,14 @@ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" } }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 100000 + } + }, { "key": { "symbol": "total_paid" diff --git a/contracts/test_snapshots/test/test_subscription_transfer_flow.1.json b/contracts/test_snapshots/test/test_subscription_transfer_flow.1.json new file mode 100644 index 0000000..d53e3de --- /dev/null +++ b/contracts/test_snapshots/test/test_subscription_transfer_flow.1.json @@ -0,0 +1,1472 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "create_plan", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "Basic" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "subscribe", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "u64": 1 + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "request_transfer", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "accept_transfer", + "args": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [] + ], + "ledger": { + "protocol_version": 21, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantPlans" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "MerchantPlans" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 1 + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Plan" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Plan" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "active" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "interval" + }, + "val": { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + }, + { + "key": { + "symbol": "merchant" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "Basic" + } + }, + { + "key": { + "symbol": "price" + }, + "val": { + "i128": { + "hi": 0, + "lo": 500 + } + } + }, + { + "key": { + "symbol": "subscriber_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "token" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "Subscription" + }, + { + "u64": 1 + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "last_charged_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "next_charge_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "pause_duration" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "paused_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "plan_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "refund_requested_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "started_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + }, + { + "key": { + "symbol": "subscriber" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "total_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "UserSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "UserSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "UserSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "UserSubscriptions" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u64": 1 + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "PlanCount" + } + ] + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "SubscriptionCount" + } + ] + }, + "val": { + "u64": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "initialize" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "initialize" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "create_plan" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "string": "Basic" + }, + { + "i128": { + "hi": 0, + "lo": 500 + } + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "vec": [ + { + "symbol": "Monthly" + } + ] + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "create_plan" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "subscribe" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "request_transfer" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "transfer_requested" + }, + { + "u64": 1 + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "request_transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "accept_transfer" + } + ], + "data": { + "vec": [ + { + "u64": 1 + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "string": "transfer_accepted" + }, + { + "u64": 1 + } + ], + "data": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "accept_transfer" + } + ], + "data": "void" + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "u64": 1 + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_subscription" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "charge_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "last_charged_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "next_charge_at" + }, + "val": { + "u64": 2592000 + } + }, + { + "key": { + "symbol": "pause_duration" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "paused_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "plan_id" + }, + "val": { + "u64": 1 + } + }, + { + "key": { + "symbol": "refund_requested_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "started_at" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + }, + { + "key": { + "symbol": "subscriber" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "total_gas_spent" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "total_paid" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + ] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "get_user_subscriptions" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_user_subscriptions" + } + ], + "data": { + "vec": [] + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": null, + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_call" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "symbol": "get_user_subscriptions" + } + ], + "data": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + } + } + }, + "failed_call": false + }, + { + "event": { + "ext": "v0", + "contract_id": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "diagnostic", + "body": { + "v0": { + "topics": [ + { + "symbol": "fn_return" + }, + { + "symbol": "get_user_subscriptions" + } + ], + "data": { + "vec": [ + { + "u64": 1 + } + ] + } + } + } + }, + "failed_call": false + } + ] +} diff --git a/contracts/types/src/lib.rs b/contracts/types/src/lib.rs index f93c984..2867f6e 100644 --- a/contracts/types/src/lib.rs +++ b/contracts/types/src/lib.rs @@ -134,4 +134,16 @@ pub enum StorageKey { /// Proxy pointer to the state storage contract. ProxyStorage, + + // ── Revenue recognition (added with revenue module) ── + /// RevenueRecognitionRule keyed by plan_id. + RevenueRecognitionRule(u64), + /// RevenueSchedule keyed by subscription_id. + RevenueSchedule(u64), + /// Cumulative deferred revenue balance for a merchant. + RevenueDeferredBalance(Address), + /// Cumulative recognised revenue balance for a merchant. + RevenueRecognisedBalance(Address), + /// List of subscription IDs tracked for a merchant (for analytics). + RevenueMerchantSubscriptions(Address), } diff --git a/src/navigation/AppNavigator.tsx b/src/navigation/AppNavigator.tsx index 9fd1ca0..b61f0e5 100644 --- a/src/navigation/AppNavigator.tsx +++ b/src/navigation/AppNavigator.tsx @@ -21,6 +21,7 @@ import AdminDashboardScreen from '../screens/AdminDashboardScreen'; import { SegmentManagementScreen } from '../screens/SegmentManagementScreen'; import { SegmentDetailScreen } from '../screens/SegmentDetailScreen'; import { GamificationScreen } from '../screens/GamificationScreen'; +import RevenueReportScreen from '../screens/RevenueReportScreen'; import { colors } from '../utils/constants'; import { RootStackParamList, TabParamList } from './types'; @@ -171,6 +172,16 @@ const TabNavigator = () => ( ), }} /> + ( + 💰 + ), + }} + /> = { + month: 30 * MS_PER_DAY, + quarter: 90 * MS_PER_DAY, + year: 365 * MS_PER_DAY, +}; + +const BUCKET_MS: Record = { + month: 7 * MS_PER_DAY, // weekly buckets + quarter: 30 * MS_PER_DAY, // monthly buckets + year: 30 * MS_PER_DAY, // monthly buckets +}; + +const BUCKET_LABELS: Record = { + month: ['W1', 'W2', 'W3', 'W4', 'W5'], + quarter: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + year: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], +}; + +const RevenueReportScreen: React.FC = () => { + const { subscriptions } = useSubscriptionStore(); + const { + rules, + schedules, + deferredRevenue, + setRecognitionRule, + removeRecognitionRule, + generateRevenueSchedule, + getRevenueAnalyticsByPeriod, + } = useAccountingStore(); + + const [periodRange, setPeriodRange] = useState('month'); + const [configSubId, setConfigSubId] = useState(null); + + // ── Revenue recognition snapshots ───────────────────────────────────────── + // Computed directly from state slices — no store action calls inside memos. + + const recognitionData = useMemo(() => { + const now = Date.now(); + return subscriptions + .filter((s) => s.isActive) + .map((s) => { + const schedule = schedules[s.id]; + const { recognised, deferred } = schedule + ? splitRecognisedDeferred(schedule, now) + : { recognised: 0, deferred: 0 }; + return { + id: s.id, + name: s.name, + recognised, + deferred, + total: recognised + deferred, + method: rules[s.id]?.method ?? ('straight-line' as RecognitionMethod), + }; + }); + }, [subscriptions, schedules, rules]); + + const totalRecognised = useMemo( + () => recognitionData.reduce((sum, d) => sum + d.recognised, 0), + [recognitionData] + ); + + // Read deferred balance directly from state — always reactive. + const totalDeferred = deferredRevenue['default'] ?? 0; + + // ── Analytics chart data ────────────────────────────────────────────────── + + const chartData = useMemo(() => { + const now = Date.now(); + const from = now - PERIOD_RANGE_MS[periodRange]; + const bucketMs = BUCKET_MS[periodRange]; + const analytics = getRevenueAnalyticsByPeriod(bucketMs, from, now); + return analytics.map((bucket, i) => ({ + label: BUCKET_LABELS[periodRange][i % BUCKET_LABELS[periodRange].length], + amount: bucket.recognisedAmount, + count: bucket.subscriptionCount, + })); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [periodRange, schedules, getRevenueAnalyticsByPeriod]); + + const maxAmount = Math.max(...chartData.map((d) => d.amount), 1); + const barWidth = Math.max(4, (CHART_WIDTH - 40) / Math.max(chartData.length, 1) - 6); + + // ── Config helpers ──────────────────────────────────────────────────────── + + const handleSimulateCharge = useCallback( + (subId: string) => { + const sub = subscriptions.find((s) => s.id === subId); + if (!sub) return; + generateRevenueSchedule(sub.id, sub.price, Date.now(), sub.billingCycle); + Alert.alert('Charge simulated', `Revenue schedule generated for "${sub.name}".`); + }, + [subscriptions, generateRevenueSchedule] + ); + + const handleToggleMethod = useCallback( + (subId: string, current: RecognitionMethod) => { + const next: RecognitionMethod = current === 'straight-line' ? 'usage-based' : 'straight-line'; + const sub = subscriptions.find((s) => s.id === subId); + if (!sub) return; + const intervalMs = billingCycleToMs(sub.billingCycle); + setRecognitionRule({ + subscriptionId: subId, + method: next, + recognitionPeriodMs: intervalMs, + }); + }, + [subscriptions, setRecognitionRule] + ); + + const handleRemoveRule = useCallback( + (subId: string) => { + removeRecognitionRule(subId); + if (configSubId === subId) setConfigSubId(null); + }, + [removeRecognitionRule, configSubId] + ); + + // ── Render ──────────────────────────────────────────────────────────────── + + if (!subscriptions.length) { + return ( + + + 💰 + No Revenue Data + Add subscriptions to track revenue recognition. + + + ); + } + + return ( + + + {/* Header */} + + Revenue Report + Recognition & deferred revenue + + + {/* Summary cards */} + + + Recognised + + ${totalRecognised.toFixed(2)} + + + + Deferred + + ${totalDeferred.toFixed(2)} + + + + + {/* Period selector */} + + {(['month', 'quarter', 'year'] as PeriodRange[]).map((p) => ( + setPeriodRange(p)}> + + {p.charAt(0).toUpperCase() + p.slice(1)} + + + ))} + + + {/* Revenue chart */} + + Recognised Revenue by Period + {chartData.every((d) => d.amount === 0) ? ( + + No recognised revenue yet. Simulate a charge below. + + ) : ( + + + + {chartData.map((data, index) => { + const barHeight = Math.max(2, (data.amount / maxAmount) * (CHART_HEIGHT - 60)); + const x = 35 + index * (barWidth + 6); + const y = CHART_HEIGHT - 30 - barHeight; + return ( + + + + {data.label} + + {data.amount > 0 && ( + + ${data.amount.toFixed(0)} + + )} + + ); + })} + + )} + + + {/* Per-subscription recognition table */} + + Subscription Recognition + {recognitionData.map((item) => ( + + + + {item.name} + + {item.method} + + + ${item.recognised.toFixed(2)} + ↓ ${item.deferred.toFixed(2)} + + + ))} + + + {/* Revenue configuration */} + + Revenue Configuration + + Configure recognition method per subscription. Tap a row to expand. + + {subscriptions + .filter((s) => s.isActive) + .map((sub) => { + const rule = rules[sub.id]; + const method: RecognitionMethod = rule?.method ?? 'straight-line'; + const isExpanded = configSubId === sub.id; + + return ( + + setConfigSubId(isExpanded ? null : sub.id)}> + + {sub.name} + + {isExpanded ? '▲' : '▼'} + + + {isExpanded && ( + + {/* Method toggle */} + + Usage-based + handleToggleMethod(sub.id, method)} + trackColor={{ false: colors.border, true: colors.primary }} + thumbColor={colors.surface} + /> + + + {method === 'straight-line' + ? 'Revenue spread evenly across the billing period (ASC 606 default).' + : 'Revenue deferred until actual usage is reported by the merchant.'} + + + {/* Simulate charge */} + handleSimulateCharge(sub.id)}> + Simulate Charge + + + {/* Remove rule */} + {rule && ( + handleRemoveRule(sub.id)}> + Reset to Default + + )} + + )} + + ); + })} + + + + ); +}; + +// ── Styles ──────────────────────────────────────────────────────────────────── + +const styles = StyleSheet.create({ + container: { flex: 1, backgroundColor: colors.background }, + scrollView: { flex: 1 }, + header: { padding: spacing.lg, paddingBottom: spacing.md }, + title: { ...typography.h1, color: colors.text, marginBottom: spacing.xs }, + subtitle: { ...typography.body, color: colors.textSecondary }, + + summaryRow: { + flexDirection: 'row', + paddingHorizontal: spacing.lg, + marginBottom: spacing.md, + gap: spacing.md, + }, + summaryCard: { flex: 1, alignItems: 'center' }, + summaryLabel: { ...typography.caption, color: colors.textSecondary, marginBottom: spacing.xs }, + summaryValue: { ...typography.h2, fontWeight: '700' }, + + periodRow: { + flexDirection: 'row', + paddingHorizontal: spacing.lg, + marginBottom: spacing.md, + gap: spacing.sm, + }, + periodBtn: { + flex: 1, + paddingVertical: spacing.sm, + borderRadius: borderRadius.md, + backgroundColor: colors.surface, + borderWidth: 1, + borderColor: colors.border, + alignItems: 'center', + }, + periodBtnActive: { backgroundColor: colors.primary, borderColor: colors.primary }, + periodBtnText: { ...typography.body, color: colors.text }, + periodBtnTextActive: { color: colors.text, fontWeight: '600' }, + + chartCard: { marginHorizontal: spacing.lg, marginBottom: spacing.md }, + chartTitle: { ...typography.h3, color: colors.text, marginBottom: spacing.md }, + noDataText: { + ...typography.body, + color: colors.textSecondary, + textAlign: 'center', + paddingVertical: spacing.lg, + }, + + tableCard: { marginHorizontal: spacing.lg, marginBottom: spacing.md }, + tableRow: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + paddingVertical: spacing.sm, + borderBottomWidth: 1, + borderBottomColor: colors.border, + }, + tableLeft: { flex: 1, marginRight: spacing.md }, + tableName: { ...typography.body, color: colors.text, fontWeight: '600' }, + tableMethod: { ...typography.caption, color: colors.textSecondary, marginTop: 2 }, + tableRight: { alignItems: 'flex-end' }, + tableRecognised: { ...typography.body, color: colors.primary, fontWeight: '600' }, + tableDeferred: { ...typography.caption, color: '#FF9800' }, + + configCard: { marginHorizontal: spacing.lg, marginBottom: spacing.xl }, + configHint: { + ...typography.caption, + color: colors.textSecondary, + marginBottom: spacing.md, + }, + configRow: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + paddingVertical: spacing.sm, + borderBottomWidth: 1, + borderBottomColor: colors.border, + }, + configName: { ...typography.body, color: colors.text, flex: 1 }, + configChevron: { ...typography.body, color: colors.textSecondary, marginLeft: spacing.sm }, + configDetail: { + backgroundColor: colors.background, + borderRadius: borderRadius.md, + padding: spacing.md, + marginBottom: spacing.sm, + }, + configDetailRow: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: spacing.sm, + }, + configDetailLabel: { ...typography.body, color: colors.text }, + configMethodDesc: { + ...typography.caption, + color: colors.textSecondary, + marginBottom: spacing.md, + }, + simulateBtn: { + backgroundColor: colors.primary, + borderRadius: borderRadius.md, + paddingVertical: spacing.sm, + alignItems: 'center', + marginBottom: spacing.sm, + }, + simulateBtnText: { ...typography.body, color: colors.text, fontWeight: '600' }, + removeBtn: { + borderWidth: 1, + borderColor: colors.border, + borderRadius: borderRadius.md, + paddingVertical: spacing.sm, + alignItems: 'center', + }, + removeBtnText: { ...typography.body, color: colors.textSecondary }, + + emptyState: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: spacing.xl }, + emptyIcon: { fontSize: 64, marginBottom: spacing.md }, + emptyTitle: { ...typography.h2, color: colors.text, marginBottom: spacing.sm }, + emptyText: { ...typography.body, color: colors.textSecondary, textAlign: 'center' }, +}); + +export default RevenueReportScreen; diff --git a/src/store/__tests__/accountingStore.test.ts b/src/store/__tests__/accountingStore.test.ts new file mode 100644 index 0000000..64284ed --- /dev/null +++ b/src/store/__tests__/accountingStore.test.ts @@ -0,0 +1,377 @@ +/** + * Tests for accountingStore – revenue recognition calculations. + * + * Covers: + * - buildStraightLineSchedule: even split, remainder, single period + * - buildUsageBasedSchedule: single deferred entry + * - splitRecognisedDeferred: all deferred, all recognised, partial, multi-period + * - billingCycleToMs: all billing cycles + * - Store actions: setRecognitionRule, generateRevenueSchedule, recognizeRevenue, + * getDeferredRevenue, getRevenueSchedule, getRevenueAnalyticsByPeriod + * - Edge cases: cancellation mid-period, contract modification (rule update), + * multi-element arrangements, unknown subscription + */ + +import { describe, it, expect, beforeEach } from '@jest/globals'; +import { + buildStraightLineSchedule, + buildUsageBasedSchedule, + splitRecognisedDeferred, + billingCycleToMs, + useAccountingStore, +} from '../accountingStore'; +import { BillingCycle } from '../../types/subscription'; + +// ── Mock AsyncStorage so persist middleware doesn't fail ───────────────────── +jest.mock('@react-native-async-storage/async-storage', () => ({ + setItem: jest.fn(() => Promise.resolve()), + getItem: jest.fn(() => Promise.resolve(null)), + removeItem: jest.fn(() => Promise.resolve()), +})); + +// ── Helpers ─────────────────────────────────────────────────────────────────── + +function resetStore() { + useAccountingStore.getState().reset(); +} + +const MS_PER_DAY = 24 * 60 * 60 * 1000; + +// ═════════════════════════════════════════════════════════════════════════════ +// Pure helpers +// ═════════════════════════════════════════════════════════════════════════════ + +describe('billingCycleToMs', () => { + it('weekly → 7 days', () => { + expect(billingCycleToMs(BillingCycle.WEEKLY)).toBe(7 * MS_PER_DAY); + }); + + it('monthly → ~30 days', () => { + const ms = billingCycleToMs(BillingCycle.MONTHLY); + // Allow ±1 day tolerance for rounding. + expect(ms).toBeGreaterThanOrEqual(29 * MS_PER_DAY); + expect(ms).toBeLessThanOrEqual(31 * MS_PER_DAY); + }); + + it('yearly → 365 days', () => { + expect(billingCycleToMs(BillingCycle.YEARLY)).toBe(365 * MS_PER_DAY); + }); +}); + +// ── buildStraightLineSchedule ───────────────────────────────────────────────── + +describe('buildStraightLineSchedule', () => { + it('splits evenly when divisible', () => { + const schedule = buildStraightLineSchedule('sub-1', 120, 0, 30 * MS_PER_DAY, 4); + expect(schedule.entries).toHaveLength(4); + schedule.entries.forEach((e) => expect(e.recognisedAmount).toBe(30)); + }); + + it('puts remainder in last entry', () => { + // 100 / 3 = 33.33 → 33 + 33 + 34 + const schedule = buildStraightLineSchedule('sub-1', 100, 0, 30 * MS_PER_DAY, 3); + const amounts = schedule.entries.map((e) => e.recognisedAmount); + expect(amounts[0]).toBe(33); + expect(amounts[1]).toBe(33); + expect(amounts[2]).toBeCloseTo(34, 1); + }); + + it('single period covers full interval', () => { + const start = 1_000_000; + const period = 30 * MS_PER_DAY; + const schedule = buildStraightLineSchedule('sub-1', 500, start, period, 1); + expect(schedule.entries).toHaveLength(1); + expect(schedule.entries[0].periodStart).toBe(start); + expect(schedule.entries[0].periodEnd).toBe(start + period); + expect(schedule.entries[0].recognisedAmount).toBe(500); + }); + + it('entries are not yet recognised', () => { + const schedule = buildStraightLineSchedule('sub-1', 200, 0, MS_PER_DAY, 2); + schedule.entries.forEach((e) => expect(e.isRecognised).toBe(false)); + }); + + it('throws when numPeriods is 0', () => { + expect(() => buildStraightLineSchedule('sub-1', 100, 0, MS_PER_DAY, 0)).toThrow(); + }); + + it('throws when periodMs is 0', () => { + expect(() => buildStraightLineSchedule('sub-1', 100, 0, 0, 1)).toThrow(); + }); +}); + +// ── buildUsageBasedSchedule ─────────────────────────────────────────────────── + +describe('buildUsageBasedSchedule', () => { + it('creates a single deferred entry covering the full interval', () => { + const schedule = buildUsageBasedSchedule('sub-2', 800, 500, 30 * MS_PER_DAY); + expect(schedule.entries).toHaveLength(1); + const entry = schedule.entries[0]; + expect(entry.recognisedAmount).toBe(800); + expect(entry.periodStart).toBe(500); + expect(entry.periodEnd).toBe(500 + 30 * MS_PER_DAY); + expect(entry.isRecognised).toBe(false); + }); +}); + +// ── splitRecognisedDeferred ─────────────────────────────────────────────────── + +describe('splitRecognisedDeferred', () => { + it('all deferred before period starts', () => { + const schedule = buildStraightLineSchedule('s', 1000, 1000, 1000, 1); + const { recognised, deferred } = splitRecognisedDeferred(schedule, 500); + expect(recognised).toBe(0); + expect(deferred).toBe(1000); + }); + + it('all recognised after period ends', () => { + const schedule = buildStraightLineSchedule('s', 1000, 0, 1000, 1); + const { recognised, deferred } = splitRecognisedDeferred(schedule, 2000); + expect(recognised).toBe(1000); + expect(deferred).toBe(0); + }); + + it('50% recognised at midpoint', () => { + const schedule = buildStraightLineSchedule('s', 1000, 0, 1000, 1); + const { recognised, deferred } = splitRecognisedDeferred(schedule, 500); + expect(recognised).toBeCloseTo(500, 1); + expect(deferred).toBeCloseTo(500, 1); + }); + + it('multi-period partial recognition', () => { + // 1200 over 4 × 100ms periods. Query at t=250 → 2 full + 50% of 3rd. + const schedule = buildStraightLineSchedule('s', 1200, 0, 100, 4); + const { recognised, deferred } = splitRecognisedDeferred(schedule, 250); + // 300 + 300 + 150 = 750 recognised; 150 + 300 = 450 deferred + expect(recognised).toBeCloseTo(750, 1); + expect(deferred).toBeCloseTo(450, 1); + }); + + it('cancellation mid-period: partial recognition', () => { + // Cancelled at 30% through a 1000ms period. + const schedule = buildStraightLineSchedule('s', 1000, 0, 1000, 1); + const { recognised, deferred } = splitRecognisedDeferred(schedule, 300); + expect(recognised).toBeCloseTo(300, 1); + expect(deferred).toBeCloseTo(700, 1); + }); +}); + +// ═════════════════════════════════════════════════════════════════════════════ +// Store actions +// ═════════════════════════════════════════════════════════════════════════════ + +describe('useAccountingStore', () => { + beforeEach(() => resetStore()); + + // ── setRecognitionRule ──────────────────────────────────────────────────── + + it('setRecognitionRule persists a rule', () => { + useAccountingStore.getState().setRecognitionRule({ + subscriptionId: 'sub-1', + method: 'straight-line', + recognitionPeriodMs: 7 * MS_PER_DAY, + }); + expect(useAccountingStore.getState().rules['sub-1']).toBeDefined(); + expect(useAccountingStore.getState().rules['sub-1'].method).toBe('straight-line'); + }); + + it('setRecognitionRule can be updated (contract modification)', () => { + useAccountingStore.getState().setRecognitionRule({ + subscriptionId: 'sub-1', + method: 'straight-line', + recognitionPeriodMs: 7 * MS_PER_DAY, + }); + useAccountingStore.getState().setRecognitionRule({ + subscriptionId: 'sub-1', + method: 'usage-based', + recognitionPeriodMs: 7 * MS_PER_DAY, + }); + expect(useAccountingStore.getState().rules['sub-1'].method).toBe('usage-based'); + }); + + it('removeRecognitionRule deletes the rule', () => { + useAccountingStore.getState().setRecognitionRule({ + subscriptionId: 'sub-1', + method: 'straight-line', + recognitionPeriodMs: MS_PER_DAY, + }); + useAccountingStore.getState().removeRecognitionRule('sub-1'); + expect(useAccountingStore.getState().rules['sub-1']).toBeUndefined(); + }); + + // ── generateRevenueSchedule ─────────────────────────────────────────────── + + it('generateRevenueSchedule creates a schedule and defers revenue', () => { + const schedule = useAccountingStore + .getState() + .generateRevenueSchedule('sub-1', 100, Date.now(), BillingCycle.MONTHLY); + + expect(schedule.totalAmount).toBe(100); + expect(schedule.entries.length).toBeGreaterThan(0); + // All revenue starts deferred. + expect(useAccountingStore.getState().deferredRevenue['default']).toBe(100); + }); + + it('generateRevenueSchedule uses straight-line rule when set', () => { + const periodMs = 7 * MS_PER_DAY; + useAccountingStore.getState().setRecognitionRule({ + subscriptionId: 'sub-1', + method: 'straight-line', + recognitionPeriodMs: periodMs, + }); + const schedule = useAccountingStore + .getState() + .generateRevenueSchedule('sub-1', 280, 0, BillingCycle.MONTHLY); + // Monthly (~30 days) / 7-day period = ~4-5 entries. + expect(schedule.entries.length).toBeGreaterThanOrEqual(4); + }); + + it('generateRevenueSchedule uses usage-based rule when set', () => { + useAccountingStore.getState().setRecognitionRule({ + subscriptionId: 'sub-1', + method: 'usage-based', + recognitionPeriodMs: 30 * MS_PER_DAY, + }); + const schedule = useAccountingStore + .getState() + .generateRevenueSchedule('sub-1', 500, 0, BillingCycle.MONTHLY); + expect(schedule.entries).toHaveLength(1); + }); + + it('generateRevenueSchedule defaults to single straight-line period with no rule', () => { + const schedule = useAccountingStore + .getState() + .generateRevenueSchedule('sub-1', 200, 0, BillingCycle.MONTHLY); + expect(schedule.entries).toHaveLength(1); + expect(schedule.entries[0].recognisedAmount).toBe(200); + }); + + // ── recognizeRevenue ────────────────────────────────────────────────────── + + it('recognizeRevenue returns zeros for unknown subscription', () => { + const rec = useAccountingStore.getState().recognizeRevenue('unknown'); + expect(rec.recognisedRevenue).toBe(0); + expect(rec.deferredRevenue).toBe(0); + }); + + it('recognizeRevenue returns all deferred immediately after charge', () => { + const chargeDate = Date.now() - 1; // just in the past + useAccountingStore + .getState() + .generateRevenueSchedule('sub-1', 1000, chargeDate, BillingCycle.MONTHLY); + // Query at chargeDate + 1ms → almost nothing recognised yet. + const rec = useAccountingStore.getState().recognizeRevenue('sub-1', chargeDate + 1); + expect(rec.deferredRevenue).toBeGreaterThan(990); + }); + + it('recognizeRevenue returns all recognised after period ends', () => { + const chargeDate = 0; + const intervalMs = billingCycleToMs(BillingCycle.MONTHLY); + useAccountingStore + .getState() + .generateRevenueSchedule('sub-1', 1000, chargeDate, BillingCycle.MONTHLY); + // Query well after period ends. + const rec = useAccountingStore + .getState() + .recognizeRevenue('sub-1', chargeDate + intervalMs + 1); + expect(rec.recognisedRevenue).toBeCloseTo(1000, 1); + expect(rec.deferredRevenue).toBeCloseTo(0, 1); + }); + + // ── getDeferredRevenue ──────────────────────────────────────────────────── + + it('getDeferredRevenue returns 0 for unknown merchant', () => { + expect(useAccountingStore.getState().getDeferredRevenue('merchant-x')).toBe(0); + }); + + it('getDeferredRevenue accumulates across multiple charges', () => { + useAccountingStore + .getState() + .generateRevenueSchedule('sub-1', 100, 0, BillingCycle.MONTHLY, 'merchant-1'); + useAccountingStore + .getState() + .generateRevenueSchedule('sub-2', 200, 0, BillingCycle.MONTHLY, 'merchant-1'); + expect(useAccountingStore.getState().getDeferredRevenue('merchant-1')).toBe(300); + }); + + // ── getRevenueSchedule ──────────────────────────────────────────────────── + + it('getRevenueSchedule returns undefined for unknown subscription', () => { + expect(useAccountingStore.getState().getRevenueSchedule('ghost')).toBeUndefined(); + }); + + it('getRevenueSchedule returns the persisted schedule', () => { + useAccountingStore.getState().generateRevenueSchedule('sub-1', 500, 0, BillingCycle.MONTHLY); + const schedule = useAccountingStore.getState().getRevenueSchedule('sub-1'); + expect(schedule).toBeDefined(); + expect(schedule!.totalAmount).toBe(500); + }); + + // ── getRevenueAnalyticsByPeriod ─────────────────────────────────────────── + + it('getRevenueAnalyticsByPeriod returns empty buckets with no schedules', () => { + const now = Date.now(); + const analytics = useAccountingStore + .getState() + .getRevenueAnalyticsByPeriod(7 * MS_PER_DAY, now - 28 * MS_PER_DAY, now); + expect(analytics).toHaveLength(4); + analytics.forEach((b) => { + expect(b.recognisedAmount).toBe(0); + expect(b.subscriptionCount).toBe(0); + }); + }); + + it('getRevenueAnalyticsByPeriod accumulates amounts into correct buckets', () => { + const from = 0; + const bucketMs = 100; + // Two subscriptions charged at t=0 (bucket 0). + useAccountingStore.getState().generateRevenueSchedule('sub-1', 1000, 0, BillingCycle.MONTHLY); + useAccountingStore.getState().generateRevenueSchedule('sub-2', 2000, 0, BillingCycle.MONTHLY); + + const analytics = useAccountingStore + .getState() + .getRevenueAnalyticsByPeriod(bucketMs, from, from + 200); + + // Both schedules have their single entry starting at t=0 → bucket 0. + expect(analytics[0].recognisedAmount).toBe(3000); + expect(analytics[0].subscriptionCount).toBe(2); + }); + + it('getRevenueAnalyticsByPeriod throws on invalid periodMs', () => { + expect(() => useAccountingStore.getState().getRevenueAnalyticsByPeriod(0, 0, 1000)).toThrow(); + }); + + // ── Multi-element arrangement ───────────────────────────────────────────── + + it('multi-element: deferred balances accumulate per merchant', () => { + useAccountingStore + .getState() + .generateRevenueSchedule('sub-1', 500, 0, BillingCycle.MONTHLY, 'merchant-A'); + useAccountingStore + .getState() + .generateRevenueSchedule('sub-2', 300, 0, BillingCycle.MONTHLY, 'merchant-A'); + useAccountingStore + .getState() + .generateRevenueSchedule('sub-3', 200, 0, BillingCycle.MONTHLY, 'merchant-B'); + + expect(useAccountingStore.getState().getDeferredRevenue('merchant-A')).toBe(800); + expect(useAccountingStore.getState().getDeferredRevenue('merchant-B')).toBe(200); + }); + + // ── reset ───────────────────────────────────────────────────────────────── + + it('reset clears all state', () => { + useAccountingStore.getState().setRecognitionRule({ + subscriptionId: 'sub-1', + method: 'straight-line', + recognitionPeriodMs: MS_PER_DAY, + }); + useAccountingStore.getState().generateRevenueSchedule('sub-1', 100, 0, BillingCycle.MONTHLY); + + useAccountingStore.getState().reset(); + + expect(Object.keys(useAccountingStore.getState().rules)).toHaveLength(0); + expect(Object.keys(useAccountingStore.getState().schedules)).toHaveLength(0); + expect(useAccountingStore.getState().getDeferredRevenue()).toBe(0); + }); +}); diff --git a/src/store/accountingStore.ts b/src/store/accountingStore.ts new file mode 100644 index 0000000..2706cb6 --- /dev/null +++ b/src/store/accountingStore.ts @@ -0,0 +1,363 @@ +/** + * accountingStore – revenue recognition accounting state. + * + * Implements: + * - RevenueRecognitionRule (method + recognition_period) + * - Straight-line and usage-based recognition + * - Deferred revenue tracking + * - Revenue schedule generation + * - Multi-element arrangement accounting + * - Revenue analytics by period + */ + +import { create } from 'zustand'; +import { persist, createJSONStorage } from 'zustand/middleware'; +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { BillingCycle } from '../types/subscription'; + +// ── Domain types ────────────────────────────────────────────────────────────── + +export type RecognitionMethod = 'straight-line' | 'usage-based'; + +export interface RevenueRecognitionRule { + /** Subscription ID this rule applies to. */ + subscriptionId: string; + method: RecognitionMethod; + /** + * Length of one recognition period in milliseconds. + * e.g. 30 * 24 * 60 * 60 * 1000 for 30 days. + */ + recognitionPeriodMs: number; +} + +export interface RevenueScheduleEntry { + periodStart: number; // Unix ms + periodEnd: number; // Unix ms + recognisedAmount: number; // currency units + isRecognised: boolean; +} + +export interface RevenueSchedule { + subscriptionId: string; + totalAmount: number; + chargeDate: number; // Unix ms when the charge occurred + entries: RevenueScheduleEntry[]; +} + +export interface Recognition { + subscriptionId: string; + recognisedRevenue: number; + deferredRevenue: number; + asOf: number; // Unix ms +} + +export interface PeriodRevenue { + periodStart: number; // Unix ms + periodEnd: number; // Unix ms + recognisedAmount: number; + subscriptionCount: number; +} + +// ── Store state & actions ───────────────────────────────────────────────────── + +interface AccountingState { + /** Recognition rules keyed by subscriptionId. */ + rules: Record; + /** Revenue schedules keyed by subscriptionId. */ + schedules: Record; + /** Cumulative deferred revenue per merchantId (or 'default'). */ + deferredRevenue: Record; + /** Cumulative recognised revenue per merchantId (or 'default'). */ + recognisedRevenue: Record; + + // ── Actions ── + + /** Persist a recognition rule for a subscription. */ + setRecognitionRule: (rule: RevenueRecognitionRule) => void; + + /** Remove a recognition rule. */ + removeRecognitionRule: (subscriptionId: string) => void; + + /** + * Generate and persist a revenue schedule for a charge. + * @param subscriptionId Subscription being charged. + * @param totalAmount Amount charged (in currency units). + * @param chargeDate When the charge occurred (Unix ms). + * @param billingCycle Billing cycle of the subscription. + * @param merchantId Merchant receiving the revenue. + */ + generateRevenueSchedule: ( + subscriptionId: string, + totalAmount: number, + chargeDate: number, + billingCycle: BillingCycle, + merchantId?: string + ) => RevenueSchedule; + + /** + * Compute a recognition snapshot for a subscription as of `asOf` (defaults to now). + */ + recognizeRevenue: (subscriptionId: string, asOf?: number) => Recognition; + + /** Return the cumulative deferred revenue for a merchant. */ + getDeferredRevenue: (merchantId?: string) => number; + + /** Return the revenue schedule for a subscription (or undefined). */ + getRevenueSchedule: (subscriptionId: string) => RevenueSchedule | undefined; + + /** + * Compute per-period revenue analytics across all tracked subscriptions. + * @param periodMs Bucket size in milliseconds. + * @param from Range start (Unix ms). + * @param to Range end (Unix ms). + */ + getRevenueAnalyticsByPeriod: (periodMs: number, from: number, to: number) => PeriodRevenue[]; + + /** Flush all accounting data (useful for testing). */ + reset: () => void; +} + +// ── Pure helpers ────────────────────────────────────────────────────────────── + +/** Convert a BillingCycle to its duration in milliseconds. */ +export function billingCycleToMs(cycle: BillingCycle): number { + const MS_PER_DAY = 24 * 60 * 60 * 1000; + switch (cycle) { + case BillingCycle.WEEKLY: + return 7 * MS_PER_DAY; + case BillingCycle.MONTHLY: + // 30.44 average days per month + return Math.round(30.44 * MS_PER_DAY); + case BillingCycle.YEARLY: + return 365 * MS_PER_DAY; + default: + return 30 * MS_PER_DAY; + } +} + +/** + * Build a straight-line schedule: split `totalAmount` evenly across + * `numPeriods` consecutive periods of `periodMs` ms each. + * Any rounding remainder is added to the last entry. + */ +export function buildStraightLineSchedule( + subscriptionId: string, + totalAmount: number, + chargeDate: number, + periodMs: number, + numPeriods: number +): RevenueSchedule { + if (numPeriods <= 0) throw new Error('numPeriods must be > 0'); + if (periodMs <= 0) throw new Error('periodMs must be > 0'); + + const slice = Math.floor((totalAmount / numPeriods) * 100) / 100; + const remainder = Math.round((totalAmount - slice * numPeriods) * 100) / 100; + + const entries: RevenueScheduleEntry[] = Array.from({ length: numPeriods }, (_, i) => ({ + periodStart: chargeDate + i * periodMs, + periodEnd: chargeDate + (i + 1) * periodMs, + recognisedAmount: i === numPeriods - 1 ? slice + remainder : slice, + isRecognised: false, + })); + + return { subscriptionId, totalAmount, chargeDate, entries }; +} + +/** + * Build a usage-based schedule: a single entry covering the full interval. + * Revenue is deferred until the merchant reports actual usage. + */ +export function buildUsageBasedSchedule( + subscriptionId: string, + totalAmount: number, + chargeDate: number, + intervalMs: number +): RevenueSchedule { + return { + subscriptionId, + totalAmount, + chargeDate, + entries: [ + { + periodStart: chargeDate, + periodEnd: chargeDate + intervalMs, + recognisedAmount: totalAmount, + isRecognised: false, + }, + ], + }; +} + +/** + * Walk a schedule and return { recognised, deferred } split as of `now`. + * Partial periods are pro-rated linearly. + */ +export function splitRecognisedDeferred( + schedule: RevenueSchedule, + now: number +): { recognised: number; deferred: number } { + let recognised = 0; + let deferred = 0; + + for (const entry of schedule.entries) { + if (now >= entry.periodEnd) { + recognised += entry.recognisedAmount; + } else if (now >= entry.periodStart) { + const elapsed = now - entry.periodStart; + const duration = entry.periodEnd - entry.periodStart; + const partial = (entry.recognisedAmount * elapsed) / duration; + recognised += partial; + deferred += entry.recognisedAmount - partial; + } else { + deferred += entry.recognisedAmount; + } + } + + return { recognised, deferred }; +} + +// ── Store ───────────────────────────────────────────────────────────────────── + +const STORAGE_KEY = 'subtrackr-accounting'; +const DEFAULT_MERCHANT = 'default'; + +const initialState = { + rules: {} as Record, + schedules: {} as Record, + deferredRevenue: {} as Record, + recognisedRevenue: {} as Record, +}; + +export const useAccountingStore = create()( + persist( + (set, get) => ({ + ...initialState, + + setRecognitionRule: (rule) => { + set((state) => ({ + rules: { ...state.rules, [rule.subscriptionId]: rule }, + })); + }, + + removeRecognitionRule: (subscriptionId) => { + set((state) => { + const rules = { ...state.rules }; + delete rules[subscriptionId]; + return { rules }; + }); + }, + + generateRevenueSchedule: ( + subscriptionId, + totalAmount, + chargeDate, + billingCycle, + merchantId = DEFAULT_MERCHANT + ) => { + const rule = get().rules[subscriptionId]; + const intervalMs = billingCycleToMs(billingCycle); + + let schedule: RevenueSchedule; + + if (rule) { + const numPeriods = Math.max(1, Math.ceil(intervalMs / rule.recognitionPeriodMs)); + if (rule.method === 'straight-line') { + schedule = buildStraightLineSchedule( + subscriptionId, + totalAmount, + chargeDate, + rule.recognitionPeriodMs, + numPeriods + ); + } else { + schedule = buildUsageBasedSchedule(subscriptionId, totalAmount, chargeDate, intervalMs); + } + } else { + // Default: straight-line over the full interval as a single period. + schedule = buildStraightLineSchedule( + subscriptionId, + totalAmount, + chargeDate, + intervalMs, + 1 + ); + } + + set((state) => ({ + schedules: { ...state.schedules, [subscriptionId]: schedule }, + // All newly charged revenue starts as deferred. + deferredRevenue: { + ...state.deferredRevenue, + [merchantId]: (state.deferredRevenue[merchantId] ?? 0) + totalAmount, + }, + })); + + return schedule; + }, + + recognizeRevenue: (subscriptionId, asOf = Date.now()) => { + const schedule = get().schedules[subscriptionId]; + if (!schedule) { + return { + subscriptionId, + recognisedRevenue: 0, + deferredRevenue: 0, + asOf, + }; + } + const { recognised, deferred } = splitRecognisedDeferred(schedule, asOf); + return { + subscriptionId, + recognisedRevenue: recognised, + deferredRevenue: deferred, + asOf, + }; + }, + + getDeferredRevenue: (merchantId = DEFAULT_MERCHANT) => { + return get().deferredRevenue[merchantId] ?? 0; + }, + + getRevenueSchedule: (subscriptionId) => { + return get().schedules[subscriptionId]; + }, + + getRevenueAnalyticsByPeriod: (periodMs, from, to) => { + if (periodMs <= 0) throw new Error('periodMs must be > 0'); + if (to < from) throw new Error('to must be >= from'); + if (to === from) return []; + + const numBuckets = Math.ceil((to - from) / periodMs); + const buckets: PeriodRevenue[] = Array.from({ length: numBuckets }, (_, i) => ({ + periodStart: from + i * periodMs, + periodEnd: from + (i + 1) * periodMs, + recognisedAmount: 0, + subscriptionCount: 0, + })); + + for (const schedule of Object.values(get().schedules)) { + let contributed = false; + for (const entry of schedule.entries) { + if (entry.periodStart < from || entry.periodStart >= to) continue; + const bucketIdx = Math.floor((entry.periodStart - from) / periodMs); + if (bucketIdx >= 0 && bucketIdx < numBuckets) { + buckets[bucketIdx].recognisedAmount += entry.recognisedAmount; + if (!contributed) { + buckets[bucketIdx].subscriptionCount += 1; + contributed = true; + } + } + } + } + + return buckets; + }, + + reset: () => set(initialState), + }), + { + name: STORAGE_KEY, + storage: createJSONStorage(() => AsyncStorage), + } + ) +); diff --git a/src/store/index.ts b/src/store/index.ts index c0f2289..0d789e1 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -3,3 +3,4 @@ export { useTransactionQueueStore } from './transactionQueueStore'; export { useWalletStore } from './walletStore'; export { useNetworkStore } from './networkStore'; export { useCommunityStore } from './communityStore'; +export { useAccountingStore } from './accountingStore';