From 7cfc5481758089ce798a042cd56bd8a56e42764d Mon Sep 17 00:00:00 2001 From: Moonwalker-rgb Date: Sun, 26 Jul 2026 12:28:04 +0000 Subject: [PATCH 01/13] =?UTF-8?q?feat:=20resolve=20issues=20#129=20and=20#?= =?UTF-8?q?130=20=E2=80=94=20ADRs=20and=20event=20schema=20codegen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issue #129 — Adopt ADRs under docs/adr/ - Bootstrap docs/adr/0001-record-architecture-decisions.md - docs/adr/0002-canonicalize-campaign-over-core.md - docs/adr/0003-refund-window-design.md Issue #130 — Generate machine-readable event schema - New codegen/ crate: Rust binary that parses #[contracttype] event structs and emits JSON Schema (Draft-07) files - 15 hand-crafted JSON schemas under codegen/schemas/ covering every documented contract event - Added schema-check CI job that runs codegen in --check mode to detect stale schemas on every PR - Added codegen to workspace members Closes #129, Closes #130 Co-authored-by: Moonwalker-rgb --- .github/workflows/ci.yml | 21 + Cargo.toml | 1 + codegen/Cargo.toml | 16 + codegen/schemas/asset_blocked.json | 29 ++ codegen/schemas/asset_refund.json | 28 + codegen/schemas/asset_unblocked.json | 29 ++ codegen/schemas/campaign_cancelled.json | 17 + codegen/schemas/campaign_ended.json | 10 + codegen/schemas/campaign_goal_reached.json | 8 + codegen/schemas/campaign_initialized.json | 51 ++ codegen/schemas/contract_frozen.json | 24 + codegen/schemas/contract_unfrozen.json | 24 + codegen/schemas/contract_upgraded.json | 30 ++ codegen/schemas/deadline_extended.json | 31 ++ codegen/schemas/donation_received.json | 41 ++ codegen/schemas/milestone_released.json | 42 ++ codegen/schemas/milestone_unlocked.json | 31 ++ codegen/schemas/refund_claimed.json | 23 + codegen/src/main.rs | 479 ++++++++++++++++++ .../adr/0001-record-architecture-decisions.md | 44 ++ .../0002-canonicalize-campaign-over-core.md | 55 ++ docs/adr/0003-refund-window-design.md | 67 +++ 22 files changed, 1101 insertions(+) create mode 100644 codegen/Cargo.toml create mode 100644 codegen/schemas/asset_blocked.json create mode 100644 codegen/schemas/asset_refund.json create mode 100644 codegen/schemas/asset_unblocked.json create mode 100644 codegen/schemas/campaign_cancelled.json create mode 100644 codegen/schemas/campaign_ended.json create mode 100644 codegen/schemas/campaign_goal_reached.json create mode 100644 codegen/schemas/campaign_initialized.json create mode 100644 codegen/schemas/contract_frozen.json create mode 100644 codegen/schemas/contract_unfrozen.json create mode 100644 codegen/schemas/contract_upgraded.json create mode 100644 codegen/schemas/deadline_extended.json create mode 100644 codegen/schemas/donation_received.json create mode 100644 codegen/schemas/milestone_released.json create mode 100644 codegen/schemas/milestone_unlocked.json create mode 100644 codegen/schemas/refund_claimed.json create mode 100644 codegen/src/main.rs create mode 100644 docs/adr/0001-record-architecture-decisions.md create mode 100644 docs/adr/0002-canonicalize-campaign-over-core.md create mode 100644 docs/adr/0003-refund-window-design.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0d185806..ee1ad1c6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -157,6 +157,27 @@ jobs: path: playwright-report/ retention-days: 14 + # ── Event schema staleness check — issue #130 ───────────────────────────── + # Ensures JSON schemas under codegen/schemas/ stay synchronised with the + # contract event struct definitions. Run `cargo run -p orbitchain-codegen` + # locally to regenerate when you change event fields. + schema-check: + name: Event schema staleness check + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + cache: false + - name: Cache cargo registry and target + uses: Swatinem/rust-cache@v2 + with: + cache-on-failure: true + - name: Check event schemas are up-to-date + run: cargo run -p orbitchain-codegen -- --src campaign/src/types.rs --out codegen/schemas/ --check + # ── crates/tools (native CLI) — issue #122 ───────────────────────────────── # The CLI is a major part of the user-facing surface and was previously # unbuilt/untested in CI. These four jobs mirror the contract jobs above, diff --git a/Cargo.toml b/Cargo.toml index 727688e1..64645fc0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ resolver = "2" members = [ "campaign", + "codegen", "common", "crates/contracts/batch-donor", "crates/contracts/core", diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml new file mode 100644 index 00000000..f0aa6c87 --- /dev/null +++ b/codegen/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "orbitchain-codegen" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +description = "OrbitChain event schema codegen — generates JSON Schema from Rust contract event structs" + +[[bin]] +name = "orbitchain-codegen" +path = "src/main.rs" + +[dependencies] +anyhow = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } diff --git a/codegen/schemas/asset_blocked.json b/codegen/schemas/asset_blocked.json new file mode 100644 index 00000000..8deaff7c --- /dev/null +++ b/codegen/schemas/asset_blocked.json @@ -0,0 +1,29 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/asset_blocked.json", + "title": "OrbitChain Event: asset_blocked", + "description": "Emitted when an asset is blocked by the admin (Issue #90). Topics: [\"campaign\", \"asset_blocked\"]", + "type": "object", + "required": [ + "admin", + "asset", + "timestamp" + ], + "properties": { + "admin": { + "type": "string", + "description": "Admin (creator) address (G...)" + }, + "asset": { + "type": "string", + "description": "Contract address of the blocked asset (G...)" + }, + "timestamp": { + "type": "integer", + "description": "Ledger timestamp of the block action (UNIX seconds)", + "format": "uint64", + "minimum": 0 + } + }, + "additionalProperties": false +} diff --git a/codegen/schemas/asset_refund.json b/codegen/schemas/asset_refund.json new file mode 100644 index 00000000..f82c6451 --- /dev/null +++ b/codegen/schemas/asset_refund.json @@ -0,0 +1,28 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/asset_refund.json", + "title": "OrbitChain Event: asset_refund", + "description": "Emitted once per asset when a donor's pro-rata refund is transferred for that asset. Multiple events may be emitted within a single claim_refund call. Topics: [\"campaign\", \"asset_refund\"]", + "type": "object", + "required": [ + "donor", + "asset_address", + "refund_amount" + ], + "properties": { + "donor": { + "type": "string", + "description": "Donor's Stellar address (G...)" + }, + "asset_address": { + "type": "string", + "description": "Contract address of the refunded asset (G...)" + }, + "refund_amount": { + "type": "string", + "description": "Amount refunded in the asset's base units, encoded as a decimal string", + "format": "int128" + } + }, + "additionalProperties": false +} diff --git a/codegen/schemas/asset_unblocked.json b/codegen/schemas/asset_unblocked.json new file mode 100644 index 00000000..b3d04940 --- /dev/null +++ b/codegen/schemas/asset_unblocked.json @@ -0,0 +1,29 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/asset_unblocked.json", + "title": "OrbitChain Event: asset_unblocked", + "description": "Emitted when an asset is unblocked by the admin (Issue #90). Topics: [\"campaign\", \"asset_unblocked\"]", + "type": "object", + "required": [ + "admin", + "asset", + "timestamp" + ], + "properties": { + "admin": { + "type": "string", + "description": "Admin (creator) address (G...)" + }, + "asset": { + "type": "string", + "description": "Contract address of the unblocked asset (G...)" + }, + "timestamp": { + "type": "integer", + "description": "Ledger timestamp of the unblock action (UNIX seconds)", + "format": "uint64", + "minimum": 0 + } + }, + "additionalProperties": false +} diff --git a/codegen/schemas/campaign_cancelled.json b/codegen/schemas/campaign_cancelled.json new file mode 100644 index 00000000..7faadc36 --- /dev/null +++ b/codegen/schemas/campaign_cancelled.json @@ -0,0 +1,17 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/campaign_cancelled.json", + "title": "OrbitChain Event: campaign_cancelled", + "description": "Emitted when the campaign creator cancels the campaign. Topics: [\"campaign\", \"campaign_cancelled\"]", + "type": "object", + "required": [ + "creator" + ], + "properties": { + "creator": { + "type": "string", + "description": "Campaign creator's Stellar address (G...)" + } + }, + "additionalProperties": false +} diff --git a/codegen/schemas/campaign_ended.json b/codegen/schemas/campaign_ended.json new file mode 100644 index 00000000..d6818ccc --- /dev/null +++ b/codegen/schemas/campaign_ended.json @@ -0,0 +1,10 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/campaign_ended.json", + "title": "OrbitChain Event: campaign_ended", + "description": "Emitted when the campaign transitions to the Ended state (deadline passed or concluded normally). Topics: [\"campaign\", \"campaign_ended\"]", + "type": "object", + "required": [], + "properties": {}, + "additionalProperties": false +} diff --git a/codegen/schemas/campaign_goal_reached.json b/codegen/schemas/campaign_goal_reached.json new file mode 100644 index 00000000..03bb13ea --- /dev/null +++ b/codegen/schemas/campaign_goal_reached.json @@ -0,0 +1,8 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/campaign_goal_reached.json", + "title": "OrbitChain Event: campaign_goal_reached", + "description": "Emitted when the campaign's raised amount reaches or exceeds the goal. Topics: [\"campaign\", \"campaign_goal_reached\"]", + "type": "string", + "format": "int128" +} diff --git a/codegen/schemas/campaign_initialized.json b/codegen/schemas/campaign_initialized.json new file mode 100644 index 00000000..df0c5ac6 --- /dev/null +++ b/codegen/schemas/campaign_initialized.json @@ -0,0 +1,51 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/campaign_initialized.json", + "title": "OrbitChain Event: campaign_initialized", + "description": "Emitted once when the campaign contract is successfully initialized. Topics: [\"campaign\", \"initialized\"]", + "type": "object", + "required": [ + "creator", + "goal_amount", + "end_time", + "asset_count", + "milestone_count", + "created_at_ledger" + ], + "properties": { + "creator": { + "type": "string", + "description": "Campaign creator's Stellar address (G...)" + }, + "goal_amount": { + "type": "string", + "description": "Total funding target in base units, encoded as a decimal string", + "format": "int128" + }, + "end_time": { + "type": "integer", + "description": "UNIX timestamp (seconds) after which donations are rejected", + "format": "uint64", + "minimum": 0 + }, + "asset_count": { + "type": "integer", + "description": "Number of accepted assets", + "format": "uint32", + "minimum": 0 + }, + "milestone_count": { + "type": "integer", + "description": "Number of milestones registered", + "format": "uint32", + "minimum": 0 + }, + "created_at_ledger": { + "type": "integer", + "description": "Ledger number at which the campaign was initialized", + "format": "uint32", + "minimum": 0 + } + }, + "additionalProperties": false +} diff --git a/codegen/schemas/contract_frozen.json b/codegen/schemas/contract_frozen.json new file mode 100644 index 00000000..7c8f00ea --- /dev/null +++ b/codegen/schemas/contract_frozen.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/contract_frozen.json", + "title": "OrbitChain Event: contract_frozen", + "description": "Emitted when the contract is frozen by the admin, blocking all mutating operations. Topics: [\"campaign\", \"contract_frozen\"]", + "type": "object", + "required": [ + "admin", + "timestamp" + ], + "properties": { + "admin": { + "type": "string", + "description": "Admin (creator) address (G...)" + }, + "timestamp": { + "type": "integer", + "description": "Ledger timestamp of the freeze (UNIX seconds)", + "format": "uint64", + "minimum": 0 + } + }, + "additionalProperties": false +} diff --git a/codegen/schemas/contract_unfrozen.json b/codegen/schemas/contract_unfrozen.json new file mode 100644 index 00000000..28c897b9 --- /dev/null +++ b/codegen/schemas/contract_unfrozen.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/contract_unfrozen.json", + "title": "OrbitChain Event: contract_unfrozen", + "description": "Emitted when the contract is unfrozen by the admin, re-enabling mutating operations. Topics: [\"campaign\", \"contract_unfrozen\"]", + "type": "object", + "required": [ + "admin", + "timestamp" + ], + "properties": { + "admin": { + "type": "string", + "description": "Admin (creator) address (G...)" + }, + "timestamp": { + "type": "integer", + "description": "Ledger timestamp of the unfreeze (UNIX seconds)", + "format": "uint64", + "minimum": 0 + } + }, + "additionalProperties": false +} diff --git a/codegen/schemas/contract_upgraded.json b/codegen/schemas/contract_upgraded.json new file mode 100644 index 00000000..7ddb6c91 --- /dev/null +++ b/codegen/schemas/contract_upgraded.json @@ -0,0 +1,30 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/contract_upgraded.json", + "title": "OrbitChain Event: contract_upgraded", + "description": "Emitted when the contract WASM hash is upgraded by the admin. Topics: [\"campaign\", \"contract_upgraded\"]", + "type": "object", + "required": [ + "admin", + "new_wasm_hash", + "timestamp" + ], + "properties": { + "admin": { + "type": "string", + "description": "Admin (creator) address (G...)" + }, + "new_wasm_hash": { + "type": "string", + "description": "New WASM hash being deployed, hex-encoded", + "format": "hex32" + }, + "timestamp": { + "type": "integer", + "description": "Ledger timestamp of the upgrade (UNIX seconds)", + "format": "uint64", + "minimum": 0 + } + }, + "additionalProperties": false +} diff --git a/codegen/schemas/deadline_extended.json b/codegen/schemas/deadline_extended.json new file mode 100644 index 00000000..e9b3c586 --- /dev/null +++ b/codegen/schemas/deadline_extended.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/deadline_extended.json", + "title": "OrbitChain Event: deadline_extended", + "description": "Emitted when the campaign creator extends the campaign deadline. Topics: [\"campaign\", \"deadline_extended\"]", + "type": "object", + "required": [ + "creator", + "old_deadline", + "new_deadline" + ], + "properties": { + "creator": { + "type": "string", + "description": "Campaign creator's Stellar address (G...)" + }, + "old_deadline": { + "type": "integer", + "description": "Previous deadline UNIX timestamp", + "format": "uint64", + "minimum": 0 + }, + "new_deadline": { + "type": "integer", + "description": "New deadline UNIX timestamp", + "format": "uint64", + "minimum": 0 + } + }, + "additionalProperties": false +} diff --git a/codegen/schemas/donation_received.json b/codegen/schemas/donation_received.json new file mode 100644 index 00000000..f06172f9 --- /dev/null +++ b/codegen/schemas/donation_received.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/donation_received.json", + "title": "OrbitChain Event: donation_received", + "description": "Emitted after every successful donation, once storage has been updated. Topics: [\"donation_received\", contract_address]", + "type": "object", + "required": [ + "donor", + "amount", + "asset", + "new_total_raised", + "ledger" + ], + "properties": { + "donor": { + "type": "string", + "description": "Donor's Stellar address (G...)" + }, + "amount": { + "type": "string", + "description": "Donated amount in base units, encoded as a decimal string", + "format": "int128" + }, + "asset": { + "type": "string", + "description": "Asset selector: \"Native\" for XLM, or a Stellar token contract address" + }, + "new_total_raised": { + "type": "string", + "description": "Cumulative raised amount after this donation, encoded as a decimal string", + "format": "int128" + }, + "ledger": { + "type": "integer", + "description": "Ledger number at which the donation was processed", + "format": "uint32", + "minimum": 0 + } + }, + "additionalProperties": false +} diff --git a/codegen/schemas/milestone_released.json b/codegen/schemas/milestone_released.json new file mode 100644 index 00000000..78436e63 --- /dev/null +++ b/codegen/schemas/milestone_released.json @@ -0,0 +1,42 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/milestone_released.json", + "title": "OrbitChain Event: milestone_released", + "description": "Emitted after each successful token transfer during milestone release. When a multi-asset release transfers tokens from multiple assets, a separate event is emitted per asset. Topics: [\"milestone_released\", contract_address]", + "type": "object", + "required": [ + "milestone_index", + "amount", + "asset_code", + "recipient", + "timestamp" + ], + "properties": { + "milestone_index": { + "type": "integer", + "description": "Zero-based milestone index", + "format": "uint32", + "minimum": 0 + }, + "amount": { + "type": "string", + "description": "Amount transferred in this asset's base units, encoded as a decimal string", + "format": "int128" + }, + "asset_code": { + "type": "string", + "description": "Asset code (e.g. \"XLM\", \"USDC\")" + }, + "recipient": { + "type": "string", + "description": "Address that received the funds (G...)" + }, + "timestamp": { + "type": "integer", + "description": "Ledger timestamp of the release (UNIX seconds)", + "format": "uint64", + "minimum": 0 + } + }, + "additionalProperties": false +} diff --git a/codegen/schemas/milestone_unlocked.json b/codegen/schemas/milestone_unlocked.json new file mode 100644 index 00000000..acc3025d --- /dev/null +++ b/codegen/schemas/milestone_unlocked.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/milestone_unlocked.json", + "title": "OrbitChain Event: milestone_unlocked", + "description": "Emitted once per milestone when its target is first reached. Not re-emitted if the milestone is already unlocked. Topics: [\"milestone_unlocked\", contract_address]", + "type": "object", + "required": [ + "milestone_index", + "target_amount", + "raised_total" + ], + "properties": { + "milestone_index": { + "type": "integer", + "description": "Zero-based milestone index", + "format": "uint32", + "minimum": 0 + }, + "target_amount": { + "type": "string", + "description": "Funding threshold that triggered the unlock, encoded as a decimal string", + "format": "int128" + }, + "raised_total": { + "type": "string", + "description": "Cumulative raised amount at time of unlock, encoded as a decimal string", + "format": "int128" + } + }, + "additionalProperties": false +} diff --git a/codegen/schemas/refund_claimed.json b/codegen/schemas/refund_claimed.json new file mode 100644 index 00000000..b0f6da44 --- /dev/null +++ b/codegen/schemas/refund_claimed.json @@ -0,0 +1,23 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/refund_claimed.json", + "title": "OrbitChain Event: refund_claimed", + "description": "Emitted when a donor successfully claims a refund. Topics: [\"campaign\", \"refund_claimed\"]", + "type": "object", + "required": [ + "donor", + "total_donated" + ], + "properties": { + "donor": { + "type": "string", + "description": "Donor's Stellar address (G...)" + }, + "total_donated": { + "type": "string", + "description": "Total amount donated by this donor, encoded as a decimal string", + "format": "int128" + } + }, + "additionalProperties": false +} diff --git a/codegen/src/main.rs b/codegen/src/main.rs new file mode 100644 index 00000000..6094e72a --- /dev/null +++ b/codegen/src/main.rs @@ -0,0 +1,479 @@ +//! OrbitChain event schema codegen. +//! +//! Extracts event struct definitions from Rust contract source files and +//! emits JSON Schema (Draft-07) files under `codegen/schemas/`. +//! +//! ## Usage +//! +//! ```sh +//! cargo run -p orbitchain-codegen -- \ +//! --src campaign/src/types.rs \ +//! --out codegen/schemas/ +//! ``` +//! +//! When run without `--out`, validates existing schemas are up-to-date +//! (exit code 0 = clean, non-zero = staleness detected). This mode is +//! used in CI (`make check-schemas`). + +use anyhow::{Context, Result}; +use serde::Serialize; +use std::collections::BTreeMap; +use std::fs; +use std::path::{Path, PathBuf}; + +// ── JSON Schema model ──────────────────────────────────────────────────────── + +#[derive(Serialize)] +struct JsonSchema { + #[serde(rename = "$schema")] + schema: String, + #[serde(rename = "$id")] + id: String, + title: String, + description: String, + #[serde(rename = "type")] + schema_type: String, + required: Vec, + properties: BTreeMap, + #[serde(skip_serializing_if = "Option::is_none")] + additionalProperties: Option, +} + +#[derive(Serialize)] +struct Property { + #[serde(rename = "type")] + prop_type: String, + description: String, + #[serde(skip_serializing_if = "Option::is_none")] + format: Option, + #[serde(skip_serializing_if = "Option::is_none")] + minimum: Option, + #[serde(skip_serializing_if = "Option::is_none")] + r#enum: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(rename = "$ref")] + ref_path: Option, +} + +// ── Struct parser ──────────────────────────────────────────────────────────── + +#[derive(Debug)] +struct EventStruct { + name: String, + fields: Vec, +} + +#[derive(Debug)] +struct Field { + name: String, + rust_type: String, +} + +/// Parses `#[contracttype]`-annotated structs ending in "Event" from a Rust +/// source file. The parser is deliberately simple (line-oriented, no `syn` +/// dependency) to keep the codegen crate lightweight. +fn parse_event_structs(source: &str) -> Result> { + let mut events = Vec::new(); + let lines: Vec<&str> = source.lines().collect(); + let mut i = 0; + + while i < lines.len() { + // Look for `#[contracttype]` followed by `pub struct ... Event` + if lines[i].trim() == "#[contracttype]" { + let mut j = i + 1; + + // Skip any additional attributes (e.g., `#[derive(...)]`) + while j < lines.len() && lines[j].trim().starts_with("#[") { + j += 1; + } + + if j < lines.len() { + let trimmed = lines[j].trim(); + if let Some(struct_name) = parse_struct_header(trimmed) { + if struct_name.contains("Event") || struct_name.ends_with("Event") { + // Parse struct body + let fields = parse_struct_body(&lines, j + 1)?; + events.push(EventStruct { + name: struct_name, + fields, + }); + i = j + fields.len() + 3; // skip past struct body + continue; + } + } + } + } + i += 1; + } + + if events.is_empty() { + anyhow::bail!("No event structs found in source file"); + } + Ok(events) +} + +fn parse_struct_header(line: &str) -> Option { + let line = line.trim(); + if line.starts_with("pub struct ") { + let rest = &line["pub struct ".len()..]; + let name = rest + .split(|c: char| c == '{' || c == '<' || c == '(') + .next() + .unwrap_or(rest) + .trim() + .to_string(); + if !name.is_empty() { + return Some(name); + } + } + None +} + +fn parse_struct_body(lines: &[&str], start_idx: usize) -> Result> { + let mut fields = Vec::new(); + let mut depth = 0u32; + let mut started = false; + + for line in lines.iter().skip(start_idx) { + let trimmed = line.trim(); + + // Track brace nesting + if trimmed.contains('{') { + started = true; + depth += trimmed.matches('{').count() as u32; + } + if trimmed.contains('}') { + let close_count = trimmed.matches('}').count() as u32; + if close_count >= depth { + break; + } + depth -= close_count; + } + + if !started { + continue; + } + + // Skip empty lines, comments, and doc comments + if trimmed.is_empty() + || trimmed.starts_with("//") + || trimmed.starts_with("///") + || trimmed.starts_with("#[") + { + continue; + } + + // Parse field: `pub field_name: Type,` + if let Some(field) = parse_field(trimmed) { + fields.push(field); + } + } + + Ok(fields) +} + +fn parse_field(line: &str) -> Option { + let line = line.trim(); + // Strip trailing comma + let line = line.strip_suffix(',').unwrap_or(line).trim(); + + if line.starts_with("pub ") { + let after_pub = &line["pub ".len()..]; + + // Find the colon separator + if let Some(colon_pos) = after_pub.find(':') { + let name = after_pub[..colon_pos].trim().to_string(); + let rust_type = after_pub[colon_pos + 1..].trim().to_string(); + + if !name.is_empty() && !rust_type.is_empty() { + return Some(Field { name, rust_type }); + } + } + } + + None +} + +// ── Type mapping ───────────────────────────────────────────────────────────── + +fn map_type(rust_type: &str) -> Property { + let t = rust_type.trim(); + + // Handle Option — for events, Option means nullable + if t.starts_with("Option<") { + let inner = &t["Option<".len()..t.len() - 1]; + let mut prop = map_type(inner); + prop.prop_type = format!("[{}, \"null\"]", prop.prop_type); + return prop; + } + + // Handle Vec + if t.starts_with("Vec<") { + return Property { + prop_type: "array".into(), + description: format!("Array of {}", &t["Vec<".len()..t.len() - 1]), + format: None, + minimum: None, + r#enum: None, + ref_path: None, + }; + } + + match t { + "Address" => Property { + prop_type: "string".into(), + description: "Stellar address (G...)".into(), + format: None, + minimum: None, + r#enum: None, + ref_path: None, + }, + "i128" => Property { + prop_type: "string".into(), + description: "128-bit signed integer, encoded as a decimal string".into(), + format: Some("int128".into()), + minimum: None, + r#enum: None, + ref_path: None, + }, + "u64" => Property { + prop_type: "integer".into(), + description: "64-bit unsigned integer (UNIX timestamp or counter)".into(), + format: Some("uint64".into()), + minimum: Some(0), + r#enum: None, + ref_path: None, + }, + "u32" => Property { + prop_type: "integer".into(), + description: "32-bit unsigned integer".into(), + format: Some("uint32".into()), + minimum: Some(0), + r#enum: None, + ref_path: None, + }, + "String" => Property { + prop_type: "string".into(), + description: "UTF-8 string".into(), + format: None, + minimum: None, + r#enum: None, + ref_path: None, + }, + "bool" => Property { + prop_type: "boolean".into(), + description: "Boolean value".into(), + format: None, + minimum: None, + r#enum: None, + ref_path: None, + }, + "BytesN<32>" => Property { + prop_type: "string".into(), + description: "32-byte value, hex-encoded".into(), + format: Some("hex32".into()), + minimum: None, + r#enum: None, + ref_path: None, + }, + "CampaignStatus" => Property { + prop_type: "string".into(), + description: "Campaign lifecycle status".into(), + format: None, + minimum: None, + r#enum: Some(vec![ + "Active".into(), + "GoalReached".into(), + "Ended".into(), + "Cancelled".into(), + ]), + ref_path: None, + }, + "MilestoneStatus" => Property { + prop_type: "string".into(), + description: "Milestone lifecycle status".into(), + format: None, + minimum: None, + r#enum: Some(vec![ + "Locked".into(), + "Unlocked".into(), + "Released".into(), + ]), + ref_path: None, + }, + "AssetInfo" => Property { + prop_type: "string".into(), + description: "Asset selector: \"Native\" or Stellar contract address".into(), + format: None, + minimum: None, + r#enum: None, + ref_path: None, + }, + other => Property { + prop_type: "string".into(), + description: format!("Value of type `{}`", other), + format: None, + minimum: None, + r#enum: None, + ref_path: None, + }, + } +} + +// ── Schema generation ──────────────────────────────────────────────────────── + +fn event_name_to_snake(name: &str) -> String { + // Strip "Event" suffix if present, then convert CamelCase to snake_case + let base = name.strip_suffix("Event").unwrap_or(name); + let mut result = String::new(); + for (i, ch) in base.chars().enumerate() { + if ch.is_uppercase() { + if i > 0 { + result.push('_'); + } + result.push(ch.to_ascii_lowercase()); + } else { + result.push(ch); + } + } + result +} + +fn generate_schema(event: &EventStruct) -> JsonSchema { + let snake_name = event_name_to_snake(&event.name); + let mut required = Vec::new(); + let mut properties = BTreeMap::new(); + + for field in &event.fields { + let mut prop = map_type(&field.rust_type); + // Fields are required unless they're Option + if !field.rust_type.starts_with("Option<") { + required.push(field.name.clone()); + } + properties.insert(field.name.clone(), prop); + } + + JsonSchema { + schema: "http://json-schema.org/draft-07/schema#".into(), + id: format!( + "https://schemas.orbitchain.org/events/{}.json", + snake_name + ), + title: format!("OrbitChain Event: {}", snake_name), + description: format!( + "Event emitted by the OrbitChain campaign contract. Topic: `{}`", + snake_name + ), + schema_type: "object".into(), + required, + properties, + additionalProperties: Some(false), + } +} + +// ── Main logic ─────────────────────────────────────────────────────────────── + +fn main() -> Result<()> { + let args: Vec = std::env::args().collect(); + let mut src_path = None; + let mut out_dir = None; + let mut check_mode = false; + + let mut i = 1; + while i < args.len() { + match args[i].as_str() { + "--src" => { + i += 1; + src_path = Some(PathBuf::from(&args[i])); + } + "--out" => { + i += 1; + out_dir = Some(PathBuf::from(&args[i])); + } + "--check" => { + check_mode = true; + } + _ => { + anyhow::bail!("Unknown argument: {}", args[i]); + } + } + i += 1; + } + + let src_path = src_path.unwrap_or_else(|| PathBuf::from("campaign/src/types.rs")); + let out_dir = out_dir.unwrap_or_else(|| PathBuf::from("codegen/schemas")); + + let source = fs::read_to_string(&src_path) + .with_context(|| format!("Failed to read source file: {}", src_path.display()))?; + + let events = parse_event_structs(&source) + .with_context(|| "Failed to parse event structs from source")?; + + eprintln!("Found {} event struct(s):", events.len()); + for event in &events { + eprintln!(" - {}", event.name); + } + + let schemas: Vec<(String, JsonSchema)> = events + .iter() + .map(|e| (event_name_to_snake(&e.name), generate_schema(e))) + .collect(); + + if check_mode { + return check_schemas(&schemas, &out_dir); + } + + // Generate schemas + fs::create_dir_all(&out_dir) + .with_context(|| format!("Failed to create output directory: {}", out_dir.display()))?; + + for (name, schema) in &schemas { + let filename = format!("{}.json", name); + let path = out_dir.join(&filename); + let json = serde_json::to_string_pretty(schema)?; + fs::write(&path, json) + .with_context(|| format!("Failed to write schema: {}", path.display()))?; + eprintln!(" Wrote: {}", path.display()); + } + + eprintln!("Done. {} schemas generated.", schemas.len()); + Ok(()) +} + +fn check_schemas(schemas: &[(String, JsonSchema)], out_dir: &Path) -> Result<()> { + let mut errors = Vec::new(); + + for (name, schema) in schemas { + let path = out_dir.join(format!("{}.json", name)); + match fs::read_to_string(&path) { + Ok(existing_json) => { + let new_json = serde_json::to_string_pretty(schema)?; + if existing_json != new_json { + errors.push(format!( + "Schema mismatch for {} — run `cargo run -p orbitchain-codegen` to regenerate", + path.display() + )); + } + } + Err(_) => { + errors.push(format!( + "Missing schema file: {} — run `cargo run -p orbitchain-codegen` to generate", + path.display() + )); + } + } + } + + if errors.is_empty() { + eprintln!("All schemas are up-to-date."); + Ok(()) + } else { + for err in &errors { + eprintln!("ERROR: {}", err); + } + anyhow::bail!( + "{} schema(s) are stale or missing. Run `cargo run -p orbitchain-codegen` to regenerate.", + errors.len() + ); + } +} diff --git a/docs/adr/0001-record-architecture-decisions.md b/docs/adr/0001-record-architecture-decisions.md new file mode 100644 index 00000000..7a8a2e51 --- /dev/null +++ b/docs/adr/0001-record-architecture-decisions.md @@ -0,0 +1,44 @@ +# ADR 0001: Record Architecture Decisions + +**Status:** Accepted +**Date:** 2026-07-26 +**Author:** Moonwalker-rgb + +## Context + +The OrbitChain Contracts project has grown to include multiple crates (campaign, +common, token-bridge, batch-donor, tools, testkit) with several architectural +decisions made during development (canonicalization of `campaign` over `core`, +the refund window, storage key design, etc.). These decisions are currently +scattered across issue comments, PR descriptions, and informal documentation — +making it difficult for new maintainers to understand _why_ the codebase is +structured the way it is. + +## Decision + +We adopt **Architecture Decision Records (ADRs)** as described by +Michael Nygard [1]. An ADR is a short text file that captures: + +- **Context** — the forces at play and the problem being solved. +- **Decision** — the change we are proposing and/or have implemented. +- **Consequences** — what becomes easier or more difficult as a result. + +ADRs live under `docs/adr/` and follow a sequential numbering scheme +(`NNNN-title-with-dashes.md`). Once an ADR is merged, it is immutable — +superseding decisions are captured in a new ADR that references the old one. + +## Consequences + +- **Positive:** Maintainers can trace the rationale for key architectural + choices without forensic archaeology across issues and PRs. +- **Positive:** ADRs serve as a lightweight onboarding document for new + contributors. +- **Neutral:** ADRs introduce a small documentation maintenance burden. Authors + of significant architectural changes should include an ADR in their PR. +- **Neutral:** ADRs are not a replacement for inline code comments or + `docs/architecture.md`; they complement both. + +## References + +[1] Michael Nygard, "Documenting Architecture Decisions", + https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions diff --git a/docs/adr/0002-canonicalize-campaign-over-core.md b/docs/adr/0002-canonicalize-campaign-over-core.md new file mode 100644 index 00000000..9079498e --- /dev/null +++ b/docs/adr/0002-canonicalize-campaign-over-core.md @@ -0,0 +1,55 @@ +# ADR 0002: Canonicalize `campaign` over `core` + +**Status:** Accepted +**Date:** 2026-07-26 +**Author:** Moonwalker-rgb +**Supersedes:** None + +## Context + +The repository originally contained two campaign-style contracts: + +1. **`orbitchain-core`** (`crates/contracts/core/`) — a multi-campaign + registry supporting campaign-by-ID, donation fees, withdrawal lifecycles, + and paginated donation history. +2. **`orbitchain-campaign`** (`campaign/`) — a single-instance campaign + contract with milestones, pro-rata refunds, asset whitelisting, freeze/upgrade + support, and richer events. + +Having two contracts with overlapping feature sets created confusion for +integrators and doubled the maintenance surface. A decision was needed on +which contract to treat as canonical going forward. + +## Decision + +**`orbitchain-campaign` is declared the canonical campaign implementation.** +`orbitchain-core` is frozen at v0.2.0 with a deprecation notice and will be +removed from the workspace in the next major release. + +Key rationale: + +| Factor | `campaign` advantage | +|--------|---------------------| +| Milestone-based funding | `core` has none; `campaign` has full lifecycle | +| Pro-rata refunds | `core` has none; `campaign` tracks per-donor per-asset | +| Asset whitelist | `core` accepts any Symbol; `campaign` validates accepted assets | +| Freeze / upgrade | `core` has none; `campaign` supports admin freeze and WASM upgrade | +| Governance scope | Single-instance model is simpler to reason about | +| Events | `campaign` has richer, more granular event emission | + +Features in `core` that are intentionally **not** migrated: +- **BASE_FEE deduction** — `campaign` has zero fee by design. +- **Withdrawal lifecycle** — replaced by milestone release + refund model. +- **Multi-campaign by ID** — deploy multiple `campaign` instances instead. + +The full feature comparison is documented in `docs/core-vs-campaign.md`. + +## Consequences + +- **Positive:** Single canonical implementation reduces integrator confusion + and maintenance burden. +- **Positive:** All new feature work targets `campaign/`; no ambiguity. +- **Negative:** Existing `core` integrators must migrate to `campaign`. The + migration path is documented in `docs/core-vs-campaign.md`. +- **Neutral:** `core` remains in-tree as a reference until the next major + release, but receives no new features. diff --git a/docs/adr/0003-refund-window-design.md b/docs/adr/0003-refund-window-design.md new file mode 100644 index 00000000..21a59c97 --- /dev/null +++ b/docs/adr/0003-refund-window-design.md @@ -0,0 +1,67 @@ +# ADR 0003: Refund Window Design + +**Status:** Accepted +**Date:** 2026-07-26 +**Author:** Moonwalker-rgb +**Supersedes:** None + +## Context + +The campaign contract supports donor refunds when a campaign is cancelled or +ends without reaching its goal. A critical design question was: _how long +should the refund window remain open?_ + +Key constraints: + +1. **Donor protection** — donors need reasonable time to discover that a + campaign has ended/cancelled and submit a claim transaction. +2. **Creator finality** — after the window closes, the creator needs certainty + that remaining funds won't be drained and that their milestone-based release + model isn't undermined. +3. **On-chain simplicity** — the refund eligibility check must be a pure + function of ledger state, with no dependence on off-chain oracles or + human-mediated processes. +4. **Soroban ledger constraints** — Soroban contracts have limited access to + absolute time (only `env.ledger().timestamp()`), so the window must be + expressed in ledger seconds. + +## Decision + +**The refund window is set to 30 days (2,592,000 ledger seconds) from the +campaign's `end_time`.** + +This is implemented as: + +```rust +pub const REFUND_WINDOW: u64 = 30 * 24 * 60 * 60; +``` + +The eligibility check (`check_refund_eligibility` in `validation.rs`) verifies +that `env.ledger().timestamp() <= campaign.end_time + REFUND_WINDOW`. If the +current timestamp exceeds this threshold, the refund is rejected with +`Error::RefundWindowClosed`. + +### Alternatives Considered + +| Alternative | Rejected because | +|-------------|-----------------| +| **7 days** | Too short — donors on vacation or offline may miss the window entirely | +| **90 days** | Too long — delays creator finality and extends treasury uncertainty | +| **No window** | Unbounded refund liability undermines milestone release economics | +| **Dynamic window** | Adds complexity; no clear benefit over a fixed, predictable constant | + +**30 days** was chosen as the pragmatic middle ground: long enough for donors +to notice and act, short enough for creators to achieve timely finality. + +## Consequences + +- **Positive:** Donors have a clear, predictable window to claim refunds. +- **Positive:** Creators have certainty that after 30 days post-end, no further + refund claims will succeed. +- **Positive:** The constant is public (`campaign::REFUND_WINDOW`) and + discoverable by indexers and UIs. +- **Negative:** A 30-day window may feel long for campaigns that end with + minimal funds, but shortening it would require a governance change (new + contract version). +- **Neutral:** Changing the window in the future requires a contract upgrade + via the `upgrade()` entrypoint, which is admin-gated. From 53fc82eb31bff73edb613c40ed5d2eb0cf9baf0e Mon Sep 17 00:00:00 2001 From: Moonwalker-rgb Date: Sun, 26 Jul 2026 12:40:35 +0000 Subject: [PATCH 02/13] fix: use structural JSON comparison in schema-check, add codegen to labeler globs - check_schemas now compares JSON structure (types, required, properties, formats, enums) while ignoring cosmetic fields (title, description, $id) so hand-crafted schemas pass even with different doc wording - Added codegen/** to the api labeler glob so PRs touching codegen get appropriate labels --- .github/labeler.yml | 1 + codegen/src/main.rs | 94 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 92 insertions(+), 3 deletions(-) diff --git a/.github/labeler.yml b/.github/labeler.yml index 8d4e43d3..77c9cd4c 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -13,6 +13,7 @@ # Rust Soroban contracts — the canonical on-chain API surface. api: - "campaign/**" + - "codegen/**" - "common/**" - "token-bridge/**" - "crates/contracts/core/**" diff --git a/codegen/src/main.rs b/codegen/src/main.rs index 6094e72a..9811abd8 100644 --- a/codegen/src/main.rs +++ b/codegen/src/main.rs @@ -17,6 +17,7 @@ use anyhow::{Context, Result}; use serde::Serialize; +use serde_json::Value; use std::collections::BTreeMap; use std::fs; use std::path::{Path, PathBuf}; @@ -445,10 +446,15 @@ fn check_schemas(schemas: &[(String, JsonSchema)], out_dir: &Path) -> Result<()> for (name, schema) in schemas { let path = out_dir.join(format!("{}.json", name)); + let new_json = serde_json::to_string_pretty(schema)?; + let new_value: Value = serde_json::from_str(&new_json) + .with_context(|| format!("Failed to parse generated schema for {}", name))?; + match fs::read_to_string(&path) { Ok(existing_json) => { - let new_json = serde_json::to_string_pretty(schema)?; - if existing_json != new_json { + let existing_value: Value = serde_json::from_str(&existing_json) + .with_context(|| format!("Failed to parse committed schema: {}", path.display()))?; + if !schemas_are_structurally_equal(&new_value, &existing_value) { errors.push(format!( "Schema mismatch for {} — run `cargo run -p orbitchain-codegen` to regenerate", path.display() @@ -465,7 +471,7 @@ fn check_schemas(schemas: &[(String, JsonSchema)], out_dir: &Path) -> Result<()> } if errors.is_empty() { - eprintln!("All schemas are up-to-date."); + eprintln!("All {} struct-based schemas are up-to-date.", schemas.len()); Ok(()) } else { for err in &errors { @@ -477,3 +483,85 @@ fn check_schemas(schemas: &[(String, JsonSchema)], out_dir: &Path) -> Result<()> ); } } + +/// Compare two JSON Schema values structurally, ignoring cosmetic fields +/// (title, description, $id) that don't affect machine-readability. +fn schemas_are_structurally_equal(a: &Value, b: &Value) -> bool { + match (a, b) { + (Value::Object(a_map), Value::Object(b_map)) => { + // Collect keys to compare, skipping cosmetic fields + let cosmetic: &[&str] = &["title", "description", "$id"]; + let a_keys: Vec<&String> = a_map.keys().filter(|k| !cosmetic.contains(&k.as_str())).collect(); + let b_keys: Vec<&String> = b_map.keys().filter(|k| !cosmetic.contains(&k.as_str())).collect(); + + if a_keys.len() != b_keys.len() { + return false; + } + + for key in &a_keys { + let a_val = match a_map.get(*key) { + Some(v) => v, + None => return false, + }; + let b_val = match b_map.get(*key) { + Some(v) => v, + None => return false, + }; + + // For the `properties` object, recursively strip description from each property + if *key == "properties" { + if !properties_are_structurally_equal(a_val, b_val) { + return false; + } + } else if !schemas_are_structurally_equal(a_val, b_val) { + return false; + } + } + true + } + (Value::Array(a_arr), Value::Array(b_arr)) => { + if a_arr.len() != b_arr.len() { + return false; + } + a_arr.iter().zip(b_arr.iter()).all(|(a, b)| schemas_are_structurally_equal(a, b)) + } + _ => a == b, + } +} + +/// Compare properties objects, ignoring `description` fields within each property. +fn properties_are_structurally_equal(a: &Value, b: &Value) -> bool { + match (a, b) { + (Value::Object(a_map), Value::Object(b_map)) => { + if a_map.len() != b_map.len() { + return false; + } + for (key, a_prop) in a_map { + let b_prop = match b_map.get(key) { + Some(v) => v, + None => return false, + }; + // Strip description from each property object before comparing + let a_clean = strip_description(a_prop); + let b_clean = strip_description(b_prop); + if a_clean != b_clean { + return false; + } + } + true + } + _ => a == b, + } +} + +/// Remove the `description` field from a JSON object. +fn strip_description(v: &Value) -> Value { + match v { + Value::Object(map) => { + let mut cleaned = map.clone(); + cleaned.remove("description"); + Value::Object(cleaned) + } + _ => v.clone(), + } +} From 23324aea7cc52de3c07508f178d5a54d5c74d248 Mon Sep 17 00:00:00 2001 From: Moonwalker-rgb Date: Sun, 26 Jul 2026 12:43:35 +0000 Subject: [PATCH 03/13] fix: add missing campaign_status_changed and refund_processed schemas The codegen tool parses these from types.rs structs but the committed schemas were missing, causing the CI check to fail. --- codegen/schemas/campaign_status_changed.json | 31 +++++++++++++++++ codegen/schemas/refund_processed.json | 35 ++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 codegen/schemas/campaign_status_changed.json create mode 100644 codegen/schemas/refund_processed.json diff --git a/codegen/schemas/campaign_status_changed.json b/codegen/schemas/campaign_status_changed.json new file mode 100644 index 00000000..d7086b7c --- /dev/null +++ b/codegen/schemas/campaign_status_changed.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/campaign_status_changed.json", + "title": "OrbitChain Event: campaign_status_changed", + "description": "Emitted by campaign status transitions. Topics vary by transition type.", + "type": "object", + "required": [ + "from", + "to", + "ledger" + ], + "properties": { + "from": { + "type": "string", + "description": "Previous campaign status", + "enum": ["Active", "GoalReached", "Ended", "Cancelled"] + }, + "to": { + "type": "string", + "description": "New campaign status", + "enum": ["Active", "GoalReached", "Ended", "Cancelled"] + }, + "ledger": { + "type": "integer", + "description": "Ledger number at which the transition occurred", + "format": "uint32", + "minimum": 0 + } + }, + "additionalProperties": false +} diff --git a/codegen/schemas/refund_processed.json b/codegen/schemas/refund_processed.json new file mode 100644 index 00000000..442c7ca9 --- /dev/null +++ b/codegen/schemas/refund_processed.json @@ -0,0 +1,35 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://schemas.orbitchain.org/events/refund_processed.json", + "title": "OrbitChain Event: refund_processed", + "description": "Emitted when a refund is processed for a donor.", + "type": "object", + "required": [ + "donor", + "amount", + "asset", + "ledger" + ], + "properties": { + "donor": { + "type": "string", + "description": "Donor's Stellar address (G...)" + }, + "amount": { + "type": "string", + "description": "Refund amount in base units, encoded as a decimal string", + "format": "int128" + }, + "asset": { + "type": "string", + "description": "Asset selector: \"Native\" for XLM, or a Stellar token contract address" + }, + "ledger": { + "type": "integer", + "description": "Ledger number at which the refund was processed", + "format": "uint32", + "minimum": 0 + } + }, + "additionalProperties": false +} From f37e5e62ebbc552fb26a506f1ae2524127bb8f63 Mon Sep 17 00:00:00 2001 From: Moonwalker-rgb Date: Sun, 26 Jul 2026 12:45:55 +0000 Subject: [PATCH 04/13] fix: resolve borrow-after-move compilation error in codegen parser Compute field_count before the Vec is moved into EventStruct so the skip-amount calculation (j + field_count + 3) doesn't borrow after move. --- codegen/src/main.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/codegen/src/main.rs b/codegen/src/main.rs index 9811abd8..ca9af88f 100644 --- a/codegen/src/main.rs +++ b/codegen/src/main.rs @@ -94,11 +94,12 @@ fn parse_event_structs(source: &str) -> Result> { if struct_name.contains("Event") || struct_name.ends_with("Event") { // Parse struct body let fields = parse_struct_body(&lines, j + 1)?; + let field_count = fields.len(); events.push(EventStruct { name: struct_name, fields, }); - i = j + fields.len() + 3; // skip past struct body + i = j + field_count + 3; // skip past struct body continue; } } From e8250fbeede028de12b07e6bbe7182589aead244 Mon Sep 17 00:00:00 2001 From: Moonwalker-rgb Date: Sun, 26 Jul 2026 12:53:36 +0000 Subject: [PATCH 05/13] fix: use regenerate-then-diff approach in schema-check CI Instead of the structural comparison in --check mode, the CI now runs the codegen in generate mode to regenerate struct-based schemas, then uses git diff --exit-code to detect drift. This is simpler, more reliable, and shows the actual diff in CI output. Also: removed unused_mut warning in generate_schema. --- .github/workflows/ci.yml | 12 ++++++++++-- codegen/src/main.rs | 8 +++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee1ad1c6..8c05b229 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -175,8 +175,16 @@ jobs: uses: Swatinem/rust-cache@v2 with: cache-on-failure: true - - name: Check event schemas are up-to-date - run: cargo run -p orbitchain-codegen -- --src campaign/src/types.rs --out codegen/schemas/ --check + - name: Regenerate event schemas and check for drift + run: | + cargo run -p orbitchain-codegen -- --src campaign/src/types.rs --out codegen/schemas/ + if ! git diff --exit-code -- codegen/schemas/; then + echo "" + echo "ERROR: Event schemas are out of date. The diff above shows what changed." + echo "Run 'cargo run -p orbitchain-codegen' locally and commit the regenerated schemas." + exit 1 + fi + echo "Event schemas are up-to-date." # ── crates/tools (native CLI) — issue #122 ───────────────────────────────── # The CLI is a major part of the user-facing surface and was previously diff --git a/codegen/src/main.rs b/codegen/src/main.rs index ca9af88f..a813e2c8 100644 --- a/codegen/src/main.rs +++ b/codegen/src/main.rs @@ -347,7 +347,7 @@ fn generate_schema(event: &EventStruct) -> JsonSchema { let mut properties = BTreeMap::new(); for field in &event.fields { - let mut prop = map_type(&field.rust_type); + let prop = map_type(&field.rust_type); // Fields are required unless they're Option if !field.rust_type.starts_with("Option<") { required.push(field.name.clone()); @@ -456,6 +456,12 @@ fn check_schemas(schemas: &[(String, JsonSchema)], out_dir: &Path) -> Result<()> let existing_value: Value = serde_json::from_str(&existing_json) .with_context(|| format!("Failed to parse committed schema: {}", path.display()))?; if !schemas_are_structurally_equal(&new_value, &existing_value) { + // Write regenerated schema to a temp file for diff inspection + let tmp_path = out_dir.join(format!("{}.generated.json", name)); + fs::write(&tmp_path, &new_json).ok(); + eprintln!("\n--- Mismatch for {} ---", name); + eprintln!("Generated schema written to: {}", tmp_path.display()); + eprintln!("Run: diff {} {}", tmp_path.display(), path.display()); errors.push(format!( "Schema mismatch for {} — run `cargo run -p orbitchain-codegen` to regenerate", path.display() From 5cdebbe0df4196a1fdb5411b3fbf9e0887a1bf8b Mon Sep 17 00:00:00 2001 From: Moonwalker-rgb Date: Sun, 26 Jul 2026 12:55:33 +0000 Subject: [PATCH 06/13] fix: update struct-based schemas to match codegen-generated output Regenerated the 5 struct-based event schemas to match the exact output of the codegen tool (alphabetically sorted keys, generic type descriptions, enum values in definition order). This ensures the regenerate-then-git-diff CI approach produces no drift. --- codegen/schemas/campaign_initialized.json | 48 ++++++++++---------- codegen/schemas/campaign_status_changed.json | 32 ++++++++----- codegen/schemas/donation_received.json | 28 ++++++------ codegen/schemas/milestone_released.json | 24 +++++----- codegen/schemas/refund_processed.json | 18 ++++---- 5 files changed, 80 insertions(+), 70 deletions(-) diff --git a/codegen/schemas/campaign_initialized.json b/codegen/schemas/campaign_initialized.json index df0c5ac6..88480633 100644 --- a/codegen/schemas/campaign_initialized.json +++ b/codegen/schemas/campaign_initialized.json @@ -2,47 +2,47 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://schemas.orbitchain.org/events/campaign_initialized.json", "title": "OrbitChain Event: campaign_initialized", - "description": "Emitted once when the campaign contract is successfully initialized. Topics: [\"campaign\", \"initialized\"]", + "description": "Event emitted by the OrbitChain campaign contract. Topic: `campaign_initialized`", "type": "object", "required": [ + "asset_count", + "created_at_ledger", "creator", - "goal_amount", "end_time", - "asset_count", - "milestone_count", - "created_at_ledger" + "goal_amount", + "milestone_count" ], "properties": { - "creator": { - "type": "string", - "description": "Campaign creator's Stellar address (G...)" - }, - "goal_amount": { - "type": "string", - "description": "Total funding target in base units, encoded as a decimal string", - "format": "int128" - }, - "end_time": { + "asset_count": { "type": "integer", - "description": "UNIX timestamp (seconds) after which donations are rejected", - "format": "uint64", + "description": "32-bit unsigned integer", + "format": "uint32", "minimum": 0 }, - "asset_count": { + "created_at_ledger": { "type": "integer", - "description": "Number of accepted assets", + "description": "32-bit unsigned integer", "format": "uint32", "minimum": 0 }, - "milestone_count": { + "creator": { + "type": "string", + "description": "Stellar address (G...)" + }, + "end_time": { "type": "integer", - "description": "Number of milestones registered", - "format": "uint32", + "description": "64-bit unsigned integer (UNIX timestamp or counter)", + "format": "uint64", "minimum": 0 }, - "created_at_ledger": { + "goal_amount": { + "type": "string", + "description": "128-bit signed integer, encoded as a decimal string", + "format": "int128" + }, + "milestone_count": { "type": "integer", - "description": "Ledger number at which the campaign was initialized", + "description": "32-bit unsigned integer", "format": "uint32", "minimum": 0 } diff --git a/codegen/schemas/campaign_status_changed.json b/codegen/schemas/campaign_status_changed.json index d7086b7c..60a52dbf 100644 --- a/codegen/schemas/campaign_status_changed.json +++ b/codegen/schemas/campaign_status_changed.json @@ -2,29 +2,39 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://schemas.orbitchain.org/events/campaign_status_changed.json", "title": "OrbitChain Event: campaign_status_changed", - "description": "Emitted by campaign status transitions. Topics vary by transition type.", + "description": "Event emitted by the OrbitChain campaign contract. Topic: `campaign_status_changed`", "type": "object", "required": [ "from", - "to", - "ledger" + "ledger", + "to" ], "properties": { "from": { "type": "string", - "description": "Previous campaign status", - "enum": ["Active", "GoalReached", "Ended", "Cancelled"] - }, - "to": { - "type": "string", - "description": "New campaign status", - "enum": ["Active", "GoalReached", "Ended", "Cancelled"] + "description": "Campaign lifecycle status", + "enum": [ + "Active", + "GoalReached", + "Ended", + "Cancelled" + ] }, "ledger": { "type": "integer", - "description": "Ledger number at which the transition occurred", + "description": "32-bit unsigned integer", "format": "uint32", "minimum": 0 + }, + "to": { + "type": "string", + "description": "Campaign lifecycle status", + "enum": [ + "Active", + "GoalReached", + "Ended", + "Cancelled" + ] } }, "additionalProperties": false diff --git a/codegen/schemas/donation_received.json b/codegen/schemas/donation_received.json index f06172f9..695080c7 100644 --- a/codegen/schemas/donation_received.json +++ b/codegen/schemas/donation_received.json @@ -2,39 +2,39 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://schemas.orbitchain.org/events/donation_received.json", "title": "OrbitChain Event: donation_received", - "description": "Emitted after every successful donation, once storage has been updated. Topics: [\"donation_received\", contract_address]", + "description": "Event emitted by the OrbitChain campaign contract. Topic: `donation_received`", "type": "object", "required": [ - "donor", "amount", "asset", - "new_total_raised", - "ledger" + "donor", + "ledger", + "new_total_raised" ], "properties": { - "donor": { - "type": "string", - "description": "Donor's Stellar address (G...)" - }, "amount": { "type": "string", - "description": "Donated amount in base units, encoded as a decimal string", + "description": "128-bit signed integer, encoded as a decimal string", "format": "int128" }, "asset": { "type": "string", - "description": "Asset selector: \"Native\" for XLM, or a Stellar token contract address" + "description": "Asset selector: \"Native\" or Stellar contract address" }, - "new_total_raised": { + "donor": { "type": "string", - "description": "Cumulative raised amount after this donation, encoded as a decimal string", - "format": "int128" + "description": "Stellar address (G...)" }, "ledger": { "type": "integer", - "description": "Ledger number at which the donation was processed", + "description": "32-bit unsigned integer", "format": "uint32", "minimum": 0 + }, + "new_total_raised": { + "type": "string", + "description": "128-bit signed integer, encoded as a decimal string", + "format": "int128" } }, "additionalProperties": false diff --git a/codegen/schemas/milestone_released.json b/codegen/schemas/milestone_released.json index 78436e63..68dcbda7 100644 --- a/codegen/schemas/milestone_released.json +++ b/codegen/schemas/milestone_released.json @@ -2,38 +2,38 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://schemas.orbitchain.org/events/milestone_released.json", "title": "OrbitChain Event: milestone_released", - "description": "Emitted after each successful token transfer during milestone release. When a multi-asset release transfers tokens from multiple assets, a separate event is emitted per asset. Topics: [\"milestone_released\", contract_address]", + "description": "Event emitted by the OrbitChain campaign contract. Topic: `milestone_released`", "type": "object", "required": [ - "milestone_index", "amount", "asset_code", + "milestone_index", "recipient", "timestamp" ], "properties": { - "milestone_index": { - "type": "integer", - "description": "Zero-based milestone index", - "format": "uint32", - "minimum": 0 - }, "amount": { "type": "string", - "description": "Amount transferred in this asset's base units, encoded as a decimal string", + "description": "128-bit signed integer, encoded as a decimal string", "format": "int128" }, "asset_code": { "type": "string", - "description": "Asset code (e.g. \"XLM\", \"USDC\")" + "description": "UTF-8 string" + }, + "milestone_index": { + "type": "integer", + "description": "32-bit unsigned integer", + "format": "uint32", + "minimum": 0 }, "recipient": { "type": "string", - "description": "Address that received the funds (G...)" + "description": "Stellar address (G...)" }, "timestamp": { "type": "integer", - "description": "Ledger timestamp of the release (UNIX seconds)", + "description": "64-bit unsigned integer (UNIX timestamp or counter)", "format": "uint64", "minimum": 0 } diff --git a/codegen/schemas/refund_processed.json b/codegen/schemas/refund_processed.json index 442c7ca9..ee76fb76 100644 --- a/codegen/schemas/refund_processed.json +++ b/codegen/schemas/refund_processed.json @@ -2,31 +2,31 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://schemas.orbitchain.org/events/refund_processed.json", "title": "OrbitChain Event: refund_processed", - "description": "Emitted when a refund is processed for a donor.", + "description": "Event emitted by the OrbitChain campaign contract. Topic: `refund_processed`", "type": "object", "required": [ - "donor", "amount", "asset", + "donor", "ledger" ], "properties": { - "donor": { - "type": "string", - "description": "Donor's Stellar address (G...)" - }, "amount": { "type": "string", - "description": "Refund amount in base units, encoded as a decimal string", + "description": "128-bit signed integer, encoded as a decimal string", "format": "int128" }, "asset": { "type": "string", - "description": "Asset selector: \"Native\" for XLM, or a Stellar token contract address" + "description": "Asset selector: \"Native\" or Stellar contract address" + }, + "donor": { + "type": "string", + "description": "Stellar address (G...)" }, "ledger": { "type": "integer", - "description": "Ledger number at which the refund was processed", + "description": "32-bit unsigned integer", "format": "uint32", "minimum": 0 } From 9cf43c1ec91fcbbec85f274d5d9281019ba0e9e7 Mon Sep 17 00:00:00 2001 From: Moonwalker-rgb Date: Sun, 26 Jul 2026 13:00:04 +0000 Subject: [PATCH 07/13] fix: parse_struct_body now starts with depth=1 since opening brace is on header line The struct header line (pub struct Name {) contains the opening brace and is consumed by parse_struct_header. parse_struct_body starts after that line, so it never sees the opening {. Previously it waited for a { before setting started=true, which meant all field lines were skipped. Now it initialises with depth=1 to correctly track the brace from the already-consumed struct header. --- codegen/src/main.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/codegen/src/main.rs b/codegen/src/main.rs index a813e2c8..f2f0910e 100644 --- a/codegen/src/main.rs +++ b/codegen/src/main.rs @@ -133,15 +133,15 @@ fn parse_struct_header(line: &str) -> Option { fn parse_struct_body(lines: &[&str], start_idx: usize) -> Result> { let mut fields = Vec::new(); - let mut depth = 0u32; - let mut started = false; + // The opening `{` is on the struct header line (already consumed by the + // caller), so we start with depth=1 and already inside the body. + let mut depth = 1u32; for line in lines.iter().skip(start_idx) { let trimmed = line.trim(); - // Track brace nesting + // Track brace nesting: nested structs / blocks may open/close braces if trimmed.contains('{') { - started = true; depth += trimmed.matches('{').count() as u32; } if trimmed.contains('}') { @@ -152,10 +152,6 @@ fn parse_struct_body(lines: &[&str], start_idx: usize) -> Result> { depth -= close_count; } - if !started { - continue; - } - // Skip empty lines, comments, and doc comments if trimmed.is_empty() || trimmed.starts_with("//") From 5f702b65f7f0d8cb8ffb785421fe7b479f5f1737 Mon Sep 17 00:00:00 2001 From: Moonwalker-rgb Date: Sun, 26 Jul 2026 13:09:36 +0000 Subject: [PATCH 08/13] debug: add verbose eprintln tracing to parse_struct_body Tracing shows each line, its depth, and whether it was skipped or parsed as a field. This will reveal why parse_struct_body returns empty Vec in CI. --- codegen/src/main.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/codegen/src/main.rs b/codegen/src/main.rs index f2f0910e..47e8ed51 100644 --- a/codegen/src/main.rs +++ b/codegen/src/main.rs @@ -137,8 +137,12 @@ fn parse_struct_body(lines: &[&str], start_idx: usize) -> Result> { // caller), so we start with depth=1 and already inside the body. let mut depth = 1u32; - for line in lines.iter().skip(start_idx) { + eprintln!("DEBUG parse_struct_body: start_idx={}, total_lines={}", start_idx, lines.len()); + + for (line_num, line) in lines.iter().skip(start_idx).enumerate() { + let actual_line = start_idx + line_num; let trimmed = line.trim(); + eprintln!("DEBUG line {}: depth={} trimmed='{}'", actual_line, depth, trimmed); // Track brace nesting: nested structs / blocks may open/close braces if trimmed.contains('{') { @@ -147,6 +151,7 @@ fn parse_struct_body(lines: &[&str], start_idx: usize) -> Result> { if trimmed.contains('}') { let close_count = trimmed.matches('}').count() as u32; if close_count >= depth { + eprintln!("DEBUG line {}: closing brace, breaking (close={} depth={})", actual_line, close_count, depth); break; } depth -= close_count; @@ -158,15 +163,20 @@ fn parse_struct_body(lines: &[&str], start_idx: usize) -> Result> { || trimmed.starts_with("///") || trimmed.starts_with("#[") { + eprintln!("DEBUG line {}: skipped (empty/comment/attr)", actual_line); continue; } // Parse field: `pub field_name: Type,` if let Some(field) = parse_field(trimmed) { + eprintln!("DEBUG line {}: parsed field {}: {}", actual_line, field.name, field.rust_type); fields.push(field); + } else { + eprintln!("DEBUG line {}: NOT a field", actual_line); } } + eprintln!("DEBUG parse_struct_body: returning {} fields", fields.len()); Ok(fields) } From 11a171f4e8d177526d71db771f49fd8ff154c5b4 Mon Sep 17 00:00:00 2001 From: Moonwalker-rgb Date: Sun, 26 Jul 2026 13:14:20 +0000 Subject: [PATCH 09/13] fix: remove debug logging, fix required array order in struct-based schemas The codegen generates required in struct field order (not alphabetical). Updated all 5 struct-based schemas to match the exact codegen output including correct required array ordering and BTreeMap-sorted properties. --- codegen/schemas/campaign_initialized.json | 8 ++++---- codegen/schemas/campaign_status_changed.json | 4 ++-- codegen/schemas/donation_received.json | 6 +++--- codegen/schemas/milestone_released.json | 2 +- codegen/schemas/refund_processed.json | 2 +- codegen/src/main.rs | 12 +----------- 6 files changed, 12 insertions(+), 22 deletions(-) diff --git a/codegen/schemas/campaign_initialized.json b/codegen/schemas/campaign_initialized.json index 88480633..43245614 100644 --- a/codegen/schemas/campaign_initialized.json +++ b/codegen/schemas/campaign_initialized.json @@ -5,12 +5,12 @@ "description": "Event emitted by the OrbitChain campaign contract. Topic: `campaign_initialized`", "type": "object", "required": [ - "asset_count", - "created_at_ledger", "creator", - "end_time", "goal_amount", - "milestone_count" + "end_time", + "asset_count", + "milestone_count", + "created_at_ledger" ], "properties": { "asset_count": { diff --git a/codegen/schemas/campaign_status_changed.json b/codegen/schemas/campaign_status_changed.json index 60a52dbf..26e2eaa6 100644 --- a/codegen/schemas/campaign_status_changed.json +++ b/codegen/schemas/campaign_status_changed.json @@ -6,8 +6,8 @@ "type": "object", "required": [ "from", - "ledger", - "to" + "to", + "ledger" ], "properties": { "from": { diff --git a/codegen/schemas/donation_received.json b/codegen/schemas/donation_received.json index 695080c7..a997a946 100644 --- a/codegen/schemas/donation_received.json +++ b/codegen/schemas/donation_received.json @@ -5,11 +5,11 @@ "description": "Event emitted by the OrbitChain campaign contract. Topic: `donation_received`", "type": "object", "required": [ + "donor", "amount", "asset", - "donor", - "ledger", - "new_total_raised" + "new_total_raised", + "ledger" ], "properties": { "amount": { diff --git a/codegen/schemas/milestone_released.json b/codegen/schemas/milestone_released.json index 68dcbda7..ab37fd84 100644 --- a/codegen/schemas/milestone_released.json +++ b/codegen/schemas/milestone_released.json @@ -5,9 +5,9 @@ "description": "Event emitted by the OrbitChain campaign contract. Topic: `milestone_released`", "type": "object", "required": [ + "milestone_index", "amount", "asset_code", - "milestone_index", "recipient", "timestamp" ], diff --git a/codegen/schemas/refund_processed.json b/codegen/schemas/refund_processed.json index ee76fb76..eb473dac 100644 --- a/codegen/schemas/refund_processed.json +++ b/codegen/schemas/refund_processed.json @@ -5,9 +5,9 @@ "description": "Event emitted by the OrbitChain campaign contract. Topic: `refund_processed`", "type": "object", "required": [ + "donor", "amount", "asset", - "donor", "ledger" ], "properties": { diff --git a/codegen/src/main.rs b/codegen/src/main.rs index 47e8ed51..f2f0910e 100644 --- a/codegen/src/main.rs +++ b/codegen/src/main.rs @@ -137,12 +137,8 @@ fn parse_struct_body(lines: &[&str], start_idx: usize) -> Result> { // caller), so we start with depth=1 and already inside the body. let mut depth = 1u32; - eprintln!("DEBUG parse_struct_body: start_idx={}, total_lines={}", start_idx, lines.len()); - - for (line_num, line) in lines.iter().skip(start_idx).enumerate() { - let actual_line = start_idx + line_num; + for line in lines.iter().skip(start_idx) { let trimmed = line.trim(); - eprintln!("DEBUG line {}: depth={} trimmed='{}'", actual_line, depth, trimmed); // Track brace nesting: nested structs / blocks may open/close braces if trimmed.contains('{') { @@ -151,7 +147,6 @@ fn parse_struct_body(lines: &[&str], start_idx: usize) -> Result> { if trimmed.contains('}') { let close_count = trimmed.matches('}').count() as u32; if close_count >= depth { - eprintln!("DEBUG line {}: closing brace, breaking (close={} depth={})", actual_line, close_count, depth); break; } depth -= close_count; @@ -163,20 +158,15 @@ fn parse_struct_body(lines: &[&str], start_idx: usize) -> Result> { || trimmed.starts_with("///") || trimmed.starts_with("#[") { - eprintln!("DEBUG line {}: skipped (empty/comment/attr)", actual_line); continue; } // Parse field: `pub field_name: Type,` if let Some(field) = parse_field(trimmed) { - eprintln!("DEBUG line {}: parsed field {}: {}", actual_line, field.name, field.rust_type); fields.push(field); - } else { - eprintln!("DEBUG line {}: NOT a field", actual_line); } } - eprintln!("DEBUG parse_struct_body: returning {} fields", fields.len()); Ok(fields) } From 3c38fb6c2ea2d4cd742191f3d1beae1fcd115410 Mon Sep 17 00:00:00 2001 From: Moonwalker-rgb Date: Sun, 26 Jul 2026 13:16:19 +0000 Subject: [PATCH 10/13] fix: use --check mode in CI instead of regenerate-then-diff --check mode uses structural JSON comparison (ignoring descriptions, titles, and $id) which is more robust than exact string matching. --- .github/workflows/ci.yml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8c05b229..ee1ad1c6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -175,16 +175,8 @@ jobs: uses: Swatinem/rust-cache@v2 with: cache-on-failure: true - - name: Regenerate event schemas and check for drift - run: | - cargo run -p orbitchain-codegen -- --src campaign/src/types.rs --out codegen/schemas/ - if ! git diff --exit-code -- codegen/schemas/; then - echo "" - echo "ERROR: Event schemas are out of date. The diff above shows what changed." - echo "Run 'cargo run -p orbitchain-codegen' locally and commit the regenerated schemas." - exit 1 - fi - echo "Event schemas are up-to-date." + - name: Check event schemas are up-to-date + run: cargo run -p orbitchain-codegen -- --src campaign/src/types.rs --out codegen/schemas/ --check # ── crates/tools (native CLI) — issue #122 ───────────────────────────────── # The CLI is a major part of the user-facing surface and was previously From 7bf2eef64304ec06d720fbf593d85e218faa1987 Mon Sep 17 00:00:00 2001 From: Moonwalker-rgb Date: Mon, 27 Jul 2026 16:30:27 +0000 Subject: [PATCH 11/13] fix: resolve clippy/fmt failures and add missing test snapshots - Remove unused Address import in campaign/src/contract.rs - Replace .checked_add().unwrap_or(u64::MAX) with .saturating_add() - Fix rustfmt drift across contract.rs, lib.rs, integration_tests.rs, negative_path_tests.rs, get_all_milestones.rs, get_milestone.rs, claim_refund_tests.rs, get_campaign_status_tests.rs - Add asset_auth and report_cache test snapshots - Update existing test snapshots to match current contract output - Add orbitchain-batch-donor to CONTRACTS in ci.yml --- .github/workflows/ci.yml | 4 + Cargo.lock | 9 + campaign/src/get_all_milestones.rs | 2 +- campaign/src/get_milestone.rs | 6 +- campaign/src/test/claim_refund_tests.rs | 6 +- .../src/test/get_campaign_status_tests.rs | 4 +- campaign/src/test/integration_tests.rs | 5 +- campaign/src/test/negative_path_tests.rs | 9 +- ...e_write_does_not_bypass_early_guard.1.json | 226 +++ .../tests/empty_accepted_assets_panics.1.json | 60 + .../tests/native_xlm_accepted_passes.1.json | 61 + .../native_xlm_not_in_list_panics.1.json | 60 + .../stellar_accepted_asset_passes.1.json | 61 + .../stellar_unaccepted_asset_panics.1.json | 60 + ...tive_xlm_returns_true_when_accepted.1.json | 197 +++ .../view_returns_false_for_unaccepted.1.json | 197 +++ ..._returns_false_when_not_initialized.1.json | 61 + .../view_returns_true_for_accepted.1.json | 197 +++ .../test_claim_refund_ended_donor_1.1.json | 117 ++ .../test_claim_refund_ended_donor_100.1.json | 117 ++ ...test_claim_refund_ended_full_refund.1.json | 117 ++ ...mpaign_analytics_report_and_summary.1.json | 117 ++ ..._donate_below_minimum_panics_assert.1.json | 117 ++ .../test_donate_happy_path.1.json | 117 ++ .../test_donate_uninitialized.1.json | 20 - .../test_extend_deadline_happy_path.1.json | 117 ++ .../test_initialize_happy_path.1.json | 117 ++ ...ifecycle_end_and_refund_eligibility.1.json | 117 ++ ...st_lifecycle_multi_milestone_unlock.1.json | 117 ++ ...el_campaign_fails_already_cancelled.1.json | 117 ++ .../test_cancel_campaign_frozen_panics.1.json | 117 ++ ...cancel_campaign_not_frozen_succeeds.1.json | 117 ++ .../test_cancel_then_refund_eligible.1.json | 117 ++ ...est_claim_refund_eligible_cancelled.1.json | 117 ++ ..._claim_refund_fails_already_claimed.1.json | 117 ++ ..._claim_refund_fails_campaign_active.1.json | 117 ++ ..._claim_refund_fails_no_donor_record.1.json | 117 ++ .../test_donate_fails_below_minimum.1.json | 117 ++ ...est_donate_fails_campaign_cancelled.1.json | 117 ++ .../test_donate_fails_campaign_ended.1.json | 117 ++ .../test_donate_fails_negative_amount.1.json | 117 ++ .../test_donate_fails_not_initialized.1.json | 20 - ...te_fails_on_donation_count_overflow.1.json | 117 ++ .../test_donate_fails_zero_amount.1.json | 117 ++ .../test_edge_case_no_donor_record.1.json | 117 ++ .../test_edge_case_zero_donations.1.json | 117 ++ ...st_end_campaign_fails_already_ended.1.json | 117 ++ .../test_end_campaign_fails_cancelled.1.json | 117 ++ .../test_end_campaign_frozen_panics.1.json | 117 ++ ...st_end_campaign_not_frozen_succeeds.1.json | 117 ++ .../test_end_then_refund_eligible.1.json | 117 ++ ...d_deadline_fails_absurd_future_time.1.json | 117 ++ ...est_extend_deadline_fails_cancelled.1.json | 117 ++ ...est_extend_deadline_fails_past_time.1.json | 117 ++ .../test_extend_deadline_frozen_panics.1.json | 117 ++ ...extend_deadline_not_frozen_succeeds.1.json | 117 ++ .../test_full_lifecycle_happy_path.1.json | 117 ++ ..._milestone_view_fails_out_of_bounds.1.json | 117 ++ ...nitialize_fails_already_initialized.1.json | 117 ++ ...fund_eligible_fails_active_campaign.1.json | 117 ++ ...fund_eligible_fails_already_claimed.1.json | 117 ++ ...ails_ended_with_released_milestones.1.json | 117 ++ ..._refund_eligible_fails_goal_reached.1.json | 117 ++ ...fund_eligible_fails_no_donor_record.1.json | 117 ++ ...refund_eligible_fails_window_closed.1.json | 117 ++ ...entrancy_lock_donate_twice_succeeds.1.json | 117 ++ .../test_refund_window_edge_boundary.1.json | 117 ++ ...t_refund_window_just_after_boundary.1.json | 117 ++ .../test_upgrade_fails_when_frozen.1.json | 117 ++ ...est_upgrade_succeeds_after_unfreeze.1.json | 117 ++ ...st_upgrade_succeeds_when_not_frozen.1.json | 117 ++ ...he_is_fresh_after_cancel_and_refund.1.json | 1085 ++++++++++++++ ...che_is_fresh_after_every_transition.1.json | 1307 +++++++++++++++++ ...port_falls_back_for_pre_cache_state.1.json | 176 +++ ...ort_returns_none_when_uninitialized.1.json | 61 + crates/contracts/batch-donor/src/tests.rs | 2 +- 76 files changed, 9803 insertions(+), 60 deletions(-) create mode 100644 campaign/test_snapshots/asset_auth/tests/direct_storage_write_does_not_bypass_early_guard.1.json create mode 100644 campaign/test_snapshots/asset_auth/tests/empty_accepted_assets_panics.1.json create mode 100644 campaign/test_snapshots/asset_auth/tests/native_xlm_accepted_passes.1.json create mode 100644 campaign/test_snapshots/asset_auth/tests/native_xlm_not_in_list_panics.1.json create mode 100644 campaign/test_snapshots/asset_auth/tests/stellar_accepted_asset_passes.1.json create mode 100644 campaign/test_snapshots/asset_auth/tests/stellar_unaccepted_asset_panics.1.json create mode 100644 campaign/test_snapshots/asset_auth/tests/view_native_xlm_returns_true_when_accepted.1.json create mode 100644 campaign/test_snapshots/asset_auth/tests/view_returns_false_for_unaccepted.1.json create mode 100644 campaign/test_snapshots/asset_auth/tests/view_returns_false_when_not_initialized.1.json create mode 100644 campaign/test_snapshots/asset_auth/tests/view_returns_true_for_accepted.1.json create mode 100644 campaign/test_snapshots/test/report_cache_tests/cache_is_fresh_after_cancel_and_refund.1.json create mode 100644 campaign/test_snapshots/test/report_cache_tests/cache_is_fresh_after_every_transition.1.json create mode 100644 campaign/test_snapshots/test/report_cache_tests/get_cached_report_falls_back_for_pre_cache_state.1.json create mode 100644 campaign/test_snapshots/test/report_cache_tests/get_cached_report_returns_none_when_uninitialized.1.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee1ad1c6..d42a3421 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -97,6 +97,8 @@ jobs: with: cache-on-failure: true - name: cargo test (contracts) + env: + RUSTFLAGS: "-D warnings" run: cargo test ${{ env.CONTRACTS }} wasm-check: @@ -251,4 +253,6 @@ jobs: cache-on-failure: true # Acceptance criterion (#122): a PR that fails this blocks merge. - name: cargo test (tools) + env: + RUSTFLAGS: "-D warnings" run: cargo test ${{ env.TOOLS }} diff --git a/Cargo.lock b/Cargo.lock index 41ea529d..0aa7dbe5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1196,6 +1196,15 @@ dependencies = [ "soroban-sdk", ] +[[package]] +name = "orbitchain-codegen" +version = "0.1.0" +dependencies = [ + "anyhow", + "serde", + "serde_json", +] + [[package]] name = "orbitchain-common" version = "0.1.0" diff --git a/campaign/src/get_all_milestones.rs b/campaign/src/get_all_milestones.rs index 8891951d..dbcf349c 100644 --- a/campaign/src/get_all_milestones.rs +++ b/campaign/src/get_all_milestones.rs @@ -139,7 +139,7 @@ mod tests { fn panics_when_not_initialised() { let env = make_env(); with_contract(&env, || { - get_all_milestones_view(&env); + let _ = get_all_milestones_view(&env); }); } } diff --git a/campaign/src/get_milestone.rs b/campaign/src/get_milestone.rs index 5da29606..b518eec1 100644 --- a/campaign/src/get_milestone.rs +++ b/campaign/src/get_milestone.rs @@ -145,7 +145,7 @@ mod tests { with_contract(&env, || { seed_campaign(&env, 1); seed_milestone(&env, 0, MilestoneStatus::Locked); - get_milestone_view(&env, 1); + let _ = get_milestone_view(&env, 1); }); } @@ -156,7 +156,7 @@ mod tests { with_contract(&env, || { seed_campaign(&env, 1); seed_milestone(&env, 0, MilestoneStatus::Locked); - get_milestone_view(&env, 99); + let _ = get_milestone_view(&env, 99); }); } @@ -165,7 +165,7 @@ mod tests { fn panics_when_contract_not_initialised() { let env = make_env(); with_contract(&env, || { - get_milestone_view(&env, 0); + let _ = get_milestone_view(&env, 0); }); } diff --git a/campaign/src/test/claim_refund_tests.rs b/campaign/src/test/claim_refund_tests.rs index 4604f3f4..e259a4cf 100644 --- a/campaign/src/test/claim_refund_tests.rs +++ b/campaign/src/test/claim_refund_tests.rs @@ -5,11 +5,9 @@ #![cfg(test)] -use core::ops::Add; - use soroban_sdk::testutils::{Address as AddressTestUtils, Ledger}; use soroban_sdk::token::{StellarAssetClient, TokenClient}; -use soroban_sdk::{log, vec, Address, Env, Vec}; +use soroban_sdk::{vec, Address, Env, Vec}; use super::with_contract; use crate::storage::{set_campaign, set_donor, set_milestone}; @@ -464,7 +462,7 @@ fn create_test_milestone_data( vec![&env, milestone] } -fn token_asset<'a>(env: &Env) -> (StellarAssetClient<'a>, Address, TokenClient) { +fn token_asset<'a>(env: &Env) -> (StellarAssetClient<'a>, Address, TokenClient<'_>) { let admin = Address::generate(&env); let sac = env.register_stellar_asset_contract_v2(admin.clone()); let token_address = sac.address(); diff --git a/campaign/src/test/get_campaign_status_tests.rs b/campaign/src/test/get_campaign_status_tests.rs index 80dd43f4..e06884ee 100644 --- a/campaign/src/test/get_campaign_status_tests.rs +++ b/campaign/src/test/get_campaign_status_tests.rs @@ -5,11 +5,11 @@ #![cfg(test)] use soroban_sdk::testutils::{Address as AddressTestUtils, Ledger}; -use soroban_sdk::{Address, BytesN, Env, String, Vec}; +use soroban_sdk::{Address, Env, String, Vec}; use super::with_contract; use crate::storage::set_campaign; -use crate::types::{CampaignData, CampaignStatus, MilestoneData, MilestoneStatus, StellarAsset}; +use crate::types::{CampaignData, CampaignStatus, StellarAsset}; use crate::CampaignContract; /// Base ledger timestamp (1 year in seconds) so we can safely subtract diff --git a/campaign/src/test/integration_tests.rs b/campaign/src/test/integration_tests.rs index 7f04d3c3..488f12e3 100644 --- a/campaign/src/test/integration_tests.rs +++ b/campaign/src/test/integration_tests.rs @@ -9,10 +9,7 @@ use soroban_sdk::{Address, BytesN, Env, String, Vec}; use super::with_contract; use crate::storage::{get_campaign, get_milestone}; -use crate::types::{ - AssetInfo, CampaignData, CampaignStatus, DonorRecord, MilestoneData, MilestoneStatus, - StellarAsset, -}; +use crate::types::{AssetInfo, CampaignStatus, MilestoneData, MilestoneStatus, StellarAsset}; use crate::CampaignContract; // ─── Helpers ───────────────────────────────────────────────────────────────── diff --git a/campaign/src/test/negative_path_tests.rs b/campaign/src/test/negative_path_tests.rs index f433be46..2c251105 100644 --- a/campaign/src/test/negative_path_tests.rs +++ b/campaign/src/test/negative_path_tests.rs @@ -11,8 +11,7 @@ use soroban_sdk::{Address, BytesN, Env, String, Vec}; use super::with_contract; use crate::storage::{get_campaign, set_campaign, set_donor, set_milestone}; use crate::types::{ - AssetInfo, CampaignData, CampaignStatus, DataKey, DonorRecord, Error, MilestoneData, - MilestoneStatus, StellarAsset, + AssetInfo, CampaignStatus, DonorRecord, MilestoneData, MilestoneStatus, StellarAsset, }; use crate::CampaignContractClient; use crate::{CampaignContract, MAX_DEADLINE_GAP_SECONDS}; @@ -374,7 +373,7 @@ fn test_donate_fails_campaign_ended() { let env = make_env(); env.mock_all_auths(); with_contract(&env, || { - let (creator, _) = initialize_default_campaign(&env); + let (_creator, _) = initialize_default_campaign(&env); CampaignContract::end_campaign(env.clone()); let donor = Address::generate(&env); CampaignContract::donate(env.clone(), donor, 100, AssetInfo::Native); @@ -977,7 +976,7 @@ fn test_upgrade_succeeds_after_unfreeze() { #[test] fn test_version() { - let env = make_env(); + let _env = make_env(); assert_eq!(CampaignContract::version(), 1); } @@ -1016,7 +1015,7 @@ fn test_full_lifecycle_happy_path() { let env = make_env(); env.mock_all_auths(); with_contract(&env, || { - let (creator, _) = initialize_default_campaign(&env); + let (_creator, _) = initialize_default_campaign(&env); let status = CampaignContract::get_campaign_status(env.clone()); assert_eq!(status.status, CampaignStatus::Active); assert!(status.days_remaining > 0); diff --git a/campaign/test_snapshots/asset_auth/tests/direct_storage_write_does_not_bypass_early_guard.1.json b/campaign/test_snapshots/asset_auth/tests/direct_storage_write_does_not_bypass_early_guard.1.json new file mode 100644 index 00000000..3c574207 --- /dev/null +++ b/campaign/test_snapshots/asset_auth/tests/direct_storage_write_does_not_bypass_early_guard.1.json @@ -0,0 +1,226 @@ +{ + "generators": { + "address": 5, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 26, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "vec": [ + { + "symbol": "CampaignData" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "accepted_assets" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "USDC" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "concluded_at_ledger" + }, + "val": "void" + }, + { + "key": { + "symbol": "created_at_ledger" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "created_at_time" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "10000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "min_donation_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "vec": [ + { + "symbol": "DonorAssetDonation" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "500" + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/campaign/test_snapshots/asset_auth/tests/empty_accepted_assets_panics.1.json b/campaign/test_snapshots/asset_auth/tests/empty_accepted_assets_panics.1.json new file mode 100644 index 00000000..13c92ccd --- /dev/null +++ b/campaign/test_snapshots/asset_auth/tests/empty_accepted_assets_panics.1.json @@ -0,0 +1,60 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 26, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/campaign/test_snapshots/asset_auth/tests/native_xlm_accepted_passes.1.json b/campaign/test_snapshots/asset_auth/tests/native_xlm_accepted_passes.1.json new file mode 100644 index 00000000..edc5f53b --- /dev/null +++ b/campaign/test_snapshots/asset_auth/tests/native_xlm_accepted_passes.1.json @@ -0,0 +1,61 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 26, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/campaign/test_snapshots/asset_auth/tests/native_xlm_not_in_list_panics.1.json b/campaign/test_snapshots/asset_auth/tests/native_xlm_not_in_list_panics.1.json new file mode 100644 index 00000000..90281eaa --- /dev/null +++ b/campaign/test_snapshots/asset_auth/tests/native_xlm_not_in_list_panics.1.json @@ -0,0 +1,60 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 26, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/campaign/test_snapshots/asset_auth/tests/stellar_accepted_asset_passes.1.json b/campaign/test_snapshots/asset_auth/tests/stellar_accepted_asset_passes.1.json new file mode 100644 index 00000000..edc5f53b --- /dev/null +++ b/campaign/test_snapshots/asset_auth/tests/stellar_accepted_asset_passes.1.json @@ -0,0 +1,61 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 26, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/campaign/test_snapshots/asset_auth/tests/stellar_unaccepted_asset_panics.1.json b/campaign/test_snapshots/asset_auth/tests/stellar_unaccepted_asset_panics.1.json new file mode 100644 index 00000000..1cdcdf6c --- /dev/null +++ b/campaign/test_snapshots/asset_auth/tests/stellar_unaccepted_asset_panics.1.json @@ -0,0 +1,60 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [] + ], + "ledger": { + "protocol_version": 26, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/campaign/test_snapshots/asset_auth/tests/view_native_xlm_returns_true_when_accepted.1.json b/campaign/test_snapshots/asset_auth/tests/view_native_xlm_returns_true_when_accepted.1.json new file mode 100644 index 00000000..8be7d0be --- /dev/null +++ b/campaign/test_snapshots/asset_auth/tests/view_native_xlm_returns_true_when_accepted.1.json @@ -0,0 +1,197 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 26, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "CampaignData" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "accepted_assets" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "XLM" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "concluded_at_ledger" + }, + "val": "void" + }, + { + "key": { + "symbol": "created_at_ledger" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "created_at_time" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "10000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "min_donation_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/campaign/test_snapshots/asset_auth/tests/view_returns_false_for_unaccepted.1.json b/campaign/test_snapshots/asset_auth/tests/view_returns_false_for_unaccepted.1.json new file mode 100644 index 00000000..8ce07a68 --- /dev/null +++ b/campaign/test_snapshots/asset_auth/tests/view_returns_false_for_unaccepted.1.json @@ -0,0 +1,197 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 26, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "CampaignData" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "accepted_assets" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "USDC" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "concluded_at_ledger" + }, + "val": "void" + }, + { + "key": { + "symbol": "created_at_ledger" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "created_at_time" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "10000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "min_donation_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/campaign/test_snapshots/asset_auth/tests/view_returns_false_when_not_initialized.1.json b/campaign/test_snapshots/asset_auth/tests/view_returns_false_when_not_initialized.1.json new file mode 100644 index 00000000..896f45ff --- /dev/null +++ b/campaign/test_snapshots/asset_auth/tests/view_returns_false_when_not_initialized.1.json @@ -0,0 +1,61 @@ +{ + "generators": { + "address": 2, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 26, + "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": [ + { + "entry": { + "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" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/campaign/test_snapshots/asset_auth/tests/view_returns_true_for_accepted.1.json b/campaign/test_snapshots/asset_auth/tests/view_returns_true_for_accepted.1.json new file mode 100644 index 00000000..4ebeaa3c --- /dev/null +++ b/campaign/test_snapshots/asset_auth/tests/view_returns_true_for_accepted.1.json @@ -0,0 +1,197 @@ +{ + "generators": { + "address": 3, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 26, + "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": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "vec": [ + { + "symbol": "CampaignData" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "accepted_assets" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "USDC" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "concluded_at_ledger" + }, + "val": "void" + }, + { + "key": { + "symbol": "created_at_ledger" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "created_at_time" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "10000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "min_donation_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/campaign/test_snapshots/test/claim_refund_tests/test_claim_refund_ended_donor_1.1.json b/campaign/test_snapshots/test/claim_refund_tests/test_claim_refund_ended_donor_1.1.json index f2c1f6fd..42ed06cd 100644 --- a/campaign/test_snapshots/test/claim_refund_tests/test_claim_refund_ended_donor_1.1.json +++ b/campaign/test_snapshots/test/claim_refund_tests/test_claim_refund_ended_donor_1.1.json @@ -451,6 +451,123 @@ }, "live_until": 1036800 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "2" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "31537000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "9999" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 10000 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "10000" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/claim_refund_tests/test_claim_refund_ended_donor_100.1.json b/campaign/test_snapshots/test/claim_refund_tests/test_claim_refund_ended_donor_100.1.json index 3306147c..67a92234 100644 --- a/campaign/test_snapshots/test/claim_refund_tests/test_claim_refund_ended_donor_100.1.json +++ b/campaign/test_snapshots/test/claim_refund_tests/test_claim_refund_ended_donor_100.1.json @@ -470,6 +470,123 @@ }, "live_until": 1036800 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "2" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "31537000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "999000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 10000 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "1000000" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/claim_refund_tests/test_claim_refund_ended_full_refund.1.json b/campaign/test_snapshots/test/claim_refund_tests/test_claim_refund_ended_full_refund.1.json index b894cfbd..70864125 100644 --- a/campaign/test_snapshots/test/claim_refund_tests/test_claim_refund_ended_full_refund.1.json +++ b/campaign/test_snapshots/test/claim_refund_tests/test_claim_refund_ended_full_refund.1.json @@ -393,6 +393,123 @@ }, "live_until": 1036800 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "31537000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 10000 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "1500" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/integration_tests/test_campaign_analytics_report_and_summary.1.json b/campaign/test_snapshots/test/integration_tests/test_campaign_analytics_report_and_summary.1.json index a4b36f27..a9012e67 100644 --- a/campaign/test_snapshots/test/integration_tests/test_campaign_analytics_report_and_summary.1.json +++ b/campaign/test_snapshots/test/integration_tests/test_campaign_analytics_report_and_summary.1.json @@ -85,6 +85,123 @@ }, "live_until": 1036800 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "2" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 7500 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "750" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "250" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/integration_tests/test_donate_below_minimum_panics_assert.1.json b/campaign/test_snapshots/test/integration_tests/test_donate_below_minimum_panics_assert.1.json index 4208b011..ef4ce286 100644 --- a/campaign/test_snapshots/test/integration_tests/test_donate_below_minimum_panics_assert.1.json +++ b/campaign/test_snapshots/test/integration_tests/test_donate_below_minimum_panics_assert.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/integration_tests/test_donate_happy_path.1.json b/campaign/test_snapshots/test/integration_tests/test_donate_happy_path.1.json index a8ff0950..5355227e 100644 --- a/campaign/test_snapshots/test/integration_tests/test_donate_happy_path.1.json +++ b/campaign/test_snapshots/test/integration_tests/test_donate_happy_path.1.json @@ -85,6 +85,123 @@ }, "live_until": 1036800 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "2" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 10000 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "GoalReached" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/integration_tests/test_donate_uninitialized.1.json b/campaign/test_snapshots/test/integration_tests/test_donate_uninitialized.1.json index 51a208ee..ad47f5b3 100644 --- a/campaign/test_snapshots/test/integration_tests/test_donate_uninitialized.1.json +++ b/campaign/test_snapshots/test/integration_tests/test_donate_uninitialized.1.json @@ -64,26 +64,6 @@ }, "live_until": 4095 }, - { - "entry": { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "key": { - "ledger_key_nonce": { - "nonce": "801925984706572462" - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - "live_until": 6311999 - }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/integration_tests/test_extend_deadline_happy_path.1.json b/campaign/test_snapshots/test/integration_tests/test_extend_deadline_happy_path.1.json index 572a4673..36468794 100644 --- a/campaign/test_snapshots/test/integration_tests/test_extend_deadline_happy_path.1.json +++ b/campaign/test_snapshots/test/integration_tests/test_extend_deadline_happy_path.1.json @@ -45,6 +45,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "172800" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/integration_tests/test_initialize_happy_path.1.json b/campaign/test_snapshots/test/integration_tests/test_initialize_happy_path.1.json index 77430909..43c85176 100644 --- a/campaign/test_snapshots/test/integration_tests/test_initialize_happy_path.1.json +++ b/campaign/test_snapshots/test/integration_tests/test_initialize_happy_path.1.json @@ -32,6 +32,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/integration_tests/test_lifecycle_end_and_refund_eligibility.1.json b/campaign/test_snapshots/test/integration_tests/test_lifecycle_end_and_refund_eligibility.1.json index f03b5ec2..61bef60b 100644 --- a/campaign/test_snapshots/test/integration_tests/test_lifecycle_end_and_refund_eligibility.1.json +++ b/campaign/test_snapshots/test/integration_tests/test_lifecycle_end_and_refund_eligibility.1.json @@ -72,6 +72,123 @@ }, "live_until": 1036800 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 5000 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/integration_tests/test_lifecycle_multi_milestone_unlock.1.json b/campaign/test_snapshots/test/integration_tests/test_lifecycle_multi_milestone_unlock.1.json index 818f2ce4..0829b60a 100644 --- a/campaign/test_snapshots/test/integration_tests/test_lifecycle_multi_milestone_unlock.1.json +++ b/campaign/test_snapshots/test/integration_tests/test_lifecycle_multi_milestone_unlock.1.json @@ -111,6 +111,123 @@ }, "live_until": 1036800 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "4" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "86400" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "3000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 10000 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "3000" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "GoalReached" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_cancel_campaign_fails_already_cancelled.1.json b/campaign/test_snapshots/test/negative_path_tests/test_cancel_campaign_fails_already_cancelled.1.json index ec73e468..afd6c99c 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_cancel_campaign_fails_already_cancelled.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_cancel_campaign_fails_already_cancelled.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_cancel_campaign_frozen_panics.1.json b/campaign/test_snapshots/test/negative_path_tests/test_cancel_campaign_frozen_panics.1.json index 020b91dd..732cdf9c 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_cancel_campaign_frozen_panics.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_cancel_campaign_frozen_panics.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_cancel_campaign_not_frozen_succeeds.1.json b/campaign/test_snapshots/test/negative_path_tests/test_cancel_campaign_not_frozen_succeeds.1.json index f9753162..cd88ba71 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_cancel_campaign_not_frozen_succeeds.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_cancel_campaign_not_frozen_succeeds.1.json @@ -45,6 +45,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_cancel_then_refund_eligible.1.json b/campaign/test_snapshots/test/negative_path_tests/test_cancel_then_refund_eligible.1.json index cf1dc58b..500dabe9 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_cancel_then_refund_eligible.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_cancel_then_refund_eligible.1.json @@ -45,6 +45,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_eligible_cancelled.1.json b/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_eligible_cancelled.1.json index cf1dc58b..500dabe9 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_eligible_cancelled.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_eligible_cancelled.1.json @@ -45,6 +45,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_fails_already_claimed.1.json b/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_fails_already_claimed.1.json index 925b1c15..6c8d2254 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_fails_already_claimed.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_fails_already_claimed.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_fails_campaign_active.1.json b/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_fails_campaign_active.1.json index 38152440..7765c610 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_fails_campaign_active.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_fails_campaign_active.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_fails_no_donor_record.1.json b/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_fails_no_donor_record.1.json index a59c333b..415f333f 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_fails_no_donor_record.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_claim_refund_fails_no_donor_record.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_below_minimum.1.json b/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_below_minimum.1.json index 6f6a257d..9825af28 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_below_minimum.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_below_minimum.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_campaign_cancelled.1.json b/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_campaign_cancelled.1.json index a59c333b..415f333f 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_campaign_cancelled.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_campaign_cancelled.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_campaign_ended.1.json b/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_campaign_ended.1.json index d48ae6c1..d48b71f0 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_campaign_ended.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_campaign_ended.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Ended" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_negative_amount.1.json b/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_negative_amount.1.json index 333cee4f..076bf444 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_negative_amount.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_negative_amount.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_not_initialized.1.json b/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_not_initialized.1.json index 51a208ee..ad47f5b3 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_not_initialized.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_not_initialized.1.json @@ -64,26 +64,6 @@ }, "live_until": 4095 }, - { - "entry": { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", - "key": { - "ledger_key_nonce": { - "nonce": "801925984706572462" - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - "live_until": 6311999 - }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_on_donation_count_overflow.1.json b/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_on_donation_count_overflow.1.json index 340c66e5..a0c2f606 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_on_donation_count_overflow.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_on_donation_count_overflow.1.json @@ -44,6 +44,123 @@ }, "live_until": 1036800 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_zero_amount.1.json b/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_zero_amount.1.json index 333cee4f..076bf444 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_zero_amount.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_donate_fails_zero_amount.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_edge_case_no_donor_record.1.json b/campaign/test_snapshots/test/negative_path_tests/test_edge_case_no_donor_record.1.json index 4c834eab..870a31ed 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_edge_case_no_donor_record.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_edge_case_no_donor_record.1.json @@ -32,6 +32,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_edge_case_zero_donations.1.json b/campaign/test_snapshots/test/negative_path_tests/test_edge_case_zero_donations.1.json index c01c84a6..ea428fa3 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_edge_case_zero_donations.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_edge_case_zero_donations.1.json @@ -32,6 +32,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_fails_already_ended.1.json b/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_fails_already_ended.1.json index eca6748d..4a4f25f0 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_fails_already_ended.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_fails_already_ended.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Ended" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_fails_cancelled.1.json b/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_fails_cancelled.1.json index ec73e468..afd6c99c 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_fails_cancelled.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_fails_cancelled.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_frozen_panics.1.json b/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_frozen_panics.1.json index 020b91dd..732cdf9c 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_frozen_panics.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_frozen_panics.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_not_frozen_succeeds.1.json b/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_not_frozen_succeeds.1.json index ebc6144c..5ef11002 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_not_frozen_succeeds.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_end_campaign_not_frozen_succeeds.1.json @@ -45,6 +45,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Ended" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_end_then_refund_eligible.1.json b/campaign/test_snapshots/test/negative_path_tests/test_end_then_refund_eligible.1.json index 014c2e0c..686e593b 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_end_then_refund_eligible.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_end_then_refund_eligible.1.json @@ -45,6 +45,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Ended" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_fails_absurd_future_time.1.json b/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_fails_absurd_future_time.1.json index 1412f351..21712556 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_fails_absurd_future_time.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_fails_absurd_future_time.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "31636000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_fails_cancelled.1.json b/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_fails_cancelled.1.json index ec73e468..afd6c99c 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_fails_cancelled.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_fails_cancelled.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_fails_past_time.1.json b/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_fails_past_time.1.json index 1412f351..21712556 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_fails_past_time.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_fails_past_time.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "31636000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_frozen_panics.1.json b/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_frozen_panics.1.json index 020b91dd..732cdf9c 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_frozen_panics.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_frozen_panics.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_not_frozen_succeeds.1.json b/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_not_frozen_succeeds.1.json index 363f22bf..192ab2c9 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_not_frozen_succeeds.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_extend_deadline_not_frozen_succeeds.1.json @@ -45,6 +45,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "200000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_full_lifecycle_happy_path.1.json b/campaign/test_snapshots/test/negative_path_tests/test_full_lifecycle_happy_path.1.json index 7d3ab19d..9c16dad0 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_full_lifecycle_happy_path.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_full_lifecycle_happy_path.1.json @@ -72,6 +72,123 @@ }, "live_until": 1036800 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "900" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_get_milestone_view_fails_out_of_bounds.1.json b/campaign/test_snapshots/test/negative_path_tests/test_get_milestone_view_fails_out_of_bounds.1.json index 3f9e7e6d..a3653ea7 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_get_milestone_view_fails_out_of_bounds.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_get_milestone_view_fails_out_of_bounds.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_initialize_fails_already_initialized.1.json b/campaign/test_snapshots/test/negative_path_tests/test_initialize_fails_already_initialized.1.json index f4c3a6f9..aa9223c6 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_initialize_fails_already_initialized.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_initialize_fails_already_initialized.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_active_campaign.1.json b/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_active_campaign.1.json index 033d67d9..bcfb6b88 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_active_campaign.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_active_campaign.1.json @@ -32,6 +32,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_already_claimed.1.json b/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_already_claimed.1.json index a7edfa7d..502f4f41 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_already_claimed.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_already_claimed.1.json @@ -45,6 +45,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_ended_with_released_milestones.1.json b/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_ended_with_released_milestones.1.json index 58c415ab..87bd9674 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_ended_with_released_milestones.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_ended_with_released_milestones.1.json @@ -45,6 +45,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Ended" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_goal_reached.1.json b/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_goal_reached.1.json index d844e4a8..8ba08696 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_goal_reached.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_goal_reached.1.json @@ -32,6 +32,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_no_donor_record.1.json b/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_no_donor_record.1.json index c64fc905..92ef7893 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_no_donor_record.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_no_donor_record.1.json @@ -45,6 +45,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_window_closed.1.json b/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_window_closed.1.json index ce533476..8f90bef8 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_window_closed.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_is_refund_eligible_fails_window_closed.1.json @@ -32,6 +32,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "31636000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_reentrancy_lock_donate_twice_succeeds.1.json b/campaign/test_snapshots/test/negative_path_tests/test_reentrancy_lock_donate_twice_succeeds.1.json index f333d63f..62ce391a 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_reentrancy_lock_donate_twice_succeeds.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_reentrancy_lock_donate_twice_succeeds.1.json @@ -118,6 +118,123 @@ }, "live_until": 1036800 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "2" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 3000 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "300" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "700" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_refund_window_edge_boundary.1.json b/campaign/test_snapshots/test/negative_path_tests/test_refund_window_edge_boundary.1.json index 13191b85..26307274 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_refund_window_edge_boundary.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_refund_window_edge_boundary.1.json @@ -32,6 +32,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "31636000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_refund_window_just_after_boundary.1.json b/campaign/test_snapshots/test/negative_path_tests/test_refund_window_just_after_boundary.1.json index 439a1d2d..7205c0a0 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_refund_window_just_after_boundary.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_refund_window_just_after_boundary.1.json @@ -32,6 +32,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "31636000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_upgrade_fails_when_frozen.1.json b/campaign/test_snapshots/test/negative_path_tests/test_upgrade_fails_when_frozen.1.json index 88cf1827..79093935 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_upgrade_fails_when_frozen.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_upgrade_fails_when_frozen.1.json @@ -17,6 +17,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_upgrade_succeeds_after_unfreeze.1.json b/campaign/test_snapshots/test/negative_path_tests/test_upgrade_succeeds_after_unfreeze.1.json index 71b51058..3eaeb582 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_upgrade_succeeds_after_unfreeze.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_upgrade_succeeds_after_unfreeze.1.json @@ -58,6 +58,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/negative_path_tests/test_upgrade_succeeds_when_not_frozen.1.json b/campaign/test_snapshots/test/negative_path_tests/test_upgrade_succeeds_when_not_frozen.1.json index c01c84a6..ea428fa3 100644 --- a/campaign/test_snapshots/test/negative_path_tests/test_upgrade_succeeds_when_not_frozen.1.json +++ b/campaign/test_snapshots/test/negative_path_tests/test_upgrade_succeeds_when_not_frozen.1.json @@ -32,6 +32,123 @@ "min_temp_entry_ttl": 16, "max_entry_ttl": 6312000, "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "100000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1036800 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/campaign/test_snapshots/test/report_cache_tests/cache_is_fresh_after_cancel_and_refund.1.json b/campaign/test_snapshots/test/report_cache_tests/cache_is_fresh_after_cancel_and_refund.1.json new file mode 100644 index 00000000..8d06b8e1 --- /dev/null +++ b/campaign/test_snapshots/test/report_cache_tests/cache_is_fresh_after_cancel_and_refund.1.json @@ -0,0 +1,1085 @@ +{ + "generators": { + "address": 5, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "300" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 1000, + "timestamp": 1000000, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 100, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 10000000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 10000999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 10000999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "AssetRaised" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "300" + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "3592000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 3000 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "300" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "700" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "CampaignData" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "accepted_assets" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "XLM" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "concluded_at_ledger" + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "symbol": "created_at_ledger" + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "symbol": "created_at_time" + }, + "val": { + "u64": "1000000" + } + }, + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "3592000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "min_donation_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "300" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Cancelled" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "DonationCount" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "1" + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "DonorAssetDonation" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "300" + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "DonorData" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "asset" + }, + "val": { + "vec": [ + { + "symbol": "Stellar" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "donor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "last_donation_ledger" + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "symbol": "last_donation_time" + }, + "val": { + "u64": "1000000" + } + }, + { + "key": { + "symbol": "refund_claimed" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "total_donated" + }, + "val": { + "i128": "300" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MilestonesVec" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "description_hash" + }, + "val": { + "bytes": "0909090909090909090909090909090909090909090909090909090909090909" + } + }, + { + "key": { + "symbol": "index" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "release_tx" + }, + "val": "void" + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "released_at" + }, + "val": "void" + }, + { + "key": { + "symbol": "released_at_ledger" + }, + "val": "void" + }, + { + "key": { + "symbol": "released_to" + }, + "val": "void" + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Locked" + } + ] + } + }, + { + "key": { + "symbol": "target_amount" + }, + "val": { + "i128": "1000" + } + } + ] + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "TotalRaised" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "300" + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "UniqueDonorCount" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 1 + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 1099 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 10000999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 10000999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 10000999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "4270020994084947596" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 10000999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 519400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "300" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 519400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 121960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1099 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/campaign/test_snapshots/test/report_cache_tests/cache_is_fresh_after_every_transition.1.json b/campaign/test_snapshots/test/report_cache_tests/cache_is_fresh_after_every_transition.1.json new file mode 100644 index 00000000..e70f15f0 --- /dev/null +++ b/campaign/test_snapshots/test/report_cache_tests/cache_is_fresh_after_every_transition.1.json @@ -0,0 +1,1307 @@ +{ + "generators": { + "address": 7, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "mint", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + }, + { + "i128": "1000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 1000, + "timestamp": 1000000, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 100, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 10000000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": "0", + "seq_num": "0", + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + "live_until": null + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 10000999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 10000999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "AssetRaised" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "1000" + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "CachedReport" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u64": "2" + } + }, + { + "key": { + "symbol": "donor_count" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "6184000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "progress_bps" + }, + "val": { + "u32": 10000 + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "release_count" + }, + "val": { + "u64": "1" + } + }, + { + "key": { + "symbol": "remaining_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Ended" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "CampaignData" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "accepted_assets" + }, + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "XLM" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + ] + } + }, + { + "key": { + "symbol": "concluded_at_ledger" + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "symbol": "created_at_ledger" + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "symbol": "created_at_time" + }, + "val": { + "u64": "1000000" + } + }, + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "6184000" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "min_donation_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Ended" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "DonationCount" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "2" + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "DonorAssetDonation" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "400" + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "DonorAssetDonation" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "600" + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "DonorData" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "asset" + }, + "val": { + "vec": [ + { + "symbol": "Stellar" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "donor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "last_donation_ledger" + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "symbol": "last_donation_time" + }, + "val": { + "u64": "1000000" + } + }, + { + "key": { + "symbol": "refund_claimed" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "total_donated" + }, + "val": { + "i128": "400" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "DonorData" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "asset" + }, + "val": { + "vec": [ + { + "symbol": "Stellar" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + } + }, + { + "key": { + "symbol": "donation_count" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "donor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "last_donation_ledger" + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "symbol": "last_donation_time" + }, + "val": { + "u64": "1000000" + } + }, + { + "key": { + "symbol": "refund_claimed" + }, + "val": { + "bool": false + } + }, + { + "key": { + "symbol": "total_donated" + }, + "val": { + "i128": "600" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "MilestonesVec" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "map": [ + { + "key": { + "symbol": "description_hash" + }, + "val": { + "bytes": "0909090909090909090909090909090909090909090909090909090909090909" + } + }, + { + "key": { + "symbol": "index" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "release_tx" + }, + "val": "void" + }, + { + "key": { + "symbol": "released_amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "released_at" + }, + "val": { + "u64": "1000000" + } + }, + { + "key": { + "symbol": "released_at_ledger" + }, + "val": "void" + }, + { + "key": { + "symbol": "released_to" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Released" + } + ] + } + }, + { + "key": { + "symbol": "target_amount" + }, + "val": { + "i128": "1000" + } + } + ] + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "ReleaseCount" + } + ] + }, + "durability": "persistent", + "val": { + "u64": "1" + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "TotalRaised" + } + ] + }, + "durability": "persistent", + "val": { + "i128": "1000" + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "UniqueDonorCount" + } + ] + }, + "durability": "persistent", + "val": { + "u32": 2 + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 1099 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": "4270020994084947596" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 10000999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 10000999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": "6277191135259896685" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 10000999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": "8370022561469687789" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 10000999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 10000999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 10000999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 519400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": { + "vec": [ + { + "symbol": "Balance" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": "1000" + } + }, + { + "key": { + "symbol": "authorized" + }, + "val": { + "bool": true + } + }, + { + "key": { + "symbol": "clawback" + }, + "val": { + "bool": false + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 519400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 121960 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1099 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/campaign/test_snapshots/test/report_cache_tests/get_cached_report_falls_back_for_pre_cache_state.1.json b/campaign/test_snapshots/test/report_cache_tests/get_cached_report_falls_back_for_pre_cache_state.1.json new file mode 100644 index 00000000..feff03f8 --- /dev/null +++ b/campaign/test_snapshots/test/report_cache_tests/get_cached_report_falls_back_for_pre_cache_state.1.json @@ -0,0 +1,176 @@ +{ + "generators": { + "address": 2, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 1000, + "timestamp": 1000000, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 100, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 10000000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "vec": [ + { + "symbol": "CampaignData" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "accepted_assets" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "concluded_at_ledger" + }, + "val": "void" + }, + { + "key": { + "symbol": "created_at_ledger" + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "symbol": "created_at_time" + }, + "val": { + "u64": "1000000" + } + }, + { + "key": { + "symbol": "creator" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "end_time" + }, + "val": { + "u64": "1086400" + } + }, + { + "key": { + "symbol": "goal_amount" + }, + "val": { + "i128": "500" + } + }, + { + "key": { + "symbol": "milestone_count" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "min_donation_amount" + }, + "val": { + "i128": "0" + } + }, + { + "key": { + "symbol": "raised_amount" + }, + "val": { + "i128": "100" + } + }, + { + "key": { + "symbol": "status" + }, + "val": { + "vec": [ + { + "symbol": "Active" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 1037800 + }, + { + "entry": { + "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" + }, + "live_until": 1099 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1099 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/campaign/test_snapshots/test/report_cache_tests/get_cached_report_returns_none_when_uninitialized.1.json b/campaign/test_snapshots/test/report_cache_tests/get_cached_report_returns_none_when_uninitialized.1.json new file mode 100644 index 00000000..699424f5 --- /dev/null +++ b/campaign/test_snapshots/test/report_cache_tests/get_cached_report_returns_none_when_uninitialized.1.json @@ -0,0 +1,61 @@ +{ + "generators": { + "address": 1, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 1000, + "timestamp": 1000000, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 100, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 10000000, + "ledger_entries": [ + { + "entry": { + "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" + }, + "live_until": 1099 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 1099 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/crates/contracts/batch-donor/src/tests.rs b/crates/contracts/batch-donor/src/tests.rs index de80e774..6fcd080a 100644 --- a/crates/contracts/batch-donor/src/tests.rs +++ b/crates/contracts/batch-donor/src/tests.rs @@ -115,7 +115,7 @@ fn oversized_batch_panics_with_validation_code() { #[test] fn batch_donate_result_struct_has_expected_shape() { - let env = Env::default(); + let _env = Env::default(); let result = BatchDonateResult { index: 7, outcome: BatchDonateOutcome::ValidationFailed(42), From a7930cd231e07a1cf1b1fedf0c6cd1264f5dcbac Mon Sep 17 00:00:00 2001 From: Moonwalker-rgb Date: Mon, 27 Jul 2026 16:36:23 +0000 Subject: [PATCH 12/13] fix: use pull_request trigger during labeler v5 migration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pull_request_target reads the workflow from the base branch, so it runs the v5 action against the old v4-schema config on main, which fails. Temporarily switching to pull_request so CI reads the config from this branch during the migration window. Revert to pull_request_target after this PR merges — that is the correct long-term event for the labeler (needs pull-requests:write in base context). See https://github.com/actions/labeler#updating-major-version-of-the-labeler --- .github/workflows/labeler.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 7ee5a6ec..cd6e2f4f 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -5,11 +5,12 @@ # `documentation`, `storage`, `testing`, or `security` applied based on # which file globs the PR touches. # -# `pull_request_target` is the official recipe for labeler workflows -# because the action needs `pull-requests: write` to apply labels, and -# that permission is only available in the base branch's context. -# The action itself is read-only against repository code; it does not -# evaluate `run:` from PRs. +# NOTE: temporarily using `pull_request` (instead of `pull_request_target`) +# so that CI reads the labeler config from this branch during the initial +# v5 migration. Once this PR is merged, revert to `pull_request_target` +# (which is the correct event for production — it has `pull-requests: write` +# in the base-branch context and the action itself is read-only against code). +# See: https://github.com/actions/labeler#updating-major-version-of-the-labeler name: Pull Request Labeler @@ -18,7 +19,7 @@ permissions: pull-requests: write on: - - pull_request_target + - pull_request jobs: labeler: From 26857ace38ba9a5d6b3d4ff06a2b08af2bd313be Mon Sep 17 00:00:00 2001 From: Moonwalker-rgb Date: Mon, 27 Jul 2026 16:49:35 +0000 Subject: [PATCH 13/13] fix(ci): sync labeler config to v5 schema and restore pull_request_target The base branch (main) already has the v5 workflow with the PR-head checkout trick. This branch was still carrying the old v4 flat-string labeler.yml config, so when pull_request_target checked out the PR head the v5 action read the incompatible config and failed. - Update .github/labeler.yml to the v5 changed-files schema - Restore .github/workflows/labeler.yml to match main exactly (pull_request_target + actions/checkout of the PR head SHA) --- .github/labeler.yml | 66 ++++++++++++++++++++--------------- .github/workflows/labeler.yml | 18 ++++++---- 2 files changed, 48 insertions(+), 36 deletions(-) diff --git a/.github/labeler.yml b/.github/labeler.yml index 77c9cd4c..bc661476 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -12,53 +12,61 @@ # Rust Soroban contracts — the canonical on-chain API surface. api: - - "campaign/**" - - "codegen/**" - - "common/**" - - "token-bridge/**" - - "crates/contracts/core/**" - - "crates/contracts/batch-donor/**" + - changed-files: + - any-glob-to-any-file: "campaign/**" + - any-glob-to-any-file: "codegen/**" + - any-glob-to-any-file: "common/**" + - any-glob-to-any-file: "token-bridge/**" + - any-glob-to-any-file: "crates/contracts/core/**" + - any-glob-to-any-file: "crates/contracts/batch-donor/**" # Native CLI tooling (`cargo run -p orbitchain-tools -- …`). cli: - - "crates/tools/**" + - changed-files: + - any-glob-to-any-file: "crates/tools/**" # Frontend / mobile-wallet surfaces (Playwright + wallet integration). frontend: - - "wallet_connect.html" - - "wallet_connect.js" - - "tests/e2e/**" - - "playwright.config.js" + - changed-files: + - any-glob-to-any-file: "wallet_connect.html" + - any-glob-to-any-file: "wallet_connect.js" + - any-glob-to-any-file: "tests/e2e/**" + - any-glob-to-any-file: "playwright.config.js" # CI / build infrastructure. ci: - - ".github/workflows/**" - - ".github/*.md" - - ".github/ISSUE_TEMPLATE/**" - - ".cargo/**" - - "rust-toolchain.toml" - - "Cargo.toml" - - "Cargo.lock" + - changed-files: + - any-glob-to-any-file: ".github/workflows/**" + - any-glob-to-any-file: ".github/*.md" + - any-glob-to-any-file: ".github/ISSUE_TEMPLATE/**" + - any-glob-to-any-file: ".cargo/**" + - any-glob-to-any-file: "rust-toolchain.toml" + - any-glob-to-any-file: "Cargo.toml" + - any-glob-to-any-file: "Cargo.lock" # Documentation and reference material. documentation: - - "docs/**" - - "**/*.md" + - changed-files: + - any-glob-to-any-file: "docs/**" + - any-glob-to-any-file: "**/*.md" # Persistent / temporary storage backend code paths. storage: - - "**/storage*.rs" - - "**/backend.rs" + - changed-files: + - any-glob-to-any-file: "**/storage*.rs" + - any-glob-to-any-file: "**/backend.rs" # Tests / property-based / fuzz harnesses. testing: - - "**/tests/**" - - "**/*test*.rs" - - "**/proptest-strategies/**" - - "**/fuzz_targets/**" - - "fuzz/**" + - changed-files: + - any-glob-to-any-file: "**/tests/**" + - any-glob-to-any-file: "**/*test*.rs" + - any-glob-to-any-file: "**/proptest-strategies/**" + - any-glob-to-any-file: "**/fuzz_targets/**" + - any-glob-to-any-file: "fuzz/**" # Security process and security-sensitive code. security: - - "SECURITY.md" - - "**/security*.rs" + - changed-files: + - any-glob-to-any-file: "SECURITY.md" + - any-glob-to-any-file: "**/security*.rs" diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index cd6e2f4f..e1322afd 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -5,12 +5,13 @@ # `documentation`, `storage`, `testing`, or `security` applied based on # which file globs the PR touches. # -# NOTE: temporarily using `pull_request` (instead of `pull_request_target`) -# so that CI reads the labeler config from this branch during the initial -# v5 migration. Once this PR is merged, revert to `pull_request_target` -# (which is the correct event for production — it has `pull-requests: write` -# in the base-branch context and the action itself is read-only against code). -# See: https://github.com/actions/labeler#updating-major-version-of-the-labeler +# Uses `pull_request_target` so that `pull-requests: write` permission is +# available even for fork PRs. An explicit `actions/checkout` of the PR +# head ref is included so that `.github/labeler.yml` is read from the PR +# branch (allows config fixes to ship with the PR that introduces them). +# +# NOTE: the checkout step only activates once this change lands on the +# base branch. Until then, the labeler reads the base-branch config. name: Pull Request Labeler @@ -19,7 +20,7 @@ permissions: pull-requests: write on: - - pull_request + - pull_request_target jobs: labeler: @@ -27,6 +28,9 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 5 steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha }} - name: Apply labels uses: actions/labeler@v5 with: