diff --git a/contracts/Cargo.lock b/contracts/Cargo.lock
index 88d7bf3eb1..50aa12e9b2 100644
--- a/contracts/Cargo.lock
+++ b/contracts/Cargo.lock
@@ -1002,6 +1002,13 @@ version = "1.21.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
+[[package]]
+name = "optimistic_governance"
+version = "0.1.0"
+dependencies = [
+ "soroban-sdk",
+]
+
[[package]]
name = "options"
version = "0.1.0"
@@ -1652,13 +1659,6 @@ dependencies = [
"der",
]
-[[package]]
-name = "stableswap"
-version = "0.1.0"
-dependencies = [
- "soroban-sdk",
-]
-
[[package]]
name = "static_assertions"
version = "1.1.0"
@@ -1699,6 +1699,14 @@ dependencies = [
"stellar-strkey",
]
+[[package]]
+name = "streaming_payments"
+version = "0.1.0"
+dependencies = [
+ "soroban-sdk",
+ "soroban-token-sdk",
+]
+
[[package]]
name = "strsim"
version = "0.11.1"
@@ -2132,6 +2140,14 @@ dependencies = [
"wasmparser 0.244.0",
]
+[[package]]
+name = "yield_tranches"
+version = "0.1.0"
+dependencies = [
+ "soroban-sdk",
+ "soroban-token-sdk",
+]
+
[[package]]
name = "yield_vault"
version = "0.1.0"
diff --git a/contracts/Cargo.toml b/contracts/Cargo.toml
index 5d11f23372..f528bb6123 100644
--- a/contracts/Cargo.toml
+++ b/contracts/Cargo.toml
@@ -1,6 +1,6 @@
[workspace]
resolver = "2"
-members = ["yield_vault", "zap", "options", "aa_recovery", "aa_factory", "settlement", "intent_swap", "dutch_auction", "liquid_staking", "emission_controller", "strategies/delta_neutral", "stableswap", "stealth_addresses", "merkle_distributor"]
+members = ["yield_vault", "yield_tranches", "zap", "options", "aa_recovery", "aa_factory", "settlement", "intent_swap", "dutch_auction", "liquid_staking", "emission_controller", "optimistic_governance", "streaming_payments"]
[profile.release]
opt-level = "z"
diff --git a/contracts/aa_factory/src/factory.rs b/contracts/aa_factory/src/factory.rs
index 822c2db469..8b673a0508 100644
--- a/contracts/aa_factory/src/factory.rs
+++ b/contracts/aa_factory/src/factory.rs
@@ -23,12 +23,12 @@ use crate::proxy_wallet::ProxyWalletClient;
#[derive(Clone)]
pub enum StorageKey {
Initialized,
- Admin, // Factory admin address
- ProxyCodeHash, // Hash of the proxy contract code
- DeployedProxies, // Vec
- All deployed proxy addresses
- UserToProxy, // Map - User address to proxy mapping
- Relayer, // Trusted relayer for gas sponsorship
- Nonce, // Nonce for deterministic address generation
+ Admin, // Factory admin address
+ ProxyCodeHash, // Hash of the proxy contract code
+ DeployedProxies, // Vec - All deployed proxy addresses
+ UserToProxy, // Map - User address to proxy mapping
+ Relayer, // Trusted relayer for gas sponsorship
+ Nonce, // Nonce for deterministic address generation
}
// ── Data Structures ─────────────────────────────────────────────────────
@@ -37,9 +37,9 @@ pub enum StorageKey {
#[contracttype]
#[derive(Clone, Debug)]
pub struct DeploymentConfig {
- pub owner: Address, // The wallet owner's address
+ pub owner: Address, // The wallet owner's address
pub relayer: Option, // Optional trusted relayer
- pub salt: u64, // Salt for deterministic address generation
+ pub salt: u64, // Salt for deterministic address generation
}
/// Proxy wallet information
@@ -115,13 +115,19 @@ impl WalletFactory {
}
env.storage().instance().set(&StorageKey::Admin, &admin);
- env.storage().instance().set(&StorageKey::ProxyCodeHash, &proxy_code_hash);
+ env.storage()
+ .instance()
+ .set(&StorageKey::ProxyCodeHash, &proxy_code_hash);
env.storage().instance().set(&StorageKey::Nonce, &0u64);
- env.storage().instance().set(&StorageKey::Initialized, &true);
+ env.storage()
+ .instance()
+ .set(&StorageKey::Initialized, &true);
// Initialize storage collections
let deployed_proxies: Vec = Vec::new(&env);
- env.storage().instance().set(&StorageKey::DeployedProxies, &deployed_proxies);
+ env.storage()
+ .instance()
+ .set(&StorageKey::DeployedProxies, &deployed_proxies);
// Emit event
env.events().publish((symbol_short!("init"),), (admin,));
@@ -155,10 +161,7 @@ impl WalletFactory {
///
/// - Each user can only have one proxy wallet
/// - The proxy is initialized with the owner and factory addresses
- pub fn deploy_proxy(
- env: Env,
- config: DeploymentConfig,
- ) -> Result {
+ pub fn deploy_proxy(env: Env, config: DeploymentConfig) -> Result {
Self::require_initialized(&env)?;
config.owner.require_auth();
@@ -183,18 +186,20 @@ impl WalletFactory {
// &proxy_code_hash,
// (config.owner.clone(), env.current_contract_address(), config.relayer.clone()),
// );
-
+
// For this implementation, we return the computed address as a placeholder
// The actual deployment would happen through the Soroban CLI or SDK
let proxy_id = config.owner.clone(); // Placeholder - in production this would be the deployed contract address
// Initialize the proxy
// In production: proxy_client.initialize(...)
-
+
// Update storage
let mut updated_mapping = user_to_proxy;
updated_mapping.set(config.owner.clone(), proxy_id.clone());
- env.storage().instance().set(&StorageKey::UserToProxy, &updated_mapping);
+ env.storage()
+ .instance()
+ .set(&StorageKey::UserToProxy, &updated_mapping);
// Add to deployed proxies list
let mut deployed: Vec = env
@@ -203,11 +208,19 @@ impl WalletFactory {
.get(&StorageKey::DeployedProxies)
.unwrap_or(Vec::new(&env));
deployed.push_back(proxy_id.clone());
- env.storage().instance().set(&StorageKey::DeployedProxies, &deployed);
+ env.storage()
+ .instance()
+ .set(&StorageKey::DeployedProxies, &deployed);
// Update nonce
- let nonce: u64 = env.storage().instance().get(&StorageKey::Nonce).unwrap_or(0);
- env.storage().instance().set(&StorageKey::Nonce, &(nonce + 1));
+ let nonce: u64 = env
+ .storage()
+ .instance()
+ .get(&StorageKey::Nonce)
+ .unwrap_or(0);
+ env.storage()
+ .instance()
+ .set(&StorageKey::Nonce, &(nonce + 1));
// Emit event
env.events().publish(
@@ -266,18 +279,15 @@ impl WalletFactory {
/// # Returns
///
/// Returns `Ok(())` on success
- pub fn set_relayer(
- env: Env,
- admin: Address,
- relayer: Address,
- ) -> Result<(), FactoryError> {
+ pub fn set_relayer(env: Env, admin: Address, relayer: Address) -> Result<(), FactoryError> {
Self::require_initialized(&env)?;
Self::require_admin(&env, &admin)?;
env.storage().instance().set(&StorageKey::Relayer, &relayer);
// Emit event
- env.events().publish((symbol_short!("set_rel"),), (relayer,));
+ env.events()
+ .publish((symbol_short!("set_rel"),), (relayer,));
Ok(())
}
@@ -372,10 +382,7 @@ impl WalletFactory {
/// # Returns
///
/// Returns ProxyInfo if the proxy exists
- pub fn get_proxy_info(
- env: Env,
- proxy_address: Address,
- ) -> Result {
+ pub fn get_proxy_info(env: Env, proxy_address: Address) -> Result {
Self::require_initialized(&env)?;
// Search through user mappings to find owner
@@ -410,7 +417,11 @@ impl WalletFactory {
/// Returns the stored proxy code hash
pub fn get_proxy_code_hash(env: Env) -> Result {
Self::require_initialized(&env)?;
- Ok(env.storage().instance().get(&StorageKey::ProxyCodeHash).unwrap())
+ Ok(env
+ .storage()
+ .instance()
+ .get(&StorageKey::ProxyCodeHash)
+ .unwrap())
}
/// Get the factory admin address.
diff --git a/contracts/aa_factory/src/lib.rs b/contracts/aa_factory/src/lib.rs
index b955a881ce..a4d7bd3bab 100644
--- a/contracts/aa_factory/src/lib.rs
+++ b/contracts/aa_factory/src/lib.rs
@@ -82,10 +82,7 @@
mod factory;
mod proxy_wallet;
-pub use factory::{
- DeploymentConfig, FactoryError, ProxyInfo, WalletFactory, WalletFactoryClient,
-};
+pub use factory::{DeploymentConfig, FactoryError, ProxyInfo, WalletFactory, WalletFactoryClient};
pub use proxy_wallet::{
- ExecutionResult, ProxyError, ProxyWallet, ProxyWalletClient, UserOperation,
- WebAuthnSignature,
+ ExecutionResult, ProxyError, ProxyWallet, ProxyWalletClient, UserOperation, WebAuthnSignature,
};
diff --git a/contracts/aa_factory/src/proxy_wallet.rs b/contracts/aa_factory/src/proxy_wallet.rs
index e6da1d5909..70fbe7bb2d 100644
--- a/contracts/aa_factory/src/proxy_wallet.rs
+++ b/contracts/aa_factory/src/proxy_wallet.rs
@@ -11,8 +11,8 @@
//! - Multi-signature support via guardians (integrates with aa_recovery)
use soroban_sdk::{
- contract, contracterror, contractimpl, contracttype, symbol_short, Address, Bytes, Env, IntoVal,
- Map, Symbol, Val, Vec,
+ contract, contracterror, contractimpl, contracttype, symbol_short, Address, Bytes, Env,
+ IntoVal, Map, Symbol, Val, Vec,
};
// ── Storage Keys ────────────────────────────────────────────────────────
@@ -21,13 +21,13 @@ use soroban_sdk::{
#[derive(Clone)]
pub enum StorageKey {
Initialized,
- Owner, // Primary owner address (can be a public key hash)
- Nonce, // Current nonce for replay protection
- Factory, // Factory contract address
- Relayer, // Trusted relayer address (stellaryield backend)
- WebAuthnKey, // WebAuthn public key for signature verification
- UsedNonces, // Map - Track used nonces
- VaultAllowances, // Map - Approved vault contracts
+ Owner, // Primary owner address (can be a public key hash)
+ Nonce, // Current nonce for replay protection
+ Factory, // Factory contract address
+ Relayer, // Trusted relayer address (stellaryield backend)
+ WebAuthnKey, // WebAuthn public key for signature verification
+ UsedNonces, // Map - Track used nonces
+ VaultAllowances, // Map - Approved vault contracts
}
// ── Data Structures ─────────────────────────────────────────────────────
@@ -36,12 +36,12 @@ pub enum StorageKey {
#[contracttype]
#[derive(Clone, Debug)]
pub struct UserOperation {
- pub sender: Address, // The proxy wallet address
- pub nonce: u64, // Unique nonce for replay protection
- pub call_data: Bytes, // Encoded function call data
- pub call_target: Address, // Target contract to call
- pub signature: Bytes, // User's signature (WebAuthn or ECDSA)
- pub max_fee: i128, // Maximum fee user is willing to pay
+ pub sender: Address, // The proxy wallet address
+ pub nonce: u64, // Unique nonce for replay protection
+ pub call_data: Bytes, // Encoded function call data
+ pub call_target: Address, // Target contract to call
+ pub signature: Bytes, // User's signature (WebAuthn or ECDSA)
+ pub max_fee: i128, // Maximum fee user is willing to pay
}
/// WebAuthn signature data structure
@@ -173,13 +173,13 @@ impl ProxyWallet {
env.storage().instance().set(&StorageKey::Nonce, &0u64);
// Mark as initialized
- env.storage().instance().set(&StorageKey::Initialized, &true);
+ env.storage()
+ .instance()
+ .set(&StorageKey::Initialized, &true);
// Emit event
- env.events().publish(
- (symbol_short!("init"),),
- (owner.clone(), factory.clone()),
- );
+ env.events()
+ .publish((symbol_short!("init"),), (owner.clone(), factory.clone()));
Ok(())
}
@@ -223,12 +223,17 @@ impl ProxyWallet {
Self::require_owner(&env, &owner)?;
// Store the WebAuthn public key coordinates
- let key_data = Map::from_array(&env, [
- (symbol_short!("x"), public_key_x.clone().to_val()),
- (symbol_short!("y"), public_key_y.clone().to_val()),
- ]);
+ let key_data = Map::from_array(
+ &env,
+ [
+ (symbol_short!("x"), public_key_x.clone().to_val()),
+ (symbol_short!("y"), public_key_y.clone().to_val()),
+ ],
+ );
- env.storage().instance().set(&StorageKey::WebAuthnKey, &key_data);
+ env.storage()
+ .instance()
+ .set(&StorageKey::WebAuthnKey, &key_data);
// Emit event
env.events().publish((symbol_short!("wa_reg"),), (owner,));
@@ -289,10 +294,8 @@ impl ProxyWallet {
let result = Self::execute_call(&env, &op.call_target, &op.call_data)?;
// Emit event
- env.events().publish(
- (symbol_short!("exec"),),
- (op.nonce, result.success),
- );
+ env.events()
+ .publish((symbol_short!("exec"),), (op.nonce, result.success));
Ok(result)
}
@@ -341,7 +344,8 @@ impl ProxyWallet {
}
// Emit event
- env.events().publish((symbol_short!("batch"),), (results.len(),));
+ env.events()
+ .publish((symbol_short!("batch"),), (results.len(),));
Ok(results)
}
@@ -424,11 +428,7 @@ impl ProxyWallet {
/// # Events
///
/// Emits `(withdraw_vault, vault, shares, amount)` on success
- pub fn withdraw_from_vault(
- env: Env,
- vault: Address,
- shares: i128,
- ) -> Result {
+ pub fn withdraw_from_vault(env: Env, vault: Address, shares: i128) -> Result {
Self::require_initialized(&env)?;
// Call vault withdraw
@@ -477,10 +477,13 @@ impl ProxyWallet {
.unwrap_or(Map::new(&env));
allowances.set(vault.clone(), allowance);
- env.storage().instance().set(&StorageKey::VaultAllowances, &allowances);
+ env.storage()
+ .instance()
+ .set(&StorageKey::VaultAllowances, &allowances);
// Emit event
- env.events().publish((symbol_short!("approve_v"),), (vault, allowance));
+ env.events()
+ .publish((symbol_short!("approve_v"),), (vault, allowance));
Ok(())
}
@@ -500,7 +503,11 @@ impl ProxyWallet {
/// Returns the current nonce value
pub fn get_nonce(env: Env) -> Result {
Self::require_initialized(&env)?;
- Ok(env.storage().instance().get(&StorageKey::Nonce).unwrap_or(0))
+ Ok(env
+ .storage()
+ .instance()
+ .get(&StorageKey::Nonce)
+ .unwrap_or(0))
}
/// Mark a nonce as used (for advanced nonce management).
@@ -523,7 +530,9 @@ impl ProxyWallet {
.unwrap_or(Map::new(&env));
used_nonces.set(nonce, true);
- env.storage().instance().set(&StorageKey::UsedNonces, &used_nonces);
+ env.storage()
+ .instance()
+ .set(&StorageKey::UsedNonces, &used_nonces);
Ok(())
}
@@ -565,18 +574,15 @@ impl ProxyWallet {
/// # Returns
///
/// Returns `Ok(())` on success
- pub fn set_relayer(
- env: Env,
- owner: Address,
- relayer: Address,
- ) -> Result<(), ProxyError> {
+ pub fn set_relayer(env: Env, owner: Address, relayer: Address) -> Result<(), ProxyError> {
Self::require_initialized(&env)?;
Self::require_owner(&env, &owner)?;
env.storage().instance().set(&StorageKey::Relayer, &relayer);
// Emit event
- env.events().publish((symbol_short!("set_rel"),), (relayer,));
+ env.events()
+ .publish((symbol_short!("set_rel"),), (relayer,));
Ok(())
}
@@ -723,7 +729,11 @@ impl ProxyWallet {
}
// For sequential nonce verification, check against current nonce
- let current_nonce: u64 = env.storage().instance().get(&StorageKey::Nonce).unwrap_or(0);
+ let current_nonce: u64 = env
+ .storage()
+ .instance()
+ .get(&StorageKey::Nonce)
+ .unwrap_or(0);
// Allow nonces >= current (for out-of-order execution with used nonce tracking)
if nonce < current_nonce {
@@ -733,11 +743,15 @@ impl ProxyWallet {
// Mark nonce as used
let mut updated_nonces = used_nonces;
updated_nonces.set(nonce, true);
- env.storage().instance().set(&StorageKey::UsedNonces, &updated_nonces);
+ env.storage()
+ .instance()
+ .set(&StorageKey::UsedNonces, &updated_nonces);
// Update current nonce if this is the next sequential nonce
if nonce == current_nonce {
- env.storage().instance().set(&StorageKey::Nonce, &(nonce + 1));
+ env.storage()
+ .instance()
+ .set(&StorageKey::Nonce, &(nonce + 1));
}
Ok(())
@@ -814,17 +828,17 @@ impl ProxyWallet {
// Create a deterministic challenge for WebAuthn verification
// In production, this would properly hash the owner and nonce
// For now, we return a simple bytes representation
-
+
let mut challenge_bytes = [0u8; 32];
-
+
// Add prefix for domain separation
let prefix_len = WEBAUTHN_CHALLENGE_PREFIX.len().min(24);
challenge_bytes[..prefix_len].copy_from_slice(&WEBAUTHN_CHALLENGE_PREFIX[..prefix_len]);
-
+
// Add nonce to the end
let nonce_bytes = nonce.to_be_bytes();
challenge_bytes[24..].copy_from_slice(&nonce_bytes);
-
+
Bytes::from_array(env, &challenge_bytes)
}
@@ -885,7 +899,8 @@ impl ProxyWallet {
];
// Try to call approve function (SAC token standard)
- let _result: Result<(), soroban_sdk::Error> = env.invoke_contract(token, &symbol_short!("approve"), args);
+ let _result: Result<(), soroban_sdk::Error> =
+ env.invoke_contract(token, &symbol_short!("approve"), args);
Ok(())
}
@@ -1031,10 +1046,10 @@ mod tests {
// Mark nonce 0 as used - this should mark it but not increment current nonce
// until the sequential nonce is used
client.mark_nonce_used(&0);
-
+
// Nonce 0 should be marked as used
assert!(client.is_nonce_used(&0));
-
+
// Current nonce should still be 0 (increment happens when sequential nonce is used)
assert_eq!(client.get_nonce(), 0);
}
@@ -1045,10 +1060,10 @@ mod tests {
let (client, _, _) = setup_proxy_wallet(&env);
client.mark_nonce_used(&0);
-
+
// Verify the nonce is marked as used
assert!(client.is_nonce_used(&0));
-
+
// Note: In production, trying to use the same nonce again would fail with NonceAlreadyUsed
// For testing, we just verify the nonce tracking works
}
diff --git a/contracts/aa_recovery/src/lib.rs b/contracts/aa_recovery/src/lib.rs
index f42b87655a..874a3bcdc4 100644
--- a/contracts/aa_recovery/src/lib.rs
+++ b/contracts/aa_recovery/src/lib.rs
@@ -28,13 +28,13 @@ use soroban_sdk::{
enum StorageKey {
Initialized,
Owner,
- Guardians, // Map - guardian address -> guardian id
- GuardianThreshold, // u32 - number of guardian approvals needed
- RecoveryRequest, // RecoveryRequest - current active recovery request
- GuardianCounter, // u32 - counter for generating unique guardian ids
- NewOwner, // Address - proposed new owner for recovery
- RecoveryInitiatedAt, // u64 - timestamp when recovery was initiated
- RecoveryConfig, // RecoveryConfig - threshold and timelock settings
+ Guardians, // Map - guardian address -> guardian id
+ GuardianThreshold, // u32 - number of guardian approvals needed
+ RecoveryRequest, // RecoveryRequest - current active recovery request
+ GuardianCounter, // u32 - counter for generating unique guardian ids
+ NewOwner, // Address - proposed new owner for recovery
+ RecoveryInitiatedAt, // u64 - timestamp when recovery was initiated
+ RecoveryConfig, // RecoveryConfig - threshold and timelock settings
}
// ── Data Structures ─────────────────────────────────────────────────────
@@ -52,13 +52,13 @@ pub struct Guardian {
#[contracttype]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct RecoveryRequest {
- pub wallet: Address, // The wallet being recovered
- pub new_owner: Address, // The proposed new owner address
- pub initiated_at: u64, // Timestamp when recovery was initiated
- pub expires_at: u64, // Timestamp when recovery expires (if not executed)
+ pub wallet: Address, // The wallet being recovered
+ pub new_owner: Address, // The proposed new owner address
+ pub initiated_at: u64, // Timestamp when recovery was initiated
+ pub expires_at: u64, // Timestamp when recovery expires (if not executed)
pub guardian_approvals: Vec, // List of guardians who approved
- pub executed: bool, // Whether the recovery has been executed
- pub cancelled: bool, // Whether the recovery has been cancelled
+ pub executed: bool, // Whether the recovery has been executed
+ pub cancelled: bool, // Whether the recovery has been cancelled
}
/// Recovery configuration for setting up the system
@@ -199,7 +199,9 @@ impl RecoveryModule {
guardian_map.set(guardian.clone(), guardian_id_counter);
}
- env.storage().instance().set(&StorageKey::Guardians, &guardian_map);
+ env.storage()
+ .instance()
+ .set(&StorageKey::Guardians, &guardian_map);
env.storage()
.instance()
.set(&StorageKey::GuardianCounter, &guardian_id_counter);
@@ -218,7 +220,9 @@ impl RecoveryModule {
.set(&StorageKey::RecoveryConfig, &config);
// Mark as initialized
- env.storage().instance().set(&StorageKey::Initialized, &true);
+ env.storage()
+ .instance()
+ .set(&StorageKey::Initialized, &true);
// Emit event
env.events().publish(
@@ -254,17 +258,16 @@ impl RecoveryModule {
/// # Events
///
/// Emits `(guard_add, guardian_address, guardian_id)` on success
- pub fn add_guardian(
- env: Env,
- owner: Address,
- guardian: Address,
- ) -> Result<(), RecoveryError> {
+ pub fn add_guardian(env: Env, owner: Address, guardian: Address) -> Result<(), RecoveryError> {
Self::require_initialized(&env)?;
Self::require_owner(&env, &owner)?;
// Check guardian limit
- let guardians: Map =
- env.storage().instance().get(&StorageKey::Guardians).unwrap();
+ let guardians: Map = env
+ .storage()
+ .instance()
+ .get(&StorageKey::Guardians)
+ .unwrap();
if guardians.len() as u32 >= MAX_GUARDIANS {
return Err(RecoveryError::MaxGuardiansReached);
@@ -286,11 +289,16 @@ impl RecoveryModule {
counter += 1;
guardian_map.set(guardian.clone(), counter);
- env.storage().instance().set(&StorageKey::Guardians, &guardian_map);
- env.storage().instance().set(&StorageKey::GuardianCounter, &counter);
+ env.storage()
+ .instance()
+ .set(&StorageKey::Guardians, &guardian_map);
+ env.storage()
+ .instance()
+ .set(&StorageKey::GuardianCounter, &counter);
// Emit event
- env.events().publish((symbol_short!("guard_add"),), (guardian.clone(), counter));
+ env.events()
+ .publish((symbol_short!("guard_add"),), (guardian.clone(), counter));
Ok(())
}
@@ -324,8 +332,11 @@ impl RecoveryModule {
Self::require_initialized(&env)?;
Self::require_owner(&env, &owner)?;
- let guardians: Map =
- env.storage().instance().get(&StorageKey::Guardians).unwrap();
+ let guardians: Map = env
+ .storage()
+ .instance()
+ .get(&StorageKey::Guardians)
+ .unwrap();
// Check if guardian exists
if !guardians.contains_key(guardian.clone()) {
@@ -347,10 +358,13 @@ impl RecoveryModule {
let mut guardian_map = guardians;
guardian_map.remove(guardian.clone());
- env.storage().instance().set(&StorageKey::Guardians, &guardian_map);
+ env.storage()
+ .instance()
+ .set(&StorageKey::Guardians, &guardian_map);
// Emit event
- env.events().publish((symbol_short!("guard_rm"),), (guardian.clone(),));
+ env.events()
+ .publish((symbol_short!("guard_rm"),), (guardian.clone(),));
Ok(())
}
@@ -383,8 +397,11 @@ impl RecoveryModule {
Self::require_initialized(&env)?;
Self::require_owner(&env, &owner)?;
- let guardians: Map =
- env.storage().instance().get(&StorageKey::Guardians).unwrap();
+ let guardians: Map = env
+ .storage()
+ .instance()
+ .get(&StorageKey::Guardians)
+ .unwrap();
if new_threshold == 0 || new_threshold > guardians.len() as u32 {
return Err(RecoveryError::InvalidThreshold);
@@ -395,7 +412,8 @@ impl RecoveryModule {
.set(&StorageKey::GuardianThreshold, &new_threshold);
// Emit event
- env.events().publish((symbol_short!("thresh"),), (new_threshold,));
+ env.events()
+ .publish((symbol_short!("thresh"),), (new_threshold,));
Ok(())
}
@@ -439,8 +457,11 @@ impl RecoveryModule {
initiator.require_auth();
// Verify initiator is a guardian
- let guardians: Map =
- env.storage().instance().get(&StorageKey::Guardians).unwrap();
+ let guardians: Map = env
+ .storage()
+ .instance()
+ .get(&StorageKey::Guardians)
+ .unwrap();
if !guardians.contains_key(initiator.clone()) {
return Err(RecoveryError::Unauthorized);
@@ -531,8 +552,11 @@ impl RecoveryModule {
guardian.require_auth();
// Verify guardian
- let guardians: Map =
- env.storage().instance().get(&StorageKey::Guardians).unwrap();
+ let guardians: Map = env
+ .storage()
+ .instance()
+ .get(&StorageKey::Guardians)
+ .unwrap();
if !guardians.contains_key(guardian.clone()) {
return Err(RecoveryError::Unauthorized);
@@ -562,7 +586,9 @@ impl RecoveryModule {
}
// Add approval
- recovery_request.guardian_approvals.push_back(guardian.clone());
+ recovery_request
+ .guardian_approvals
+ .push_back(guardian.clone());
// Update storage
env.storage()
@@ -629,7 +655,8 @@ impl RecoveryModule {
.set(&StorageKey::RecoveryRequest, &recovery_request);
// Emit event
- env.events().publish((symbol_short!("rec_can"),), (owner.clone(),));
+ env.events()
+ .publish((symbol_short!("rec_can"),), (owner.clone(),));
Ok(recovery_request)
}
@@ -753,8 +780,11 @@ impl RecoveryModule {
/// Returns a vector of guardian addresses
pub fn get_guardians(env: Env) -> Result, RecoveryError> {
Self::require_initialized(&env)?;
- let guardians: Map =
- env.storage().instance().get(&StorageKey::Guardians).unwrap();
+ let guardians: Map = env
+ .storage()
+ .instance()
+ .get(&StorageKey::Guardians)
+ .unwrap();
let mut guardian_vec = Vec::new(&env);
for guardian in guardians.keys() {
@@ -807,8 +837,11 @@ impl RecoveryModule {
///
/// Returns true if the address is a registered guardian
pub fn is_guardian(env: Env, address: Address) -> bool {
- let guardians: Map =
- env.storage().instance().get(&StorageKey::Guardians).unwrap_or(Map::new(&env));
+ let guardians: Map = env
+ .storage()
+ .instance()
+ .get(&StorageKey::Guardians)
+ .unwrap_or(Map::new(&env));
guardians.contains_key(address)
}
@@ -952,10 +985,10 @@ mod tests {
let guardian1 = Address::generate(&env);
let guardian2 = Address::generate(&env);
let guardians = vec![&env, guardian1.clone(), guardian2.clone()];
-
+
// First initialization should succeed
client.initialize(&owner, &guardians, &2, &604800);
-
+
// Second initialization should panic
client.initialize(&owner, &guardians, &1, &604800);
}
diff --git a/contracts/dutch_auction/src/lib.rs b/contracts/dutch_auction/src/lib.rs
index 6a9b663689..9be7bb089f 100644
--- a/contracts/dutch_auction/src/lib.rs
+++ b/contracts/dutch_auction/src/lib.rs
@@ -42,11 +42,11 @@ pub enum DataKey {
VaultContract,
OracleContract,
// Global parameters
- MinCollateralRatio, // e.g. 15000 = 150% (scaled by 10000)
- AuctionDuration, // Duration in seconds for full price decay
- StartPremiumBps, // Starting premium above oracle price in bps
- FloorDiscountBps, // Floor discount below oracle price in bps
- LiquidationPenaltyBps, // Penalty kept by protocol in bps
+ MinCollateralRatio, // e.g. 15000 = 150% (scaled by 10000)
+ AuctionDuration, // Duration in seconds for full price decay
+ StartPremiumBps, // Starting premium above oracle price in bps
+ FloorDiscountBps, // Floor discount below oracle price in bps
+ LiquidationPenaltyBps, // Penalty kept by protocol in bps
ProtocolFeeRecipient,
}
@@ -70,8 +70,8 @@ pub struct Auction {
pub debt_token: Address,
pub collateral_amount: i128,
pub debt_to_cover: i128,
- pub start_price: i128, // Starting price per unit of collateral (scaled 1e7)
- pub floor_price: i128, // Floor price per unit of collateral (scaled 1e7)
+ pub start_price: i128, // Starting price per unit of collateral (scaled 1e7)
+ pub floor_price: i128, // Floor price per unit of collateral (scaled 1e7)
pub start_time: u64,
pub duration: u64,
pub status: AuctionStatus,
@@ -167,9 +167,7 @@ impl DutchAuction {
env.storage()
.instance()
.set(&DataKey::ProtocolFeeRecipient, &fee_recipient);
- env.storage()
- .instance()
- .set(&DataKey::NextAuctionId, &1u64);
+ env.storage().instance().set(&DataKey::NextAuctionId, &1u64);
env.storage().instance().set(&DataKey::Initialized, &true);
env.events().publish(
@@ -250,7 +248,11 @@ impl DutchAuction {
// Transfer collateral from vault owner to auction contract
let collateral_client = token::Client::new(&env, &collateral_token);
- collateral_client.transfer(&vault_owner, &env.current_contract_address(), &collateral_amount);
+ collateral_client.transfer(
+ &vault_owner,
+ &env.current_contract_address(),
+ &collateral_amount,
+ );
let auction_id: u64 = env
.storage()
@@ -543,8 +545,10 @@ impl DutchAuction {
.instance()
.set(&DataKey::LiquidationPenaltyBps, &penalty_bps);
- env.events()
- .publish((symbol_short!("params"),), (min_collateral_ratio, auction_duration));
+ env.events().publish(
+ (symbol_short!("params"),),
+ (min_collateral_ratio, auction_duration),
+ );
Ok(())
}
@@ -582,7 +586,11 @@ impl DutchAuction {
}
/// Calculate the cost to buy a given amount of collateral at the current price.
- pub fn quote_buy(env: Env, auction_id: u64, collateral_amount: i128) -> Result {
+ pub fn quote_buy(
+ env: Env,
+ auction_id: u64,
+ collateral_amount: i128,
+ ) -> Result {
let auction: Auction = env
.storage()
.persistent()
@@ -709,7 +717,14 @@ mod tests {
&fee_recipient,
);
- (env, client, admin, fee_recipient, collateral_token, debt_token)
+ (
+ env,
+ client,
+ admin,
+ fee_recipient,
+ collateral_token,
+ debt_token,
+ )
}
fn mint_tokens(env: &Env, token_addr: &Address, to: &Address, amount: i128) {
@@ -730,7 +745,17 @@ mod tests {
let (_, client, admin, fee_recipient, _, _) = setup_env();
let vault = Address::generate(&client.address.env());
let oracle = Address::generate(&client.address.env());
- client.initialize(&admin, &vault, &oracle, &15000, &3600, &2000, &1000, &500, &fee_recipient);
+ client.initialize(
+ &admin,
+ &vault,
+ &oracle,
+ &15000,
+ &3600,
+ &2000,
+ &1000,
+ &500,
+ &fee_recipient,
+ );
}
#[test]
diff --git a/contracts/emission_controller/src/lib.rs b/contracts/emission_controller/src/lib.rs
index 77b0a6c54a..9886f016ab 100644
--- a/contracts/emission_controller/src/lib.rs
+++ b/contracts/emission_controller/src/lib.rs
@@ -1,22 +1,25 @@
#![no_std]
use soroban_sdk::{
- Address, Env, Symbol, contract, contracterror, contractimpl, contractmeta, panic_with_error,
- symbol_short,
+ contract, contracterror, contractimpl, contractmeta, panic_with_error, symbol_short, Address,
+ Env, Symbol,
};
// Metadata
contractmeta!(key = "name", val = "Emission Controller - PID");
contractmeta!(key = "version", val = "0.1.0");
-contractmeta!(key = "description", val = "PID-based algorithmic gauge to self-regulate token emissions.");
+contractmeta!(
+ key = "description",
+ val = "PID-based algorithmic gauge to self-regulate token emissions."
+);
#[contracterror]
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum Error {
- NotAdmin = 1,
- AlreadyInitialized = 2,
- NotInitialized = 3,
- InvalidParam = 4,
+ NotAdmin = 1,
+ AlreadyInitialized = 2,
+ NotInitialized = 3,
+ InvalidParam = 4,
}
// Storage keys
@@ -33,19 +36,52 @@ const KEY_MIN_EMIT: Symbol = symbol_short!("MIN"); // lower bound emission
const KEY_MAX_EMIT: Symbol = symbol_short!("MAX"); // upper bound emission
// Helpers
-fn read_bool(env: &Env, k: &Symbol) -> bool { env.storage().instance().get::<_, bool>(k).unwrap_or(false) }
-fn write_bool(env: &Env, k: &Symbol, v: bool) { env.storage().instance().set(k, &v); }
-fn read_i128(env: &Env, k: &Symbol) -> i128 { env.storage().instance().get::<_, i128>(k).unwrap_or(0) }
-fn write_i128(env: &Env, k: &Symbol, v: i128) { env.storage().instance().set(k, &v); }
-fn read_u32(env: &Env, k: &Symbol) -> u32 { env.storage().instance().get::<_, u32>(k).unwrap_or(0) }
-fn write_u32(env: &Env, k: &Symbol, v: u32) { env.storage().instance().set(k, &v); }
-fn read_admin(env: &Env) -> Address { env.storage().instance().get::<_, Address>(&KEY_ADMIN).expect("admin") }
-fn write_admin(env: &Env, a: &Address) { env.storage().instance().set(&KEY_ADMIN, a); }
-fn ensure_init(env: &Env) { if !read_bool(env, &KEY_INIT) { panic_with_error!(env, Error::NotInitialized); } }
-fn ensure_admin(env: &Env, who: &Address) { if &read_admin(env) != who { panic_with_error!(env, Error::NotAdmin) } }
+fn read_bool(env: &Env, k: &Symbol) -> bool {
+ env.storage().instance().get::<_, bool>(k).unwrap_or(false)
+}
+fn write_bool(env: &Env, k: &Symbol, v: bool) {
+ env.storage().instance().set(k, &v);
+}
+fn read_i128(env: &Env, k: &Symbol) -> i128 {
+ env.storage().instance().get::<_, i128>(k).unwrap_or(0)
+}
+fn write_i128(env: &Env, k: &Symbol, v: i128) {
+ env.storage().instance().set(k, &v);
+}
+fn read_u32(env: &Env, k: &Symbol) -> u32 {
+ env.storage().instance().get::<_, u32>(k).unwrap_or(0)
+}
+fn write_u32(env: &Env, k: &Symbol, v: u32) {
+ env.storage().instance().set(k, &v);
+}
+fn read_admin(env: &Env) -> Address {
+ env.storage()
+ .instance()
+ .get::<_, Address>(&KEY_ADMIN)
+ .expect("admin")
+}
+fn write_admin(env: &Env, a: &Address) {
+ env.storage().instance().set(&KEY_ADMIN, a);
+}
+fn ensure_init(env: &Env) {
+ if !read_bool(env, &KEY_INIT) {
+ panic_with_error!(env, Error::NotInitialized);
+ }
+}
+fn ensure_admin(env: &Env, who: &Address) {
+ if &read_admin(env) != who {
+ panic_with_error!(env, Error::NotAdmin)
+ }
+}
fn clamp(value: i128, lo: i128, hi: i128) -> i128 {
- if value < lo { lo } else if value > hi { hi } else { value }
+ if value < lo {
+ lo
+ } else if value > hi {
+ hi
+ } else {
+ value
+ }
}
// Scaling conventions:
@@ -60,211 +96,232 @@ pub struct EmissionController;
#[contractimpl]
impl EmissionController {
- /// Initialize the PID controller parameters.
- ///
- /// - `admin`: access control address.
- /// - `target_utilization_bps`: desired utilization in [0, 10_000].
- /// - `kp_bps`, `ki_bps`, `kd_bps`: PID gains in basis points.
- /// - `min_emission`, `max_emission`: emission bounds (must satisfy min <= max).
- pub fn init(
- env: Env,
- admin: Address,
- target_utilization_bps: u32,
- kp_bps: u32,
- ki_bps: u32,
- kd_bps: u32,
- min_emission: i128,
- max_emission: i128,
- ) {
- if read_bool(&env, &KEY_INIT) { panic_with_error!(&env, Error::AlreadyInitialized) }
- if target_utilization_bps > 10_000 { panic_with_error!(&env, Error::InvalidParam) }
- if min_emission > max_emission { panic_with_error!(&env, Error::InvalidParam) }
- admin.require_auth();
-
- write_admin(&env, &admin);
- write_u32(&env, &KEY_TARGET_BPS, target_utilization_bps);
- write_u32(&env, &KEY_KP_BPS, kp_bps);
- write_u32(&env, &KEY_KI_BPS, ki_bps);
- write_u32(&env, &KEY_KD_BPS, kd_bps);
- write_i128(&env, &KEY_MIN_EMIT, min_emission);
- write_i128(&env, &KEY_MAX_EMIT, max_emission);
- write_i128(&env, &KEY_INT_ACCUM, 0);
- write_i128(&env, &KEY_LAST_ERROR, 0);
- write_i128(&env, &KEY_LAST_EMISSION, min_emission);
- write_bool(&env, &KEY_INIT, true);
- }
-
- /// Update PID gains and/or target utilization. Admin only.
- pub fn configure(env: Env, admin: Address, target_bps: u32, kp_bps: u32, ki_bps: u32, kd_bps: u32) {
- ensure_init(&env);
- ensure_admin(&env, &admin);
- admin.require_auth();
- if target_bps > 10_000 { panic_with_error!(&env, Error::InvalidParam) }
- write_u32(&env, &KEY_TARGET_BPS, target_bps);
- write_u32(&env, &KEY_KP_BPS, kp_bps);
- write_u32(&env, &KEY_KI_BPS, ki_bps);
- write_u32(&env, &KEY_KD_BPS, kd_bps);
- }
-
- /// Update emission bounds. Admin only.
- pub fn set_bounds(env: Env, admin: Address, min_emission: i128, max_emission: i128) {
- ensure_init(&env);
- ensure_admin(&env, &admin);
- admin.require_auth();
- if min_emission > max_emission { panic_with_error!(&env, Error::InvalidParam) }
- write_i128(&env, &KEY_MIN_EMIT, min_emission);
- write_i128(&env, &KEY_MAX_EMIT, max_emission);
- }
-
- /// Compute next daily emission using PID given current `utilization_bps` (0..=10_000).
- ///
- /// Returns the clamped emission value. Maintains internal integral and last-error states.
- pub fn compute_emission(env: Env, utilization_bps: u32) -> i128 {
- ensure_init(&env);
- if utilization_bps > 10_000 { panic_with_error!(&env, Error::InvalidParam) }
-
- let target_bps = read_u32(&env, &KEY_TARGET_BPS) as i128;
- let util_bps = utilization_bps as i128;
-
- // error = target - measured (scale to 1e7)
- let error_scaled = (target_bps - util_bps) * SCALE / 10_000;
-
- // integral = integral + error_scaled
- let mut i_accum = read_i128(&env, &KEY_INT_ACCUM);
- i_accum += error_scaled;
-
- // derivative = error_scaled - last_error
- let last_error = read_i128(&env, &KEY_LAST_ERROR);
- let deriv = error_scaled - last_error;
-
- // Gains
- let kp_bps = read_u32(&env, &KEY_KP_BPS) as i128;
- let ki_bps = read_u32(&env, &KEY_KI_BPS) as i128;
- let kd_bps = read_u32(&env, &KEY_KD_BPS) as i128;
-
- // PID output (scaled emission delta). Combine then downscale.
- // delta = kp*e + ki*I + kd*D where each gain is in bps.
- let p_term = kp_bps * error_scaled;
- let i_term = ki_bps * i_accum;
- let d_term = kd_bps * deriv;
- // Choose a controller divisor to convert from (bps * SCALE) units to emission units.
- const PID_SCALE_DIV: i128 = 1_000; // tuning knob so integer arithmetic yields non-zero deltas
- let delta_units = (p_term + i_term + d_term) / (10_000 * PID_SCALE_DIV);
-
- // Apply to last emission
- let last_emission = read_i128(&env, &KEY_LAST_EMISSION);
- let mut next_emission = last_emission + delta_units;
-
- // Clamp to bounds
- let lo = read_i128(&env, &KEY_MIN_EMIT);
- let hi = read_i128(&env, &KEY_MAX_EMIT);
- next_emission = clamp(next_emission, lo, hi);
-
- // Anti-windup: if clamped, limit integrator by undoing the last i_term contribution
- // Simple approach: if clamping occurred (delta would push out of bounds), lightly damp integral
- if next_emission == lo || next_emission == hi {
- // decay integrator by 1% to avoid runaway
- i_accum = i_accum - (i_accum / 100);
- }
-
- // Persist state
- write_i128(&env, &KEY_INT_ACCUM, i_accum);
- write_i128(&env, &KEY_LAST_ERROR, error_scaled);
- write_i128(&env, &KEY_LAST_EMISSION, next_emission);
-
- next_emission
- }
-
- // Views
- pub fn params(env: Env) -> (u32, u32, u32, u32, i128, i128) {
- (
- read_u32(&env, &KEY_TARGET_BPS),
- read_u32(&env, &KEY_KP_BPS),
- read_u32(&env, &KEY_KI_BPS),
- read_u32(&env, &KEY_KD_BPS),
- read_i128(&env, &KEY_MIN_EMIT),
- read_i128(&env, &KEY_MAX_EMIT),
- )
- }
- pub fn state(env: Env) -> (i128, i128, i128) {
- (
- read_i128(&env, &KEY_INT_ACCUM),
- read_i128(&env, &KEY_LAST_ERROR),
- read_i128(&env, &KEY_LAST_EMISSION),
- )
- }
+ /// Initialize the PID controller parameters.
+ ///
+ /// - `admin`: access control address.
+ /// - `target_utilization_bps`: desired utilization in [0, 10_000].
+ /// - `kp_bps`, `ki_bps`, `kd_bps`: PID gains in basis points.
+ /// - `min_emission`, `max_emission`: emission bounds (must satisfy min <= max).
+ pub fn init(
+ env: Env,
+ admin: Address,
+ target_utilization_bps: u32,
+ kp_bps: u32,
+ ki_bps: u32,
+ kd_bps: u32,
+ min_emission: i128,
+ max_emission: i128,
+ ) {
+ if read_bool(&env, &KEY_INIT) {
+ panic_with_error!(&env, Error::AlreadyInitialized)
+ }
+ if target_utilization_bps > 10_000 {
+ panic_with_error!(&env, Error::InvalidParam)
+ }
+ if min_emission > max_emission {
+ panic_with_error!(&env, Error::InvalidParam)
+ }
+ admin.require_auth();
+
+ write_admin(&env, &admin);
+ write_u32(&env, &KEY_TARGET_BPS, target_utilization_bps);
+ write_u32(&env, &KEY_KP_BPS, kp_bps);
+ write_u32(&env, &KEY_KI_BPS, ki_bps);
+ write_u32(&env, &KEY_KD_BPS, kd_bps);
+ write_i128(&env, &KEY_MIN_EMIT, min_emission);
+ write_i128(&env, &KEY_MAX_EMIT, max_emission);
+ write_i128(&env, &KEY_INT_ACCUM, 0);
+ write_i128(&env, &KEY_LAST_ERROR, 0);
+ write_i128(&env, &KEY_LAST_EMISSION, min_emission);
+ write_bool(&env, &KEY_INIT, true);
+ }
+
+ /// Update PID gains and/or target utilization. Admin only.
+ pub fn configure(
+ env: Env,
+ admin: Address,
+ target_bps: u32,
+ kp_bps: u32,
+ ki_bps: u32,
+ kd_bps: u32,
+ ) {
+ ensure_init(&env);
+ ensure_admin(&env, &admin);
+ admin.require_auth();
+ if target_bps > 10_000 {
+ panic_with_error!(&env, Error::InvalidParam)
+ }
+ write_u32(&env, &KEY_TARGET_BPS, target_bps);
+ write_u32(&env, &KEY_KP_BPS, kp_bps);
+ write_u32(&env, &KEY_KI_BPS, ki_bps);
+ write_u32(&env, &KEY_KD_BPS, kd_bps);
+ }
+
+ /// Update emission bounds. Admin only.
+ pub fn set_bounds(env: Env, admin: Address, min_emission: i128, max_emission: i128) {
+ ensure_init(&env);
+ ensure_admin(&env, &admin);
+ admin.require_auth();
+ if min_emission > max_emission {
+ panic_with_error!(&env, Error::InvalidParam)
+ }
+ write_i128(&env, &KEY_MIN_EMIT, min_emission);
+ write_i128(&env, &KEY_MAX_EMIT, max_emission);
+ }
+
+ /// Compute next daily emission using PID given current `utilization_bps` (0..=10_000).
+ ///
+ /// Returns the clamped emission value. Maintains internal integral and last-error states.
+ pub fn compute_emission(env: Env, utilization_bps: u32) -> i128 {
+ ensure_init(&env);
+ if utilization_bps > 10_000 {
+ panic_with_error!(&env, Error::InvalidParam)
+ }
+
+ let target_bps = read_u32(&env, &KEY_TARGET_BPS) as i128;
+ let util_bps = utilization_bps as i128;
+
+ // error = target - measured (scale to 1e7)
+ let error_scaled = (target_bps - util_bps) * SCALE / 10_000;
+
+ // integral = integral + error_scaled
+ let mut i_accum = read_i128(&env, &KEY_INT_ACCUM);
+ i_accum += error_scaled;
+
+ // derivative = error_scaled - last_error
+ let last_error = read_i128(&env, &KEY_LAST_ERROR);
+ let deriv = error_scaled - last_error;
+
+ // Gains
+ let kp_bps = read_u32(&env, &KEY_KP_BPS) as i128;
+ let ki_bps = read_u32(&env, &KEY_KI_BPS) as i128;
+ let kd_bps = read_u32(&env, &KEY_KD_BPS) as i128;
+
+ // PID output (scaled emission delta). Combine then downscale.
+ // delta = kp*e + ki*I + kd*D where each gain is in bps.
+ let p_term = kp_bps * error_scaled;
+ let i_term = ki_bps * i_accum;
+ let d_term = kd_bps * deriv;
+ // Choose a controller divisor to convert from (bps * SCALE) units to emission units.
+ const PID_SCALE_DIV: i128 = 1_000; // tuning knob so integer arithmetic yields non-zero deltas
+ let delta_units = (p_term + i_term + d_term) / (10_000 * PID_SCALE_DIV);
+
+ // Apply to last emission
+ let last_emission = read_i128(&env, &KEY_LAST_EMISSION);
+ let mut next_emission = last_emission + delta_units;
+
+ // Clamp to bounds
+ let lo = read_i128(&env, &KEY_MIN_EMIT);
+ let hi = read_i128(&env, &KEY_MAX_EMIT);
+ next_emission = clamp(next_emission, lo, hi);
+
+ // Anti-windup: if clamped, limit integrator by undoing the last i_term contribution
+ // Simple approach: if clamping occurred (delta would push out of bounds), lightly damp integral
+ if next_emission == lo || next_emission == hi {
+ // decay integrator by 1% to avoid runaway
+ i_accum = i_accum - (i_accum / 100);
+ }
+
+ // Persist state
+ write_i128(&env, &KEY_INT_ACCUM, i_accum);
+ write_i128(&env, &KEY_LAST_ERROR, error_scaled);
+ write_i128(&env, &KEY_LAST_EMISSION, next_emission);
+
+ next_emission
+ }
+
+ // Views
+ pub fn params(env: Env) -> (u32, u32, u32, u32, i128, i128) {
+ (
+ read_u32(&env, &KEY_TARGET_BPS),
+ read_u32(&env, &KEY_KP_BPS),
+ read_u32(&env, &KEY_KI_BPS),
+ read_u32(&env, &KEY_KD_BPS),
+ read_i128(&env, &KEY_MIN_EMIT),
+ read_i128(&env, &KEY_MAX_EMIT),
+ )
+ }
+ pub fn state(env: Env) -> (i128, i128, i128) {
+ (
+ read_i128(&env, &KEY_INT_ACCUM),
+ read_i128(&env, &KEY_LAST_ERROR),
+ read_i128(&env, &KEY_LAST_EMISSION),
+ )
+ }
}
#[cfg(test)]
mod test {
- use super::*;
- use soroban_sdk::testutils::Address as _;
-
- #[test]
- fn init_and_params() {
- let env = Env::default();
- env.mock_all_auths();
- let admin = Address::generate(&env);
- let cid = env.register_contract(None, EmissionController);
- let c = EmissionControllerClient::new(&env, &cid);
-
- c.init(&admin, &7_500, &500, &50, &100, &0, &1_000_000);
- let (t, kp, ki, kd, lo, hi) = c.params();
- assert_eq!(t, 7_500);
- assert_eq!(kp, 500);
- assert_eq!(ki, 50);
- assert_eq!(kd, 100);
- assert_eq!(lo, 0);
- assert_eq!(hi, 1_000_000);
- }
-
- #[test]
- fn pid_converges_towards_target() {
- let env = Env::default();
- env.mock_all_auths();
- let admin = Address::generate(&env);
- let cid = env.register_contract(None, EmissionController);
- let c = EmissionControllerClient::new(&env, &cid);
-
- // Target 70% utilization, moderate gains, emission bounds [0, 1_000_000]
- c.init(&admin, &7_000, &400, &30, &80, &0, &1_000_000);
-
- // Start far below target utilization and see emissions rise then stabilize
- let mut util_series = [2_000u32, 3_000, 4_000, 5_000, 6_000, 6_500, 6_800, 6_900, 7_000, 7_100, 7_000];
- let mut last = 0i128;
- for u in util_series.iter() {
- last = c.compute_emission(u);
- let (_i, _e, le) = c.state();
- assert_eq!(le, last);
- // should remain within bounds
- assert!(last >= 0 && last <= 1_000_000);
- }
- // Small deviation around target should avoid extreme swings
- let e1 = c.compute_emission(&6_900);
- let e2 = c.compute_emission(&7_050);
- let diff = (e2 - e1).abs();
- assert!(diff < 200_000); // stability heuristic for test purposes
- }
-
- #[test]
- fn clamps_and_anti_windup() {
- let env = Env::default();
- env.mock_all_auths();
- let admin = Address::generate(&env);
- let cid = env.register_contract(None, EmissionController);
- let c = EmissionControllerClient::new(&env, &cid);
-
- c.init(&admin, &9_500, &1_000, &500, &500, &10, &100);
-
- // Very low utilization vs high target -> will try to increase emission, but clamps at 100
- for _ in 0..10 {
- let out = c.compute_emission(&1_000);
- assert_eq!(out, 100);
- }
- // Now set high utilization -> should reduce quickly, not below 10
- for _ in 0..10 {
- let out = c.compute_emission(&10_000);
- assert!(out >= 10);
- }
- }
+ use super::*;
+ use soroban_sdk::testutils::Address as _;
+
+ #[test]
+ fn init_and_params() {
+ let env = Env::default();
+ env.mock_all_auths();
+ let admin = Address::generate(&env);
+ let cid = env.register_contract(None, EmissionController);
+ let c = EmissionControllerClient::new(&env, &cid);
+
+ c.init(&admin, &7_500, &500, &50, &100, &0, &1_000_000);
+ let (t, kp, ki, kd, lo, hi) = c.params();
+ assert_eq!(t, 7_500);
+ assert_eq!(kp, 500);
+ assert_eq!(ki, 50);
+ assert_eq!(kd, 100);
+ assert_eq!(lo, 0);
+ assert_eq!(hi, 1_000_000);
+ }
+
+ #[test]
+ fn pid_converges_towards_target() {
+ let env = Env::default();
+ env.mock_all_auths();
+ let admin = Address::generate(&env);
+ let cid = env.register_contract(None, EmissionController);
+ let c = EmissionControllerClient::new(&env, &cid);
+
+ // Target 70% utilization, moderate gains, emission bounds [0, 1_000_000]
+ c.init(&admin, &7_000, &400, &30, &80, &0, &1_000_000);
+
+ // Start far below target utilization and see emissions rise then stabilize
+ let mut util_series = [
+ 2_000u32, 3_000, 4_000, 5_000, 6_000, 6_500, 6_800, 6_900, 7_000, 7_100, 7_000,
+ ];
+ let mut last = 0i128;
+ for u in util_series.iter() {
+ last = c.compute_emission(u);
+ let (_i, _e, le) = c.state();
+ assert_eq!(le, last);
+ // should remain within bounds
+ assert!(last >= 0 && last <= 1_000_000);
+ }
+ // Small deviation around target should avoid extreme swings
+ let e1 = c.compute_emission(&6_900);
+ let e2 = c.compute_emission(&7_050);
+ let diff = (e2 - e1).abs();
+ assert!(diff < 200_000); // stability heuristic for test purposes
+ }
+
+ #[test]
+ fn clamps_and_anti_windup() {
+ let env = Env::default();
+ env.mock_all_auths();
+ let admin = Address::generate(&env);
+ let cid = env.register_contract(None, EmissionController);
+ let c = EmissionControllerClient::new(&env, &cid);
+
+ c.init(&admin, &9_500, &1_000, &500, &500, &10, &100);
+
+ // Very low utilization vs high target -> will try to increase emission, but clamps at 100
+ for _ in 0..10 {
+ let out = c.compute_emission(&1_000);
+ assert_eq!(out, 100);
+ }
+ // Now set high utilization -> should reduce quickly, not below 10
+ for _ in 0..10 {
+ let out = c.compute_emission(&10_000);
+ assert!(out >= 10);
+ }
+ }
}
diff --git a/contracts/intent_swap/src/lib.rs b/contracts/intent_swap/src/lib.rs
index 6e1f196660..14e453276d 100644
--- a/contracts/intent_swap/src/lib.rs
+++ b/contracts/intent_swap/src/lib.rs
@@ -128,12 +128,8 @@ impl IntentSwap {
}
env.storage().instance().set(&DataKey::Admin, &admin);
- env.storage()
- .instance()
- .set(&DataKey::NextIntentId, &1u64);
- env.storage()
- .instance()
- .set(&DataKey::MinStake, &min_stake);
+ env.storage().instance().set(&DataKey::NextIntentId, &1u64);
+ env.storage().instance().set(&DataKey::MinStake, &min_stake);
env.storage()
.instance()
.set(&DataKey::ProtocolFeeBps, &protocol_fee_bps);
@@ -143,8 +139,10 @@ impl IntentSwap {
env.storage().instance().set(&DataKey::SolverCount, &0u32);
env.storage().instance().set(&DataKey::Initialized, &true);
- env.events()
- .publish((symbol_short!("init"),), (admin, min_stake, protocol_fee_bps));
+ env.events().publish(
+ (symbol_short!("init"),),
+ (admin, min_stake, protocol_fee_bps),
+ );
Ok(())
}
@@ -455,9 +453,7 @@ impl IntentSwap {
/// Update minimum solver stake. Admin only.
pub fn set_min_stake(env: Env, admin: Address, min_stake: i128) -> Result<(), SwapError> {
Self::require_admin(&env, &admin)?;
- env.storage()
- .instance()
- .set(&DataKey::MinStake, &min_stake);
+ env.storage().instance().set(&DataKey::MinStake, &min_stake);
Ok(())
}
@@ -602,8 +598,7 @@ impl IntentSwap {
.instance()
.set(&DataKey::SolverCount, &(count.saturating_sub(1)));
- env.events()
- .publish((symbol_short!("unstake"),), (solver,));
+ env.events().publish((symbol_short!("unstake"),), (solver,));
Ok(())
}
@@ -672,7 +667,15 @@ mod tests {
client.initialize(&admin, &1000, &50, &fee_recipient); // 0.5% fee, 1000 min stake
- (env, client, admin, fee_recipient, token_a, token_b, contract_id)
+ (
+ env,
+ client,
+ admin,
+ fee_recipient,
+ token_a,
+ token_b,
+ contract_id,
+ )
}
fn mint_tokens(env: &Env, token_addr: &Address, to: &Address, amount: i128) {
@@ -703,11 +706,7 @@ mod tests {
env.ledger().set_timestamp(100);
let intent_id = client.create_intent(
- &user,
- &token_a,
- &token_b,
- &10_000,
- &9_500, // min 9500 buy tokens
+ &user, &token_a, &token_b, &10_000, &9_500, // min 9500 buy tokens
&200, // expires at ledger 200
&false,
);
@@ -727,7 +726,8 @@ mod tests {
mint_tokens(&env, &token_a, &user, 10_000);
env.ledger().set_timestamp(100);
- let intent_id = client.create_intent(&user, &token_a, &token_b, &10_000, &9_500, &200, &false);
+ let intent_id =
+ client.create_intent(&user, &token_a, &token_b, &10_000, &9_500, &200, &false);
client.cancel_intent(&user, &intent_id);
@@ -756,7 +756,8 @@ mod tests {
assert_eq!(client.solver_count(), 1);
// Create intent
- let intent_id = client.create_intent(&user, &token_a, &token_b, &10_000, &9_500, &200, &false);
+ let intent_id =
+ client.create_intent(&user, &token_a, &token_b, &10_000, &9_500, &200, &false);
// Fill intent — solver provides 10_000 buy tokens
client.fill_intent(&solver_addr, &intent_id, &10_000, &10_000);
@@ -785,7 +786,8 @@ mod tests {
client.register_solver(&solver_addr, &token_a, &1_000);
// Create intent with partial fill enabled
- let intent_id = client.create_intent(&user, &token_a, &token_b, &10_000, &9_500, &200, &true);
+ let intent_id =
+ client.create_intent(&user, &token_a, &token_b, &10_000, &9_500, &200, &true);
// Partial fill — only 5000 of 10000
client.fill_intent(&solver_addr, &intent_id, &5_000, &5_000);
@@ -809,7 +811,8 @@ mod tests {
env.ledger().set_timestamp(100);
client.register_solver(&solver_addr, &token_a, &1_000);
- let intent_id = client.create_intent(&user, &token_a, &token_b, &10_000, &9_500, &200, &false);
+ let intent_id =
+ client.create_intent(&user, &token_a, &token_b, &10_000, &9_500, &200, &false);
// Try to fill with less than min_buy_amount
client.fill_intent(&solver_addr, &intent_id, &5_000, &10_000);
@@ -823,7 +826,8 @@ mod tests {
mint_tokens(&env, &token_a, &user, 10_000);
env.ledger().set_timestamp(100);
- let intent_id = client.create_intent(&user, &token_a, &token_b, &10_000, &9_500, &200, &false);
+ let intent_id =
+ client.create_intent(&user, &token_a, &token_b, &10_000, &9_500, &200, &false);
// Advance time past expiry
env.ledger().set_timestamp(201);
@@ -848,7 +852,8 @@ mod tests {
mint_tokens(&env, &token_b, &rando, 20_000);
env.ledger().set_timestamp(100);
- let intent_id = client.create_intent(&user, &token_a, &token_b, &10_000, &9_500, &200, &false);
+ let intent_id =
+ client.create_intent(&user, &token_a, &token_b, &10_000, &9_500, &200, &false);
// Non-registered solver tries to fill
client.fill_intent(&rando, &intent_id, &10_000, &10_000);
diff --git a/contracts/liquid_staking/src/lib.rs b/contracts/liquid_staking/src/lib.rs
index 5944291c90..8570825f99 100644
--- a/contracts/liquid_staking/src/lib.rs
+++ b/contracts/liquid_staking/src/lib.rs
@@ -1,8 +1,8 @@
#![no_std]
use soroban_sdk::{
- symbol_short, Address, BytesN, Env, Symbol, Vec, Val, contract, contracterror,
- contractimpl, contractmeta, panic_with_error, String as SorobanString, IntoVal,
+ contract, contracterror, contractimpl, contractmeta, panic_with_error, symbol_short, Address,
+ BytesN, Env, IntoVal, String as SorobanString, Symbol, Val, Vec,
};
// -----------------------------
@@ -10,7 +10,10 @@ use soroban_sdk::{
// -----------------------------
contractmeta!(key = "name", val = "Liquid Staking Derivative - yXLM");
contractmeta!(key = "version", val = "0.1.0");
-contractmeta!(key = "description", val = "Accepts native XLM deposits, delegates to validators, and mints yXLM.");
+contractmeta!(
+ key = "description",
+ val = "Accepts native XLM deposits, delegates to validators, and mints yXLM."
+);
// -----------------------------
// Errors
@@ -18,13 +21,13 @@ contractmeta!(key = "description", val = "Accepts native XLM deposits, delegates
#[contracterror]
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum Error {
- NotAdmin = 1,
- NotInitialized = 2,
- AlreadyInitialized = 3,
- ValidatorNotWhitelisted = 4,
- AmountMustBePositive = 5,
- ZeroShares = 6,
- Unauthorized = 7,
+ NotAdmin = 1,
+ NotInitialized = 2,
+ AlreadyInitialized = 3,
+ ValidatorNotWhitelisted = 4,
+ AmountMustBePositive = 5,
+ ZeroShares = 6,
+ Unauthorized = 7,
}
// -----------------------------
@@ -39,168 +42,190 @@ const KEY_MULTIPLIER_BPS: Symbol = symbol_short!("MBPS"); // 10_000 = 1.0x
const KEY_TOTAL_SUPPLY: Symbol = symbol_short!("TSUP");
const KEY_TOKEN_XLM: Symbol = symbol_short!("XLM");
-fn key_balance(addr: &Address) -> (Symbol, Address) { (symbol_short!("BAL"), addr.clone()) }
+fn key_balance(addr: &Address) -> (Symbol, Address) {
+ (symbol_short!("BAL"), addr.clone())
+}
fn key_allow(owner: &Address, spender: &Address) -> (Symbol, Address, Address) {
- (symbol_short!("ALLOW"), owner.clone(), spender.clone())
+ (symbol_short!("ALLOW"), owner.clone(), spender.clone())
}
// -----------------------------
// Validator storage
// -----------------------------
const KEY_VAL_WEIGHT: Symbol = symbol_short!("VW"); // composite with id
-fn key_val_weight(id: &BytesN<32>) -> (Symbol, BytesN<32>) { (KEY_VAL_WEIGHT, id.clone()) }
+fn key_val_weight(id: &BytesN<32>) -> (Symbol, BytesN<32>) {
+ (KEY_VAL_WEIGHT, id.clone())
+}
// -----------------------------
// Events
// -----------------------------
fn event_deposit(env: &Env, from: &Address, amount: i128, shares: i128) {
- env.events().publish(
- (symbol_short!("deposit"), from),
- (amount, shares),
- );
+ env.events()
+ .publish((symbol_short!("deposit"), from), (amount, shares));
}
fn event_withdraw(env: &Env, to: &Address, amount: i128, shares: i128) {
- env.events().publish(
- (symbol_short!("withdraw"), to),
- (amount, shares),
- );
+ env.events()
+ .publish((symbol_short!("withdraw"), to), (amount, shares));
}
fn event_delegate(env: &Env, validator: &BytesN<32>, amount: i128) {
- env.events().publish(
- (symbol_short!("delegate"), validator),
- amount,
- );
+ env.events()
+ .publish((symbol_short!("delegate"), validator), amount);
}
fn event_rebase(env: &Env, old_multiplier_bps: u32, new_multiplier_bps: u32) {
- env.events().publish(
- (symbol_short!("rebase"),),
- (old_multiplier_bps, new_multiplier_bps),
- );
+ env.events().publish(
+ (symbol_short!("rebase"),),
+ (old_multiplier_bps, new_multiplier_bps),
+ );
}
// -----------------------------
// Helpers (storage)
// -----------------------------
fn read_initialized(env: &Env) -> bool {
- env.storage().instance().get::<_, bool>(&KEY_INIT).unwrap_or(false)
+ env.storage()
+ .instance()
+ .get::<_, bool>(&KEY_INIT)
+ .unwrap_or(false)
}
fn write_initialized(env: &Env, v: bool) {
- env.storage().instance().set(&KEY_INIT, &v);
+ env.storage().instance().set(&KEY_INIT, &v);
}
fn read_admin(env: &Env) -> Address {
- env.storage().instance().get::<_, Address>(&KEY_ADMIN).expect("admin not set")
+ env.storage()
+ .instance()
+ .get::<_, Address>(&KEY_ADMIN)
+ .expect("admin not set")
}
fn write_admin(env: &Env, admin: &Address) {
- env.storage().instance().set(&KEY_ADMIN, admin);
+ env.storage().instance().set(&KEY_ADMIN, admin);
}
fn read_total_staked(env: &Env) -> i128 {
- env.storage().instance().get::<_, i128>(&KEY_TOTAL_STAKED).unwrap_or(0)
+ env.storage()
+ .instance()
+ .get::<_, i128>(&KEY_TOTAL_STAKED)
+ .unwrap_or(0)
}
fn write_total_staked(env: &Env, v: i128) {
- env.storage().instance().set(&KEY_TOTAL_STAKED, &v);
+ env.storage().instance().set(&KEY_TOTAL_STAKED, &v);
}
fn read_total_shares(env: &Env) -> i128 {
- env.storage().instance().get::<_, i128>(&KEY_TOTAL_SHARES).unwrap_or(0)
+ env.storage()
+ .instance()
+ .get::<_, i128>(&KEY_TOTAL_SHARES)
+ .unwrap_or(0)
}
fn write_total_shares(env: &Env, v: i128) {
- env.storage().instance().set(&KEY_TOTAL_SHARES, &v);
+ env.storage().instance().set(&KEY_TOTAL_SHARES, &v);
}
fn read_total_supply(env: &Env) -> i128 {
- env.storage().instance().get::<_, i128>(&KEY_TOTAL_SUPPLY).unwrap_or(0)
+ env.storage()
+ .instance()
+ .get::<_, i128>(&KEY_TOTAL_SUPPLY)
+ .unwrap_or(0)
}
fn write_total_supply(env: &Env, v: i128) {
- env.storage().instance().set(&KEY_TOTAL_SUPPLY, &v);
+ env.storage().instance().set(&KEY_TOTAL_SUPPLY, &v);
}
fn read_multiplier_bps(env: &Env) -> u32 {
- env.storage().instance().get::<_, u32>(&KEY_MULTIPLIER_BPS).unwrap_or(10_000)
+ env.storage()
+ .instance()
+ .get::<_, u32>(&KEY_MULTIPLIER_BPS)
+ .unwrap_or(10_000)
}
fn write_multiplier_bps(env: &Env, v: u32) {
- env.storage().instance().set(&KEY_MULTIPLIER_BPS, &v);
+ env.storage().instance().set(&KEY_MULTIPLIER_BPS, &v);
}
fn read_validators(env: &Env) -> Vec> {
- env.storage().instance().get::<_, Vec>>(&KEY_VALIDATORS).unwrap_or(Vec::new(env))
+ env.storage()
+ .instance()
+ .get::<_, Vec>>(&KEY_VALIDATORS)
+ .unwrap_or(Vec::new(env))
}
fn write_validators(env: &Env, vals: &Vec>) {
- env.storage().instance().set(&KEY_VALIDATORS, vals);
+ env.storage().instance().set(&KEY_VALIDATORS, vals);
}
fn ensure_admin(env: &Env, who: &Address) {
- let admin = read_admin(env);
- if &admin != who {
- panic_with_error!(env, Error::NotAdmin);
- }
+ let admin = read_admin(env);
+ if &admin != who {
+ panic_with_error!(env, Error::NotAdmin);
+ }
}
fn ensure_initialized(env: &Env) {
- if !read_initialized(env) {
- panic_with_error!(env, Error::NotInitialized);
- }
+ if !read_initialized(env) {
+ panic_with_error!(env, Error::NotInitialized);
+ }
}
fn read_token_xlm(env: &Env) -> Address {
- env.storage().instance().get::<_, Address>(&KEY_TOKEN_XLM).expect("xlm token not set")
+ env.storage()
+ .instance()
+ .get::<_, Address>(&KEY_TOKEN_XLM)
+ .expect("xlm token not set")
}
fn write_token_xlm(env: &Env, addr: &Address) {
- env.storage().instance().set(&KEY_TOKEN_XLM, addr);
+ env.storage().instance().set(&KEY_TOKEN_XLM, addr);
}
// -----------------------------
// Minimal token client (transfer)
// -----------------------------
fn token_transfer_from(env: &Env, token: &Address, from: &Address, to: &Address, amount: i128) {
- // call token.transfer(from, to, amount)
- // standard Soroban token uses method name "transfer" with (from, to, amount)
- let mut args: Vec = Vec::new(env);
- args.push_back(from.clone().into_val(env));
- args.push_back(to.clone().into_val(env));
- args.push_back(amount.into_val(env));
- env.invoke_contract::<()>(&token, &symbol_short!("transfer"), args);
+ // call token.transfer(from, to, amount)
+ // standard Soroban token uses method name "transfer" with (from, to, amount)
+ let mut args: Vec = Vec::new(env);
+ args.push_back(from.clone().into_val(env));
+ args.push_back(to.clone().into_val(env));
+ args.push_back(amount.into_val(env));
+ env.invoke_contract::<()>(&token, &symbol_short!("transfer"), args);
}
fn token_transfer(env: &Env, token: &Address, to: &Address, amount: i128) {
- // transfer from contract (self) to `to`
- let from = env.current_contract_address();
- let mut args: Vec = Vec::new(env);
- args.push_back(from.into_val(env));
- args.push_back(to.clone().into_val(env));
- args.push_back(amount.into_val(env));
- env.invoke_contract::<()>(&token, &symbol_short!("transfer"), args);
+ // transfer from contract (self) to `to`
+ let from = env.current_contract_address();
+ let mut args: Vec = Vec::new(env);
+ args.push_back(from.into_val(env));
+ args.push_back(to.clone().into_val(env));
+ args.push_back(amount.into_val(env));
+ env.invoke_contract::<()>(&token, &symbol_short!("transfer"), args);
}
fn token_balance_of(env: &Env, token: &Address, owner: &Address) -> i128 {
- let mut args: Vec = Vec::new(env);
- args.push_back(owner.clone().into_val(env));
- env.invoke_contract::(&token, &symbol_short!("balance"), args)
+ let mut args: Vec = Vec::new(env);
+ args.push_back(owner.clone().into_val(env));
+ env.invoke_contract::(&token, &symbol_short!("balance"), args)
}
// -----------------------------
// Core math: shares and exchange rate
// -----------------------------
fn preview_mint_shares(env: &Env, deposit_amount: i128) -> i128 {
- let total_staked = read_total_staked(env);
- let total_shares = read_total_shares(env);
- if total_shares == 0 || total_staked == 0 {
- // First deposit: 1:1 shares minted, scaled by multiplier already 1.0x initially
- return deposit_amount;
- }
- // shares = deposit * total_shares / total_staked
- deposit_amount * total_shares / total_staked
+ let total_staked = read_total_staked(env);
+ let total_shares = read_total_shares(env);
+ if total_shares == 0 || total_staked == 0 {
+ // First deposit: 1:1 shares minted, scaled by multiplier already 1.0x initially
+ return deposit_amount;
+ }
+ // shares = deposit * total_shares / total_staked
+ deposit_amount * total_shares / total_staked
}
fn preview_redeem_amount(env: &Env, share_amount: i128) -> i128 {
- let total_staked = read_total_staked(env);
- let total_shares = read_total_shares(env);
- if total_shares == 0 || total_staked == 0 {
- return 0;
- }
- // amount = shares * total_staked / total_shares
- share_amount * total_staked / total_shares
+ let total_staked = read_total_staked(env);
+ let total_shares = read_total_shares(env);
+ if total_shares == 0 || total_staked == 0 {
+ return 0;
+ }
+ // amount = shares * total_staked / total_shares
+ share_amount * total_staked / total_shares
}
// -----------------------------
@@ -211,304 +236,324 @@ pub struct LiquidStaking;
#[contractimpl]
impl LiquidStaking {
- /// Initialize the contract with an `admin` address and native XLM token contract address.
- ///
- /// Requirements:
- /// - Must be called exactly once.
- /// - Sets initial multiplier to 1.0x (10_000 bps).
- pub fn init(env: Env, admin: Address, xlm_token: Address) {
- if read_initialized(&env) {
- panic_with_error!(&env, Error::AlreadyInitialized);
- }
- admin.require_auth();
- write_admin(&env, &admin);
- write_token_xlm(&env, &xlm_token);
- write_multiplier_bps(&env, 10_000);
- write_total_supply(&env, 0);
- write_initialized(&env, true);
- }
-
- /// Add or update a validator in the whitelist with `weight_bps`.
- ///
- /// Access: admin-only.
- pub fn upsert_validator(env: Env, admin: Address, id: BytesN<32>, weight_bps: u32) {
- ensure_initialized(&env);
- ensure_admin(&env, &admin);
- admin.require_auth();
-
- let mut vals = read_validators(&env);
- let mut exists = false;
- for vid in vals.iter() {
- if vid == id {
- exists = true;
- }
- }
- if !exists {
- vals.push_back(id.clone());
- write_validators(&env, &vals);
- }
- env.storage().instance().set(&key_val_weight(&id), &weight_bps);
- }
-
- /// Remove a validator from the whitelist.
- ///
- /// Access: admin-only.
- pub fn remove_validator(env: Env, admin: Address, id: BytesN<32>) {
- ensure_initialized(&env);
- ensure_admin(&env, &admin);
- admin.require_auth();
-
- let vals = read_validators(&env);
- let mut next = Vec::new(&env);
- for v in vals.iter() {
- if v != id {
- next.push_back(v);
- }
- }
- write_validators(&env, &next);
- env.storage().instance().remove(&key_val_weight(&id));
- }
-
- /// Deposit native XLM and receive yXLM shares.
- ///
- /// Notes:
- /// - This function assumes the caller has already transferred native XLM
- /// to this contract address via the Stellar Asset Contract prior to the call,
- /// or this function will be extended in a follow-up to perform the
- /// transfer-in through cross-contract invocation (SDK-guarded).
- /// - Mints shares based on current exchange rate.
- pub fn deposit(env: Env, from: Address, amount: i128) -> i128 {
- ensure_initialized(&env);
- if amount <= 0 {
- panic_with_error!(&env, Error::AmountMustBePositive);
- }
- from.require_auth();
-
- // Pull native XLM into the contract via token transfer
- let token = read_token_xlm(&env);
- let self_addr = env.current_contract_address();
- let pool_before = token_balance_of(&env, &token, &self_addr);
- token_transfer_from(&env, &token, &from, &self_addr, amount);
-
- // Compute shares to mint based on current exchange rate (total_staked/total_shares)
- // Use pool_before for stable pricing during the operation
- let total_shares = read_total_shares(&env);
- let shares = if total_shares == 0 || pool_before == 0 {
- amount
- } else {
- amount * total_shares / pool_before
- };
- if shares <= 0 {
- panic_with_error!(&env, Error::ZeroShares);
- }
-
- // Update totals; set total_staked to actual token balance post-transfer for 1:1 backing
- let pool_after = token_balance_of(&env, &token, &self_addr);
- write_total_staked(&env, pool_after);
- let new_total_shares = read_total_shares(&env) + shares;
- write_total_shares(&env, new_total_shares);
- let new_total_supply = read_total_supply(&env) + shares;
- write_total_supply(&env, new_total_supply);
-
- // Mint yXLM shares to depositor
- let mut bal = Self::balance(env.clone(), from.clone());
- bal += shares;
- env.storage().instance().set(&key_balance(&from), &bal);
-
- // Emit event and return shares to mint (mint mechanics will be wired)
- event_deposit(&env, &from, amount, shares);
- shares
- }
-
- /// Redeem `share_amount` yXLM shares for underlying XLM.
- ///
- /// Notes:
- /// - This function returns the amount of XLM to withdraw.
- /// - Transfer-out and share burn will be wired next.
- pub fn redeem(env: Env, to: Address, share_amount: i128) -> i128 {
- ensure_initialized(&env);
- if share_amount <= 0 {
- panic_with_error!(&env, Error::AmountMustBePositive);
- }
- to.require_auth();
-
- // Price using current pool and total_shares
- let token = read_token_xlm(&env);
- let self_addr = env.current_contract_address();
- let pool_before = token_balance_of(&env, &token, &self_addr);
- let total_shares = read_total_shares(&env);
- let amount = if total_shares == 0 || pool_before == 0 {
- 0
- } else {
- share_amount * pool_before / total_shares
- };
- if amount <= 0 {
- panic_with_error!(&env, Error::ZeroShares);
- }
-
- // Burn shares from user
- let mut bal = Self::balance(env.clone(), to.clone());
- // naive check; underflow will panic anyway
- if bal < share_amount {
- panic_with_error!(&env, Error::Unauthorized);
- }
- bal -= share_amount;
- env.storage().instance().set(&key_balance(&to), &bal);
- let new_total_supply = read_total_supply(&env) - share_amount;
- write_total_supply(&env, new_total_supply);
-
- // Transfer out native XLM to user
- token_transfer(&env, &token, &to, amount);
-
- // Update totals; set total_staked to actual token balance post-transfer for 1:1 backing
- let pool_after = token_balance_of(&env, &token, &self_addr);
- write_total_staked(&env, pool_after);
- let new_total_shares = read_total_shares(&env) - share_amount;
- write_total_shares(&env, new_total_shares);
-
- event_withdraw(&env, &to, amount, share_amount);
- amount
- }
-
- /// Adjust the global share multiplier basis points (for accounting/events).
- ///
- /// Access: admin-only.
- /// Example: 10_000 -> 10_200 represents a +2% global reward signal (does not move funds).
- pub fn rebase(env: Env, admin: Address, new_multiplier_bps: u32) {
- ensure_initialized(&env);
- ensure_admin(&env, &admin);
- admin.require_auth();
-
- let old = read_multiplier_bps(&env);
- write_multiplier_bps(&env, new_multiplier_bps);
- event_rebase(&env, old, new_multiplier_bps);
- }
-
- /// Delegate stake to a whitelisted validator. Emits an event for off-chain indexing.
- ///
- /// Access: admin-only for now; can be extended to keeper roles.
- pub fn delegate(env: Env, admin: Address, validator_id: BytesN<32>, amount: i128) {
- ensure_initialized(&env);
- ensure_admin(&env, &admin);
- admin.require_auth();
- if amount <= 0 {
- panic_with_error!(&env, Error::AmountMustBePositive);
- }
- // Verify whitelist
- let vals = read_validators(&env);
- let mut ok = false;
- for v in vals.iter() {
- if v == validator_id {
- ok = true;
- }
- }
- if !ok {
- panic_with_error!(&env, Error::ValidatorNotWhitelisted);
- }
- // Event; wiring to actual staking mechanism would be added in a follow-up.
- event_delegate(&env, &validator_id, amount);
- }
-
- // -------- Views --------
-
- /// Returns (total_staked, total_shares, multiplier_bps).
- pub fn stats(env: Env) -> (i128, i128, u32) {
- (
- read_total_staked(&env),
- read_total_shares(&env),
- read_multiplier_bps(&env),
- )
- }
-
- /// Returns the validator whitelist.
- pub fn validators(env: Env) -> Vec> {
- read_validators(&env)
- }
-
- /// Sync `total_staked` to the actual token balance held by the contract (1:1 backing).
- ///
- /// Access: admin-only.
- pub fn sync(env: Env, admin: Address) {
- ensure_initialized(&env);
- ensure_admin(&env, &admin);
- admin.require_auth();
- let token = read_token_xlm(&env);
- let self_addr = env.current_contract_address();
- let bal = token_balance_of(&env, &token, &self_addr);
- write_total_staked(&env, bal);
- }
-
- /// Returns true if `total_staked` equals the token balance held by the contract.
- pub fn backing_ok(env: Env) -> bool {
- let token = read_token_xlm(&env);
- let self_addr = env.current_contract_address();
- let bal = token_balance_of(&env, &token, &self_addr);
- bal == read_total_staked(&env)
- }
-
- // -------- yXLM token interface (minimal ERC20-like) --------
-
- /// Name of the share token.
- pub fn name(env: Env) -> SorobanString {
- SorobanString::from_str(&env, "Yield XLM")
- }
- /// Symbol of the share token.
- pub fn symbol(env: Env) -> SorobanString {
- SorobanString::from_str(&env, "yXLM")
- }
- /// Decimals of the share token (matches XLM stroop precision).
- pub fn decimals(_env: Env) -> u32 {
- 7
- }
- /// Total supply equals total shares.
- pub fn total_supply(env: Env) -> i128 {
- read_total_supply(&env)
- }
- /// Balance of an address.
- pub fn balance(env: Env, owner: Address) -> i128 {
- env.storage().instance().get::<_, i128>(&key_balance(&owner)).unwrap_or(0)
- }
- /// Allowance from `owner` to `spender`.
- pub fn allowance(env: Env, owner: Address, spender: Address) -> i128 {
- env.storage().instance().get::<_, i128>(&key_allow(&owner, &spender)).unwrap_or(0)
- }
- /// Approve `amount` for `spender`.
- pub fn approve(env: Env, owner: Address, spender: Address, amount: i128) {
- owner.require_auth();
- env.storage().instance().set(&key_allow(&owner, &spender), &amount);
- }
- /// Transfer `amount` from caller to `to`.
- pub fn transfer(env: Env, from: Address, to: Address, amount: i128) {
- from.require_auth();
- Self::transfer_internal(&env, &from, &to, amount);
- }
- /// Transfer `amount` from `from` to `to` using allowance by `spender`.
- pub fn transfer_from(env: Env, spender: Address, from: Address, to: Address, amount: i128) {
- spender.require_auth();
- // Check allowance
- let mut allow = Self::allowance(env.clone(), from.clone(), spender.clone());
- if allow < amount {
- panic_with_error!(&env, Error::Unauthorized);
- }
- allow -= amount;
- env.storage().instance().set(&key_allow(&from, &spender), &allow);
- Self::transfer_internal(&env, &from, &to, amount);
- }
-
- fn transfer_internal(env: &Env, from: &Address, to: &Address, amount: i128) {
- if amount <= 0 {
- panic_with_error!(env, Error::AmountMustBePositive);
- }
- let mut fb = env.storage().instance().get::<_, i128>(&key_balance(from)).unwrap_or(0);
- if fb < amount {
- panic_with_error!(env, Error::Unauthorized);
- }
- let mut tb = env.storage().instance().get::<_, i128>(&key_balance(to)).unwrap_or(0);
- fb -= amount;
- tb += amount;
- env.storage().instance().set(&key_balance(from), &fb);
- env.storage().instance().set(&key_balance(to), &tb);
- }
+ /// Initialize the contract with an `admin` address and native XLM token contract address.
+ ///
+ /// Requirements:
+ /// - Must be called exactly once.
+ /// - Sets initial multiplier to 1.0x (10_000 bps).
+ pub fn init(env: Env, admin: Address, xlm_token: Address) {
+ if read_initialized(&env) {
+ panic_with_error!(&env, Error::AlreadyInitialized);
+ }
+ admin.require_auth();
+ write_admin(&env, &admin);
+ write_token_xlm(&env, &xlm_token);
+ write_multiplier_bps(&env, 10_000);
+ write_total_supply(&env, 0);
+ write_initialized(&env, true);
+ }
+
+ /// Add or update a validator in the whitelist with `weight_bps`.
+ ///
+ /// Access: admin-only.
+ pub fn upsert_validator(env: Env, admin: Address, id: BytesN<32>, weight_bps: u32) {
+ ensure_initialized(&env);
+ ensure_admin(&env, &admin);
+ admin.require_auth();
+
+ let mut vals = read_validators(&env);
+ let mut exists = false;
+ for vid in vals.iter() {
+ if vid == id {
+ exists = true;
+ }
+ }
+ if !exists {
+ vals.push_back(id.clone());
+ write_validators(&env, &vals);
+ }
+ env.storage()
+ .instance()
+ .set(&key_val_weight(&id), &weight_bps);
+ }
+
+ /// Remove a validator from the whitelist.
+ ///
+ /// Access: admin-only.
+ pub fn remove_validator(env: Env, admin: Address, id: BytesN<32>) {
+ ensure_initialized(&env);
+ ensure_admin(&env, &admin);
+ admin.require_auth();
+
+ let vals = read_validators(&env);
+ let mut next = Vec::new(&env);
+ for v in vals.iter() {
+ if v != id {
+ next.push_back(v);
+ }
+ }
+ write_validators(&env, &next);
+ env.storage().instance().remove(&key_val_weight(&id));
+ }
+
+ /// Deposit native XLM and receive yXLM shares.
+ ///
+ /// Notes:
+ /// - This function assumes the caller has already transferred native XLM
+ /// to this contract address via the Stellar Asset Contract prior to the call,
+ /// or this function will be extended in a follow-up to perform the
+ /// transfer-in through cross-contract invocation (SDK-guarded).
+ /// - Mints shares based on current exchange rate.
+ pub fn deposit(env: Env, from: Address, amount: i128) -> i128 {
+ ensure_initialized(&env);
+ if amount <= 0 {
+ panic_with_error!(&env, Error::AmountMustBePositive);
+ }
+ from.require_auth();
+
+ // Pull native XLM into the contract via token transfer
+ let token = read_token_xlm(&env);
+ let self_addr = env.current_contract_address();
+ let pool_before = token_balance_of(&env, &token, &self_addr);
+ token_transfer_from(&env, &token, &from, &self_addr, amount);
+
+ // Compute shares to mint based on current exchange rate (total_staked/total_shares)
+ // Use pool_before for stable pricing during the operation
+ let total_shares = read_total_shares(&env);
+ let shares = if total_shares == 0 || pool_before == 0 {
+ amount
+ } else {
+ amount * total_shares / pool_before
+ };
+ if shares <= 0 {
+ panic_with_error!(&env, Error::ZeroShares);
+ }
+
+ // Update totals; set total_staked to actual token balance post-transfer for 1:1 backing
+ let pool_after = token_balance_of(&env, &token, &self_addr);
+ write_total_staked(&env, pool_after);
+ let new_total_shares = read_total_shares(&env) + shares;
+ write_total_shares(&env, new_total_shares);
+ let new_total_supply = read_total_supply(&env) + shares;
+ write_total_supply(&env, new_total_supply);
+
+ // Mint yXLM shares to depositor
+ let mut bal = Self::balance(env.clone(), from.clone());
+ bal += shares;
+ env.storage().instance().set(&key_balance(&from), &bal);
+
+ // Emit event and return shares to mint (mint mechanics will be wired)
+ event_deposit(&env, &from, amount, shares);
+ shares
+ }
+
+ /// Redeem `share_amount` yXLM shares for underlying XLM.
+ ///
+ /// Notes:
+ /// - This function returns the amount of XLM to withdraw.
+ /// - Transfer-out and share burn will be wired next.
+ pub fn redeem(env: Env, to: Address, share_amount: i128) -> i128 {
+ ensure_initialized(&env);
+ if share_amount <= 0 {
+ panic_with_error!(&env, Error::AmountMustBePositive);
+ }
+ to.require_auth();
+
+ // Price using current pool and total_shares
+ let token = read_token_xlm(&env);
+ let self_addr = env.current_contract_address();
+ let pool_before = token_balance_of(&env, &token, &self_addr);
+ let total_shares = read_total_shares(&env);
+ let amount = if total_shares == 0 || pool_before == 0 {
+ 0
+ } else {
+ share_amount * pool_before / total_shares
+ };
+ if amount <= 0 {
+ panic_with_error!(&env, Error::ZeroShares);
+ }
+
+ // Burn shares from user
+ let mut bal = Self::balance(env.clone(), to.clone());
+ // naive check; underflow will panic anyway
+ if bal < share_amount {
+ panic_with_error!(&env, Error::Unauthorized);
+ }
+ bal -= share_amount;
+ env.storage().instance().set(&key_balance(&to), &bal);
+ let new_total_supply = read_total_supply(&env) - share_amount;
+ write_total_supply(&env, new_total_supply);
+
+ // Transfer out native XLM to user
+ token_transfer(&env, &token, &to, amount);
+
+ // Update totals; set total_staked to actual token balance post-transfer for 1:1 backing
+ let pool_after = token_balance_of(&env, &token, &self_addr);
+ write_total_staked(&env, pool_after);
+ let new_total_shares = read_total_shares(&env) - share_amount;
+ write_total_shares(&env, new_total_shares);
+
+ event_withdraw(&env, &to, amount, share_amount);
+ amount
+ }
+
+ /// Adjust the global share multiplier basis points (for accounting/events).
+ ///
+ /// Access: admin-only.
+ /// Example: 10_000 -> 10_200 represents a +2% global reward signal (does not move funds).
+ pub fn rebase(env: Env, admin: Address, new_multiplier_bps: u32) {
+ ensure_initialized(&env);
+ ensure_admin(&env, &admin);
+ admin.require_auth();
+
+ let old = read_multiplier_bps(&env);
+ write_multiplier_bps(&env, new_multiplier_bps);
+ event_rebase(&env, old, new_multiplier_bps);
+ }
+
+ /// Delegate stake to a whitelisted validator. Emits an event for off-chain indexing.
+ ///
+ /// Access: admin-only for now; can be extended to keeper roles.
+ pub fn delegate(env: Env, admin: Address, validator_id: BytesN<32>, amount: i128) {
+ ensure_initialized(&env);
+ ensure_admin(&env, &admin);
+ admin.require_auth();
+ if amount <= 0 {
+ panic_with_error!(&env, Error::AmountMustBePositive);
+ }
+ // Verify whitelist
+ let vals = read_validators(&env);
+ let mut ok = false;
+ for v in vals.iter() {
+ if v == validator_id {
+ ok = true;
+ }
+ }
+ if !ok {
+ panic_with_error!(&env, Error::ValidatorNotWhitelisted);
+ }
+ // Event; wiring to actual staking mechanism would be added in a follow-up.
+ event_delegate(&env, &validator_id, amount);
+ }
+
+ // -------- Views --------
+
+ /// Returns (total_staked, total_shares, multiplier_bps).
+ pub fn stats(env: Env) -> (i128, i128, u32) {
+ (
+ read_total_staked(&env),
+ read_total_shares(&env),
+ read_multiplier_bps(&env),
+ )
+ }
+
+ /// Returns the validator whitelist.
+ pub fn validators(env: Env) -> Vec> {
+ read_validators(&env)
+ }
+
+ /// Sync `total_staked` to the actual token balance held by the contract (1:1 backing).
+ ///
+ /// Access: admin-only.
+ pub fn sync(env: Env, admin: Address) {
+ ensure_initialized(&env);
+ ensure_admin(&env, &admin);
+ admin.require_auth();
+ let token = read_token_xlm(&env);
+ let self_addr = env.current_contract_address();
+ let bal = token_balance_of(&env, &token, &self_addr);
+ write_total_staked(&env, bal);
+ }
+
+ /// Returns true if `total_staked` equals the token balance held by the contract.
+ pub fn backing_ok(env: Env) -> bool {
+ let token = read_token_xlm(&env);
+ let self_addr = env.current_contract_address();
+ let bal = token_balance_of(&env, &token, &self_addr);
+ bal == read_total_staked(&env)
+ }
+
+ // -------- yXLM token interface (minimal ERC20-like) --------
+
+ /// Name of the share token.
+ pub fn name(env: Env) -> SorobanString {
+ SorobanString::from_str(&env, "Yield XLM")
+ }
+ /// Symbol of the share token.
+ pub fn symbol(env: Env) -> SorobanString {
+ SorobanString::from_str(&env, "yXLM")
+ }
+ /// Decimals of the share token (matches XLM stroop precision).
+ pub fn decimals(_env: Env) -> u32 {
+ 7
+ }
+ /// Total supply equals total shares.
+ pub fn total_supply(env: Env) -> i128 {
+ read_total_supply(&env)
+ }
+ /// Balance of an address.
+ pub fn balance(env: Env, owner: Address) -> i128 {
+ env.storage()
+ .instance()
+ .get::<_, i128>(&key_balance(&owner))
+ .unwrap_or(0)
+ }
+ /// Allowance from `owner` to `spender`.
+ pub fn allowance(env: Env, owner: Address, spender: Address) -> i128 {
+ env.storage()
+ .instance()
+ .get::<_, i128>(&key_allow(&owner, &spender))
+ .unwrap_or(0)
+ }
+ /// Approve `amount` for `spender`.
+ pub fn approve(env: Env, owner: Address, spender: Address, amount: i128) {
+ owner.require_auth();
+ env.storage()
+ .instance()
+ .set(&key_allow(&owner, &spender), &amount);
+ }
+ /// Transfer `amount` from caller to `to`.
+ pub fn transfer(env: Env, from: Address, to: Address, amount: i128) {
+ from.require_auth();
+ Self::transfer_internal(&env, &from, &to, amount);
+ }
+ /// Transfer `amount` from `from` to `to` using allowance by `spender`.
+ pub fn transfer_from(env: Env, spender: Address, from: Address, to: Address, amount: i128) {
+ spender.require_auth();
+ // Check allowance
+ let mut allow = Self::allowance(env.clone(), from.clone(), spender.clone());
+ if allow < amount {
+ panic_with_error!(&env, Error::Unauthorized);
+ }
+ allow -= amount;
+ env.storage()
+ .instance()
+ .set(&key_allow(&from, &spender), &allow);
+ Self::transfer_internal(&env, &from, &to, amount);
+ }
+
+ fn transfer_internal(env: &Env, from: &Address, to: &Address, amount: i128) {
+ if amount <= 0 {
+ panic_with_error!(env, Error::AmountMustBePositive);
+ }
+ let mut fb = env
+ .storage()
+ .instance()
+ .get::<_, i128>(&key_balance(from))
+ .unwrap_or(0);
+ if fb < amount {
+ panic_with_error!(env, Error::Unauthorized);
+ }
+ let mut tb = env
+ .storage()
+ .instance()
+ .get::<_, i128>(&key_balance(to))
+ .unwrap_or(0);
+ fb -= amount;
+ tb += amount;
+ env.storage().instance().set(&key_balance(from), &fb);
+ env.storage().instance().set(&key_balance(to), &tb);
+ }
}
// -----------------------------
@@ -516,135 +561,152 @@ impl LiquidStaking {
// -----------------------------
#[cfg(test)]
mod test {
- use super::*;
- use soroban_sdk::testutils::{Address as _, BytesN as _};
- use soroban_sdk::{contract, contractimpl, Symbol};
-
- // Minimal mock token to simulate native XLM token contract
- #[contract]
- struct MockToken;
- const K_BAL: Symbol = symbol_short!("MBAL");
- fn k_user(addr: &Address) -> (Symbol, Address) { (K_BAL, addr.clone()) }
- #[contractimpl]
- impl MockToken {
- pub fn mint(env: Env, to: Address, amount: i128) {
- let mut b = env.storage().instance().get::<_, i128>(&k_user(&to)).unwrap_or(0);
- b += amount;
- env.storage().instance().set(&k_user(&to), &b);
- }
- pub fn balance(env: Env, owner: Address) -> i128 {
- env.storage().instance().get::<_, i128>(&k_user(&owner)).unwrap_or(0)
- }
- pub fn transfer(env: Env, from: Address, to: Address, amount: i128) {
- let mut fb = env.storage().instance().get::<_, i128>(&k_user(&from)).unwrap_or(0);
- let mut tb = env.storage().instance().get::<_, i128>(&k_user(&to)).unwrap_or(0);
- assert!(amount > 0 && fb >= amount);
- fb -= amount;
- tb += amount;
- env.storage().instance().set(&k_user(&from), &fb);
- env.storage().instance().set(&k_user(&to), &tb);
- }
- }
-
- #[test]
- fn init_and_deposit() {
- let env = Env::default();
- env.mock_all_auths();
-
- let admin = Address::generate(&env);
- let user = Address::generate(&env);
-
- // Deploy mock XLM token
- let token_id = env.register_contract(None, MockToken);
- let token = MockTokenClient::new(&env, &token_id);
- token.mint(&user, &1_000_0000);
-
- let lsd_id = env.register_contract(None, LiquidStaking);
- let client = LiquidStakingClient::new(&env, &lsd_id);
-
- client.init(&admin, &token.address);
- let (ts, sh, mbps) = client.stats();
- assert_eq!(ts, 0);
- assert_eq!(sh, 0);
- assert_eq!(mbps, 10_000);
-
- let minted = client.deposit(&user, &1_000_0000); // 1 XLM = 10^7 stroops (example scale)
- assert_eq!(minted, 1_000_0000);
- let (ts2, sh2, _) = client.stats();
- assert_eq!(ts2, 1_000_0000);
- assert_eq!(sh2, 1_000_0000);
-
- // Token balance moved from user to contract
- let lsd_addr = client.address.clone();
- assert_eq!(token.balance(&user), 0);
- assert_eq!(token.balance(&lsd_addr), 1_000_0000);
- }
-
- #[test]
- fn rebase_and_redeem() {
- let env = Env::default();
- env.mock_all_auths();
-
- let admin = Address::generate(&env);
- let user = Address::generate(&env);
-
- let token_id = env.register_contract(None, MockToken);
- let token = MockTokenClient::new(&env, &token_id);
- token.mint(&user, &2_000_0000);
-
- let lsd_id = env.register_contract(None, LiquidStaking);
- let client = LiquidStakingClient::new(&env, &lsd_id);
-
- client.init(&admin, &token.address);
- client.deposit(&user, &2_000_0000);
- let (_ts, sh, mbps) = client.stats();
- assert_eq!(sh, 2_000_0000);
- assert_eq!(mbps, 10_000);
-
- // Simulate rewards arriving to the contract (e.g., from validators)
- let lsd_addr = client.address.clone();
- token.mint(&lsd_addr, &200_0000); // +0.2 XLM
- // Update multiplier for accounting/event (does not change totals directly)
- client.rebase(&admin, &11_000);
- // Sync totals to actual token balance
- client.sync(&admin);
- let (ts2, sh2, mbps2) = client.stats();
- assert_eq!(mbps2, 11_000);
- assert_eq!(sh2, 2_000_0000);
- assert_eq!(ts2, 2_200_0000); // now equals on-chain balance
-
- // Redeem half of shares -> should withdraw 1.1 XLM (11_000_000)
- let out = client.redeem(&user, &1_000_0000);
- assert_eq!(out, 1_100_0000);
- // Token balance received
- assert_eq!(token.balance(&user), 1_100_0000);
- assert_eq!(token.balance(&lsd_addr), 1_100_0000);
-
- // Remaining stats
- let (ts3, sh3, _) = client.stats();
- assert_eq!(sh3, 1_000_0000);
- assert_eq!(ts3, 1_100_0000);
- assert!(client.backing_ok());
- }
-
- #[test]
- fn whitelist_and_delegate_events() {
- let env = Env::default();
- env.mock_all_auths();
- let admin = Address::generate(&env);
-
- let token_id = env.register_contract(None, MockToken);
- let lsd_id = env.register_contract(None, LiquidStaking);
- let client = LiquidStakingClient::new(&env, &lsd_id);
- let token_client = MockTokenClient::new(&env, &token_id);
- client.init(&admin, &token_client.address);
-
- let vid = BytesN::<32>::random(&env);
- client.upsert_validator(&admin, &vid, &5_000);
- let vals = client.validators();
- assert_eq!(vals.len(), 1);
-
- // Delegation emits event if validator exists
- client.delegate(&admin, &vid, &123);
- }
+ use super::*;
+ use soroban_sdk::testutils::{Address as _, BytesN as _};
+ use soroban_sdk::{contract, contractimpl, Symbol};
+
+ // Minimal mock token to simulate native XLM token contract
+ #[contract]
+ struct MockToken;
+ const K_BAL: Symbol = symbol_short!("MBAL");
+ fn k_user(addr: &Address) -> (Symbol, Address) {
+ (K_BAL, addr.clone())
+ }
+ #[contractimpl]
+ impl MockToken {
+ pub fn mint(env: Env, to: Address, amount: i128) {
+ let mut b = env
+ .storage()
+ .instance()
+ .get::<_, i128>(&k_user(&to))
+ .unwrap_or(0);
+ b += amount;
+ env.storage().instance().set(&k_user(&to), &b);
+ }
+ pub fn balance(env: Env, owner: Address) -> i128 {
+ env.storage()
+ .instance()
+ .get::<_, i128>(&k_user(&owner))
+ .unwrap_or(0)
+ }
+ pub fn transfer(env: Env, from: Address, to: Address, amount: i128) {
+ let mut fb = env
+ .storage()
+ .instance()
+ .get::<_, i128>(&k_user(&from))
+ .unwrap_or(0);
+ let mut tb = env
+ .storage()
+ .instance()
+ .get::<_, i128>(&k_user(&to))
+ .unwrap_or(0);
+ assert!(amount > 0 && fb >= amount);
+ fb -= amount;
+ tb += amount;
+ env.storage().instance().set(&k_user(&from), &fb);
+ env.storage().instance().set(&k_user(&to), &tb);
+ }
+ }
+
+ #[test]
+ fn init_and_deposit() {
+ let env = Env::default();
+ env.mock_all_auths();
+
+ let admin = Address::generate(&env);
+ let user = Address::generate(&env);
+
+ // Deploy mock XLM token
+ let token_id = env.register_contract(None, MockToken);
+ let token = MockTokenClient::new(&env, &token_id);
+ token.mint(&user, &1_000_0000);
+
+ let lsd_id = env.register_contract(None, LiquidStaking);
+ let client = LiquidStakingClient::new(&env, &lsd_id);
+
+ client.init(&admin, &token.address);
+ let (ts, sh, mbps) = client.stats();
+ assert_eq!(ts, 0);
+ assert_eq!(sh, 0);
+ assert_eq!(mbps, 10_000);
+
+ let minted = client.deposit(&user, &1_000_0000); // 1 XLM = 10^7 stroops (example scale)
+ assert_eq!(minted, 1_000_0000);
+ let (ts2, sh2, _) = client.stats();
+ assert_eq!(ts2, 1_000_0000);
+ assert_eq!(sh2, 1_000_0000);
+
+ // Token balance moved from user to contract
+ let lsd_addr = client.address.clone();
+ assert_eq!(token.balance(&user), 0);
+ assert_eq!(token.balance(&lsd_addr), 1_000_0000);
+ }
+
+ #[test]
+ fn rebase_and_redeem() {
+ let env = Env::default();
+ env.mock_all_auths();
+
+ let admin = Address::generate(&env);
+ let user = Address::generate(&env);
+
+ let token_id = env.register_contract(None, MockToken);
+ let token = MockTokenClient::new(&env, &token_id);
+ token.mint(&user, &2_000_0000);
+
+ let lsd_id = env.register_contract(None, LiquidStaking);
+ let client = LiquidStakingClient::new(&env, &lsd_id);
+
+ client.init(&admin, &token.address);
+ client.deposit(&user, &2_000_0000);
+ let (_ts, sh, mbps) = client.stats();
+ assert_eq!(sh, 2_000_0000);
+ assert_eq!(mbps, 10_000);
+
+ // Simulate rewards arriving to the contract (e.g., from validators)
+ let lsd_addr = client.address.clone();
+ token.mint(&lsd_addr, &200_0000); // +0.2 XLM
+ // Update multiplier for accounting/event (does not change totals directly)
+ client.rebase(&admin, &11_000);
+ // Sync totals to actual token balance
+ client.sync(&admin);
+ let (ts2, sh2, mbps2) = client.stats();
+ assert_eq!(mbps2, 11_000);
+ assert_eq!(sh2, 2_000_0000);
+ assert_eq!(ts2, 2_200_0000); // now equals on-chain balance
+
+ // Redeem half of shares -> should withdraw 1.1 XLM (11_000_000)
+ let out = client.redeem(&user, &1_000_0000);
+ assert_eq!(out, 1_100_0000);
+ // Token balance received
+ assert_eq!(token.balance(&user), 1_100_0000);
+ assert_eq!(token.balance(&lsd_addr), 1_100_0000);
+
+ // Remaining stats
+ let (ts3, sh3, _) = client.stats();
+ assert_eq!(sh3, 1_000_0000);
+ assert_eq!(ts3, 1_100_0000);
+ assert!(client.backing_ok());
+ }
+
+ #[test]
+ fn whitelist_and_delegate_events() {
+ let env = Env::default();
+ env.mock_all_auths();
+ let admin = Address::generate(&env);
+
+ let token_id = env.register_contract(None, MockToken);
+ let lsd_id = env.register_contract(None, LiquidStaking);
+ let client = LiquidStakingClient::new(&env, &lsd_id);
+ let token_client = MockTokenClient::new(&env, &token_id);
+ client.init(&admin, &token_client.address);
+
+ let vid = BytesN::<32>::random(&env);
+ client.upsert_validator(&admin, &vid, &5_000);
+ let vals = client.validators();
+ assert_eq!(vals.len(), 1);
+
+ // Delegation emits event if validator exists
+ client.delegate(&admin, &vid, &123);
+ }
}
diff --git a/contracts/optimistic_governance/Cargo.toml b/contracts/optimistic_governance/Cargo.toml
new file mode 100644
index 0000000000..677d902ec0
--- /dev/null
+++ b/contracts/optimistic_governance/Cargo.toml
@@ -0,0 +1,13 @@
+[package]
+name = "optimistic_governance"
+version = "0.1.0"
+edition = "2021"
+
+[lib]
+crate-type = ["cdylib"]
+
+[dependencies]
+soroban-sdk = "22.0.0"
+
+[dev-dependencies]
+soroban-sdk = { version = "22.0.0", features = ["testutils"] }
diff --git a/contracts/optimistic_governance/src/lib.rs b/contracts/optimistic_governance/src/lib.rs
new file mode 100644
index 0000000000..c6b544c074
--- /dev/null
+++ b/contracts/optimistic_governance/src/lib.rs
@@ -0,0 +1,687 @@
+#![no_std]
+
+//! # Optimistic Governance
+//!
+//! Proposals submitted by approved proposers become executable after a fixed
+//! **3-day challenge window** unless a veYIELD holder disputes them. A dispute
+//! freezes execution until the configured DAO resolver records the outcome of a
+//! full DAO vote.
+
+use soroban_sdk::{
+ contract, contracterror, contractimpl, contractmeta, contracttype, symbol_short,
+ vec as soroban_vec, Address, Env, IntoVal, Map, Symbol, Val, Vec,
+};
+
+contractmeta!(key = "name", val = "Optimistic Governance");
+contractmeta!(key = "version", val = "0.1.0");
+contractmeta!(
+ key = "description",
+ val = "Optimistic execution with challenge window, veYIELD disputes, and DAO resolution."
+);
+
+/// Challenge period in seconds (3 days). Fixed on-chain so it cannot be shortened by config.
+pub const CHALLENGE_WINDOW_SECS: u64 = 3 * 24 * 60 * 60;
+
+#[contracttype]
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub enum DataKey {
+ Initialized,
+ RootAdmin,
+ /// VeTokenomics-style contract implementing `get_voting_power(user) -> i128`.
+ VeYield,
+ /// Address allowed to report the outcome of the full DAO vote after a dispute.
+ DaoResolver,
+ NextProposalId,
+ /// Set of addresses allowed to submit proposals.
+ Proposers,
+ Proposal(u32),
+ /// Invocation arguments for `Proposal(id)` (stored separately — `Vec` is not allowed inside `#[contracttype]` structs).
+ ProposalArgs(u32),
+}
+
+#[contracttype]
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub enum ProposalStatus {
+ /// In challenge window (undisputed) or past window, not yet executed.
+ Pending,
+ /// Disputed during the window; execution frozen until DAO resolution.
+ Disputed,
+ /// Successfully invoked.
+ Executed,
+ /// Rejected by DAO vote after dispute.
+ Cancelled,
+ /// DAO vote approved the payload after a dispute; may be executed without waiting again.
+ ApprovedAfterVote,
+}
+
+#[contracttype]
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub struct Proposal {
+ pub proposer: Address,
+ pub target: Address,
+ pub func: Symbol,
+ pub submitted_at: u64,
+ pub status: ProposalStatus,
+}
+
+#[contracterror]
+#[derive(Copy, Clone, Debug, Eq, PartialEq)]
+#[repr(u32)]
+pub enum GovError {
+ NotInitialized = 1,
+ AlreadyInitialized = 2,
+ Unauthorized = 3,
+ NotProposer = 4,
+ ProposalNotFound = 5,
+ InvalidStatus = 6,
+ ChallengeWindowNotOver = 7,
+ ChallengeWindowOver = 8,
+ NoVotingPower = 9,
+ ProposalDisputed = 10,
+ AlreadyExecuted = 11,
+ NotDaoResolver = 12,
+}
+
+#[contract]
+pub struct OptimisticGovernance;
+
+#[contractimpl]
+impl OptimisticGovernance {
+ /// One-time setup: root admin, veYIELD contract for dispute checks, and DAO vote resolver.
+ ///
+ /// `root_admin` may add or remove proposers and is itself a proposer.
+ /// `ve_yield` must expose `get_voting_power(user: Address) -> i128` (e.g. VeTokenomics).
+ /// `dao_resolver` is the only address that may call [`resolve_dispute`](Self::resolve_dispute).
+ pub fn initialize(
+ env: Env,
+ root_admin: Address,
+ ve_yield: Address,
+ dao_resolver: Address,
+ ) -> Result<(), GovError> {
+ if env.storage().instance().has(&DataKey::Initialized) {
+ return Err(GovError::AlreadyInitialized);
+ }
+ root_admin.require_auth();
+
+ let mut proposers: Map = Map::new(&env);
+ proposers.set(root_admin.clone(), true);
+
+ env.storage().instance().set(&DataKey::Initialized, &true);
+ env.storage()
+ .instance()
+ .set(&DataKey::RootAdmin, &root_admin);
+ env.storage().instance().set(&DataKey::VeYield, &ve_yield);
+ env.storage()
+ .instance()
+ .set(&DataKey::DaoResolver, &dao_resolver);
+ env.storage()
+ .instance()
+ .set(&DataKey::NextProposalId, &1u32);
+ env.storage()
+ .instance()
+ .set(&DataKey::Proposers, &proposers);
+
+ env.events().publish(
+ (symbol_short!("og_init"),),
+ (root_admin, ve_yield, dao_resolver),
+ );
+ Ok(())
+ }
+
+ /// Add a proposer. Root admin only.
+ pub fn add_proposer(env: Env, root_admin: Address, proposer: Address) -> Result<(), GovError> {
+ Self::require_init(&env)?;
+ Self::ensure_root_admin(&env, &root_admin)?;
+ root_admin.require_auth();
+
+ let mut m: Map = env.storage().instance().get(&DataKey::Proposers).unwrap();
+ m.set(proposer.clone(), true);
+ env.storage().instance().set(&DataKey::Proposers, &m);
+
+ env.events()
+ .publish((symbol_short!("og_addp"),), (proposer,));
+ Ok(())
+ }
+
+ /// Remove a proposer. Root admin only.
+ pub fn remove_proposer(
+ env: Env,
+ root_admin: Address,
+ proposer: Address,
+ ) -> Result<(), GovError> {
+ Self::require_init(&env)?;
+ Self::ensure_root_admin(&env, &root_admin)?;
+ root_admin.require_auth();
+
+ let mut m: Map = env.storage().instance().get(&DataKey::Proposers).unwrap();
+ m.set(proposer.clone(), false);
+ env.storage().instance().set(&DataKey::Proposers, &m);
+
+ env.events()
+ .publish((symbol_short!("og_remp"),), (proposer,));
+ Ok(())
+ }
+
+ /// Submit an execution intent. Only registered proposers may call.
+ ///
+ /// The payload is executed later via [`execute`](Self::execute) after the challenge window,
+ /// unless the proposal is disputed.
+ ///
+ /// `call_args` is the argument list passed to `invoke_contract` on `target` (same shape as other Soroban contracts).
+ pub fn submit_proposal(
+ env: Env,
+ proposer: Address,
+ target: Address,
+ func: Symbol,
+ call_args: Vec,
+ ) -> Result {
+ Self::require_init(&env)?;
+ proposer.require_auth();
+ Self::ensure_proposer(&env, &proposer)?;
+
+ let id: u32 = env
+ .storage()
+ .instance()
+ .get(&DataKey::NextProposalId)
+ .unwrap();
+ let submitted_at = env.ledger().timestamp();
+ let target_evt = target.clone();
+
+ let proposal = Proposal {
+ proposer: proposer.clone(),
+ target,
+ func,
+ submitted_at,
+ status: ProposalStatus::Pending,
+ };
+
+ env.storage()
+ .instance()
+ .set(&DataKey::Proposal(id), &proposal);
+ env.storage()
+ .instance()
+ .set(&DataKey::ProposalArgs(id), &call_args);
+ env.storage()
+ .instance()
+ .set(&DataKey::NextProposalId, &(id + 1));
+
+ env.events().publish(
+ (symbol_short!("og_sub"),),
+ (id, proposer, target_evt, submitted_at),
+ );
+ Ok(id)
+ }
+
+ /// Dispute a proposal during the challenge window. Requires positive veYIELD voting power
+ /// from `ve_yield` via `get_voting_power(disputer)`. Freezes execution until DAO resolution.
+ pub fn dispute(env: Env, disputer: Address, proposal_id: u32) -> Result<(), GovError> {
+ Self::require_init(&env)?;
+ disputer.require_auth();
+
+ let ve: Address = env.storage().instance().get(&DataKey::VeYield).unwrap();
+ let vp = Self::read_voting_power(&env, &ve, &disputer);
+ if vp <= 0 {
+ return Err(GovError::NoVotingPower);
+ }
+
+ let mut p: Proposal = Self::load_proposal(&env, proposal_id)?;
+ if p.status != ProposalStatus::Pending {
+ return Err(GovError::InvalidStatus);
+ }
+
+ let now = env.ledger().timestamp();
+ if now >= p.submitted_at.saturating_add(CHALLENGE_WINDOW_SECS) {
+ return Err(GovError::ChallengeWindowOver);
+ }
+
+ p.status = ProposalStatus::Disputed;
+ env.storage()
+ .instance()
+ .set(&DataKey::Proposal(proposal_id), &p);
+
+ env.events()
+ .publish((symbol_short!("og_dis"),), (proposal_id, disputer));
+ Ok(())
+ }
+
+ /// Record the outcome of the full DAO vote for a disputed proposal. Only `dao_resolver` may call.
+ ///
+ /// `approved == true` allows execution via [`execute`](Self::execute). `false` cancels the proposal.
+ pub fn resolve_dispute(
+ env: Env,
+ resolver: Address,
+ proposal_id: u32,
+ approved: bool,
+ ) -> Result<(), GovError> {
+ Self::require_init(&env)?;
+ resolver.require_auth();
+
+ let expected: Address = env.storage().instance().get(&DataKey::DaoResolver).unwrap();
+ if resolver != expected {
+ return Err(GovError::NotDaoResolver);
+ }
+
+ let mut p: Proposal = Self::load_proposal(&env, proposal_id)?;
+ if p.status != ProposalStatus::Disputed {
+ return Err(GovError::InvalidStatus);
+ }
+
+ p.status = if approved {
+ ProposalStatus::ApprovedAfterVote
+ } else {
+ ProposalStatus::Cancelled
+ };
+ env.storage()
+ .instance()
+ .set(&DataKey::Proposal(proposal_id), &p);
+
+ env.events()
+ .publish((symbol_short!("og_res"),), (proposal_id, approved));
+ Ok(())
+ }
+
+ /// Execute the proposal payload. Callable by anyone once undisputed proposals pass the timelock,
+ /// or after DAO approval following a dispute.
+ ///
+ /// Re-entrancy: status is set to [`ProposalStatus::Executed`] before the external call.
+ pub fn execute(env: Env, proposal_id: u32) -> Result<(), GovError> {
+ Self::require_init(&env)?;
+
+ let mut p: Proposal = Self::load_proposal(&env, proposal_id)?;
+
+ match p.status {
+ ProposalStatus::Executed => return Err(GovError::AlreadyExecuted),
+ ProposalStatus::Cancelled => return Err(GovError::InvalidStatus),
+ ProposalStatus::Disputed => return Err(GovError::ProposalDisputed),
+ ProposalStatus::Pending => {
+ let now = env.ledger().timestamp();
+ let unlock = p.submitted_at.saturating_add(CHALLENGE_WINDOW_SECS);
+ if now < unlock {
+ return Err(GovError::ChallengeWindowNotOver);
+ }
+ }
+ ProposalStatus::ApprovedAfterVote => {}
+ }
+
+ p.status = ProposalStatus::Executed;
+ env.storage()
+ .instance()
+ .set(&DataKey::Proposal(proposal_id), &p);
+
+ let target = p.target.clone();
+ let func = p.func.clone();
+ let call_args: Vec = Self::load_proposal_args(&env, proposal_id)?;
+ env.invoke_contract::<()>(&target, &func, call_args);
+
+ env.events()
+ .publish((symbol_short!("og_exec"),), (proposal_id,));
+ Ok(())
+ }
+
+ // --- Views ---
+
+ /// Returns the fixed challenge window length in seconds (3 days).
+ pub fn challenge_window_secs(_env: Env) -> u64 {
+ CHALLENGE_WINDOW_SECS
+ }
+
+ pub fn get_proposal(env: Env, proposal_id: u32) -> Result {
+ Self::require_init(&env)?;
+ Self::load_proposal(&env, proposal_id)
+ }
+
+ /// Returns the stored `invoke_contract` argument vector for this proposal.
+ pub fn get_proposal_args(env: Env, proposal_id: u32) -> Result, GovError> {
+ Self::require_init(&env)?;
+ Self::load_proposal_args(&env, proposal_id)
+ }
+
+ pub fn is_proposer(env: Env, addr: Address) -> bool {
+ if !env.storage().instance().has(&DataKey::Initialized) {
+ return false;
+ }
+ let m: Map = env.storage().instance().get(&DataKey::Proposers).unwrap();
+ m.get(addr).unwrap_or(false)
+ }
+
+ fn require_init(env: &Env) -> Result<(), GovError> {
+ if !env.storage().instance().has(&DataKey::Initialized) {
+ return Err(GovError::NotInitialized);
+ }
+ Ok(())
+ }
+
+ fn ensure_root_admin(env: &Env, who: &Address) -> Result<(), GovError> {
+ let a: Address = env.storage().instance().get(&DataKey::RootAdmin).unwrap();
+ if who != &a {
+ return Err(GovError::Unauthorized);
+ }
+ Ok(())
+ }
+
+ fn ensure_proposer(env: &Env, who: &Address) -> Result<(), GovError> {
+ let m: Map = env.storage().instance().get(&DataKey::Proposers).unwrap();
+ if !m.get(who.clone()).unwrap_or(false) {
+ return Err(GovError::NotProposer);
+ }
+ Ok(())
+ }
+
+ fn load_proposal(env: &Env, id: u32) -> Result {
+ env.storage()
+ .instance()
+ .get(&DataKey::Proposal(id))
+ .ok_or(GovError::ProposalNotFound)
+ }
+
+ fn load_proposal_args(env: &Env, id: u32) -> Result, GovError> {
+ env.storage()
+ .instance()
+ .get(&DataKey::ProposalArgs(id))
+ .ok_or(GovError::ProposalNotFound)
+ }
+
+ fn read_voting_power(env: &Env, ve: &Address, user: &Address) -> i128 {
+ let sym = Symbol::new(env, "get_voting_power");
+ // `env` is already `&Env`; do not pass `&env` (that would be `&&Env` and breaks `into_val`).
+ let args = soroban_vec![env, user.clone().into_val(env)];
+ env.invoke_contract::(ve, &sym, args)
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use super::*;
+ use soroban_sdk::testutils::{Address as _, Ledger};
+ use soroban_sdk::{contract, contractimpl};
+
+ #[contract]
+ pub struct MockVeYield;
+
+ #[contractimpl]
+ impl MockVeYield {
+ pub fn get_voting_power(env: Env, user: Address) -> i128 {
+ env.storage().instance().get(&user).unwrap_or(0i128)
+ }
+
+ pub fn set_vp(env: Env, user: Address, power: i128) {
+ env.storage().instance().set(&user, &power);
+ }
+ }
+
+ #[contract]
+ pub struct MockCallee;
+
+ #[contractimpl]
+ impl MockCallee {
+ pub fn bump(env: Env) {
+ let k = symbol_short!("hits");
+ let c: u32 = env.storage().instance().get(&k).unwrap_or(0);
+ env.storage().instance().set(&k, &(c + 1));
+ }
+
+ pub fn hit_count(env: Env) -> u32 {
+ let k = symbol_short!("hits");
+ env.storage().instance().get(&k).unwrap_or(0)
+ }
+ }
+
+ fn empty_call_args(env: &Env) -> Vec {
+ Vec::new(env)
+ }
+
+ fn setup_env() -> (
+ Env,
+ Address,
+ Address,
+ Address,
+ OptimisticGovernanceClient<'static>,
+ MockVeYieldClient<'static>,
+ ) {
+ let env = Env::default();
+ env.mock_all_auths();
+
+ let root = Address::generate(&env);
+ let dao = Address::generate(&env);
+ let ve_id = env.register(MockVeYield, ());
+ let ve_client = MockVeYieldClient::new(&env, &ve_id);
+
+ let gov_id = env.register(OptimisticGovernance, ());
+ let client = OptimisticGovernanceClient::new(&env, &gov_id);
+
+ client.initialize(&root, &ve_id, &dao);
+ (env, root, dao, ve_id, client, ve_client)
+ }
+
+ #[test]
+ fn initialize_sets_state() {
+ let (_, root, _, _, client, _) = setup_env();
+ assert_eq!(client.challenge_window_secs(), CHALLENGE_WINDOW_SECS);
+ assert!(client.is_proposer(&root));
+ assert!(client.try_get_proposal(&1).is_err());
+ }
+
+ #[test]
+ fn double_initialize_fails() {
+ let env = Env::default();
+ env.mock_all_auths();
+ let root = Address::generate(&env);
+ let ve = env.register(MockVeYield, ());
+ let dao = Address::generate(&env);
+ let gov_id = env.register(OptimisticGovernance, ());
+ let client = OptimisticGovernanceClient::new(&env, &gov_id);
+ client.initialize(&root, &ve, &dao);
+ assert!(client.try_initialize(&root, &ve, &dao).is_err());
+ }
+
+ #[test]
+ fn non_proposer_cannot_submit() {
+ let (env, _, _, _, client, _) = setup_env();
+ let bad = Address::generate(&env);
+ let target = Address::generate(&env);
+ assert!(client
+ .try_submit_proposal(
+ &bad,
+ &target,
+ &Symbol::new(&env, "bump"),
+ &empty_call_args(&env),
+ )
+ .is_err());
+ }
+
+ #[test]
+ fn submit_and_execute_after_window() {
+ let (env, root, _, _, client, _) = setup_env();
+ let callee_id = env.register(MockCallee, ());
+
+ let id = client.submit_proposal(
+ &root,
+ &callee_id,
+ &Symbol::new(&env, "bump"),
+ &empty_call_args(&env),
+ );
+
+ env.ledger().set_timestamp(0);
+ let prop = client.get_proposal(&id);
+ assert_eq!(prop.status, ProposalStatus::Pending);
+
+ assert!(client.try_execute(&id).is_err());
+
+ env.ledger()
+ .set_timestamp(CHALLENGE_WINDOW_SECS + prop.submitted_at);
+
+ client.execute(&id);
+ let c = MockCalleeClient::new(&env, &callee_id);
+ assert_eq!(c.hit_count(), 1u32);
+
+ let p2 = client.get_proposal(&id);
+ assert_eq!(p2.status, ProposalStatus::Executed);
+
+ assert!(client.try_execute(&id).is_err());
+ }
+
+ #[test]
+ fn dispute_freezes_until_resolution() {
+ let (env, root, dao, _, client, ve_client) = setup_env();
+ let callee_id = env.register(MockCallee, ());
+ let disputer = Address::generate(&env);
+
+ ve_client.set_vp(&disputer, &1i128);
+
+ let id = client.submit_proposal(
+ &root,
+ &callee_id,
+ &Symbol::new(&env, "bump"),
+ &empty_call_args(&env),
+ );
+
+ env.ledger().set_timestamp(10);
+ client.dispute(&disputer, &id);
+
+ assert_eq!(client.get_proposal(&id).status, ProposalStatus::Disputed);
+
+ env.ledger().set_timestamp(10 + CHALLENGE_WINDOW_SECS);
+ assert!(client.try_execute(&id).is_err());
+
+ assert!(client
+ .try_resolve_dispute(&Address::generate(&env), &id, &true)
+ .is_err());
+
+ client.resolve_dispute(&dao, &id, &false);
+ assert_eq!(client.get_proposal(&id).status, ProposalStatus::Cancelled);
+ assert!(client.try_execute(&id).is_err());
+ }
+
+ #[test]
+ fn dispute_after_window_fails() {
+ let (env, root, _, _, client, ve_client) = setup_env();
+ let callee_id = env.register(MockCallee, ());
+ let disputer = Address::generate(&env);
+
+ ve_client.set_vp(&disputer, &100i128);
+
+ let id = client.submit_proposal(
+ &root,
+ &callee_id,
+ &Symbol::new(&env, "bump"),
+ &empty_call_args(&env),
+ );
+
+ let prop = client.get_proposal(&id);
+ env.ledger()
+ .set_timestamp(prop.submitted_at + CHALLENGE_WINDOW_SECS);
+
+ assert!(client.try_dispute(&disputer, &id).is_err());
+ }
+
+ #[test]
+ fn dispute_without_power_fails() {
+ let (env, root, _, _, client, _) = setup_env();
+ let callee_id = env.register(MockCallee, ());
+ let disputer = Address::generate(&env);
+
+ let id = client.submit_proposal(
+ &root,
+ &callee_id,
+ &Symbol::new(&env, "bump"),
+ &empty_call_args(&env),
+ );
+
+ env.ledger().set_timestamp(5);
+ assert!(client.try_dispute(&disputer, &id).is_err());
+ }
+
+ #[test]
+ fn resolve_approve_then_execute() {
+ let (env, root, dao, _, client, ve_client) = setup_env();
+ let callee_id = env.register(MockCallee, ());
+ let disputer = Address::generate(&env);
+
+ ve_client.set_vp(&disputer, &1i128);
+
+ let id = client.submit_proposal(
+ &root,
+ &callee_id,
+ &Symbol::new(&env, "bump"),
+ &empty_call_args(&env),
+ );
+
+ env.ledger().set_timestamp(1);
+ client.dispute(&disputer, &id);
+ client.resolve_dispute(&dao, &id, &true);
+
+ client.execute(&id);
+ let c = MockCalleeClient::new(&env, &callee_id);
+ assert_eq!(c.hit_count(), 1u32);
+ }
+
+ #[test]
+ fn add_remove_proposer() {
+ let (env, root, _, _, client, _) = setup_env();
+ let p = Address::generate(&env);
+ client.add_proposer(&root, &p);
+ assert!(client.is_proposer(&p));
+ client.remove_proposer(&root, &p);
+ assert!(!client.is_proposer(&p));
+ }
+
+ #[test]
+ fn non_root_cannot_add_proposer() {
+ let (env, _, _, _, client, _) = setup_env();
+ let other = Address::generate(&env);
+ let p = Address::generate(&env);
+ assert!(client.try_add_proposer(&other, &p).is_err());
+ }
+
+ #[test]
+ fn cannot_dispute_twice() {
+ let (env, root, _, _, client, ve_client) = setup_env();
+ let callee_id = env.register(MockCallee, ());
+ let d1 = Address::generate(&env);
+ let d2 = Address::generate(&env);
+
+ ve_client.set_vp(&d1, &1i128);
+ ve_client.set_vp(&d2, &1i128);
+
+ let id = client.submit_proposal(
+ &root,
+ &callee_id,
+ &Symbol::new(&env, "bump"),
+ &empty_call_args(&env),
+ );
+
+ env.ledger().set_timestamp(2);
+ client.dispute(&d1, &id);
+ assert!(client.try_dispute(&d2, &id).is_err());
+ }
+
+ #[test]
+ fn resolve_wrong_status_fails() {
+ let (env, root, dao, _, client, _) = setup_env();
+ let callee_id = env.register(MockCallee, ());
+
+ let id = client.submit_proposal(
+ &root,
+ &callee_id,
+ &Symbol::new(&env, "bump"),
+ &empty_call_args(&env),
+ );
+
+ assert!(client.try_resolve_dispute(&dao, &id, &true).is_err());
+ }
+
+ #[test]
+ fn get_proposal_missing() {
+ let (_, _, _, _, client, _) = setup_env();
+ assert!(client.try_get_proposal(&99).is_err());
+ }
+
+ #[test]
+ fn not_initialized_views() {
+ let env = Env::default();
+ let gov_id = env.register(OptimisticGovernance, ());
+ let client = OptimisticGovernanceClient::new(&env, &gov_id);
+ assert!(!client.is_proposer(&Address::generate(&env)));
+ assert!(client.try_get_proposal(&1).is_err());
+ }
+}
diff --git a/contracts/optimistic_governance/test_snapshots/test/add_remove_proposer.1.json b/contracts/optimistic_governance/test_snapshots/test/add_remove_proposer.1.json
new file mode 100644
index 0000000000..7646c0597a
--- /dev/null
+++ b/contracts/optimistic_governance/test_snapshots/test/add_remove_proposer.1.json
@@ -0,0 +1,368 @@
+{
+ "generators": {
+ "address": 5,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "initialize",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "add_proposer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "remove_proposer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 0,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "DaoResolver"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextProposalId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 1
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposers"
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "RootAdmin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "VeYield"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/optimistic_governance/test_snapshots/test/cannot_dispute_twice.1.json b/contracts/optimistic_governance/test_snapshots/test/cannot_dispute_twice.1.json
new file mode 100644
index 0000000000..b00e4e541f
--- /dev/null
+++ b/contracts/optimistic_governance/test_snapshots/test/cannot_dispute_twice.1.json
@@ -0,0 +1,498 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "initialize",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "submit_proposal",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "symbol": "bump"
+ },
+ {
+ "vec": []
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "dispute",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 2,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1
+ }
+ }
+ },
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "DaoResolver"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextProposalId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposal"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "func"
+ },
+ "val": {
+ "symbol": "bump"
+ }
+ },
+ {
+ "key": {
+ "symbol": "proposer"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "status"
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "Disputed"
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "symbol": "submitted_at"
+ },
+ "val": {
+ "u64": 0
+ }
+ },
+ {
+ "key": {
+ "symbol": "target"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "ProposalArgs"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "vec": []
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposers"
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ "val": {
+ "bool": true
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "RootAdmin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "VeYield"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": null
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/optimistic_governance/test_snapshots/test/dispute_after_window_fails.1.json b/contracts/optimistic_governance/test_snapshots/test/dispute_after_window_fails.1.json
new file mode 100644
index 0000000000..f4294edeb9
--- /dev/null
+++ b/contracts/optimistic_governance/test_snapshots/test/dispute_after_window_fails.1.json
@@ -0,0 +1,432 @@
+{
+ "generators": {
+ "address": 6,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "initialize",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "submit_proposal",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "symbol": "bump"
+ },
+ {
+ "vec": []
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 259200,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "DaoResolver"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextProposalId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposal"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "func"
+ },
+ "val": {
+ "symbol": "bump"
+ }
+ },
+ {
+ "key": {
+ "symbol": "proposer"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "status"
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "Pending"
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "symbol": "submitted_at"
+ },
+ "val": {
+ "u64": 0
+ }
+ },
+ {
+ "key": {
+ "symbol": "target"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "ProposalArgs"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "vec": []
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposers"
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ "val": {
+ "bool": true
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "RootAdmin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "VeYield"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": null
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/optimistic_governance/test_snapshots/test/dispute_freezes_until_resolution.1.json b/contracts/optimistic_governance/test_snapshots/test/dispute_freezes_until_resolution.1.json
new file mode 100644
index 0000000000..a492e4c959
--- /dev/null
+++ b/contracts/optimistic_governance/test_snapshots/test/dispute_freezes_until_resolution.1.json
@@ -0,0 +1,548 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "initialize",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "submit_proposal",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "symbol": "bump"
+ },
+ {
+ "vec": []
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "dispute",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "resolve_dispute",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "u32": 1
+ },
+ {
+ "bool": false
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 259210,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "DaoResolver"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextProposalId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposal"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "func"
+ },
+ "val": {
+ "symbol": "bump"
+ }
+ },
+ {
+ "key": {
+ "symbol": "proposer"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "status"
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "Cancelled"
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "symbol": "submitted_at"
+ },
+ "val": {
+ "u64": 0
+ }
+ },
+ {
+ "key": {
+ "symbol": "target"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "ProposalArgs"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "vec": []
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposers"
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ "val": {
+ "bool": true
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "RootAdmin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "VeYield"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": null
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/optimistic_governance/test_snapshots/test/dispute_without_power_fails.1.json b/contracts/optimistic_governance/test_snapshots/test/dispute_without_power_fails.1.json
new file mode 100644
index 0000000000..c78c7576b7
--- /dev/null
+++ b/contracts/optimistic_governance/test_snapshots/test/dispute_without_power_fails.1.json
@@ -0,0 +1,418 @@
+{
+ "generators": {
+ "address": 6,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "initialize",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "submit_proposal",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "symbol": "bump"
+ },
+ {
+ "vec": []
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 5,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "DaoResolver"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextProposalId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposal"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "func"
+ },
+ "val": {
+ "symbol": "bump"
+ }
+ },
+ {
+ "key": {
+ "symbol": "proposer"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "status"
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "Pending"
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "symbol": "submitted_at"
+ },
+ "val": {
+ "u64": 0
+ }
+ },
+ {
+ "key": {
+ "symbol": "target"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "ProposalArgs"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "vec": []
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposers"
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ "val": {
+ "bool": true
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "RootAdmin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "VeYield"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": null
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/optimistic_governance/test_snapshots/test/double_initialize_fails.1.json b/contracts/optimistic_governance/test_snapshots/test/double_initialize_fails.1.json
new file mode 100644
index 0000000000..5c2edf5e4e
--- /dev/null
+++ b/contracts/optimistic_governance/test_snapshots/test/double_initialize_fails.1.json
@@ -0,0 +1,249 @@
+{
+ "generators": {
+ "address": 4,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "initialize",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 0,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "DaoResolver"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextProposalId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 1
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposers"
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ "val": {
+ "bool": true
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "RootAdmin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "VeYield"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/optimistic_governance/test_snapshots/test/get_proposal_missing.1.json b/contracts/optimistic_governance/test_snapshots/test/get_proposal_missing.1.json
new file mode 100644
index 0000000000..468c64cc96
--- /dev/null
+++ b/contracts/optimistic_governance/test_snapshots/test/get_proposal_missing.1.json
@@ -0,0 +1,249 @@
+{
+ "generators": {
+ "address": 4,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "initialize",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 0,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "DaoResolver"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextProposalId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 1
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposers"
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ "val": {
+ "bool": true
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "RootAdmin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "VeYield"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/optimistic_governance/test_snapshots/test/initialize_sets_state.1.json b/contracts/optimistic_governance/test_snapshots/test/initialize_sets_state.1.json
new file mode 100644
index 0000000000..8b8c88be87
--- /dev/null
+++ b/contracts/optimistic_governance/test_snapshots/test/initialize_sets_state.1.json
@@ -0,0 +1,251 @@
+{
+ "generators": {
+ "address": 4,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "initialize",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 0,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "DaoResolver"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextProposalId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 1
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposers"
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ "val": {
+ "bool": true
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "RootAdmin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "VeYield"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/optimistic_governance/test_snapshots/test/non_proposer_cannot_submit.1.json b/contracts/optimistic_governance/test_snapshots/test/non_proposer_cannot_submit.1.json
new file mode 100644
index 0000000000..3cfca0b1e9
--- /dev/null
+++ b/contracts/optimistic_governance/test_snapshots/test/non_proposer_cannot_submit.1.json
@@ -0,0 +1,249 @@
+{
+ "generators": {
+ "address": 6,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "initialize",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 0,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "DaoResolver"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextProposalId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 1
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposers"
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ "val": {
+ "bool": true
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "RootAdmin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "VeYield"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/optimistic_governance/test_snapshots/test/non_root_cannot_add_proposer.1.json b/contracts/optimistic_governance/test_snapshots/test/non_root_cannot_add_proposer.1.json
new file mode 100644
index 0000000000..3cfca0b1e9
--- /dev/null
+++ b/contracts/optimistic_governance/test_snapshots/test/non_root_cannot_add_proposer.1.json
@@ -0,0 +1,249 @@
+{
+ "generators": {
+ "address": 6,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "initialize",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 0,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "DaoResolver"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextProposalId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 1
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposers"
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ "val": {
+ "bool": true
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "RootAdmin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "VeYield"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/optimistic_governance/test_snapshots/test/not_initialized_views.1.json b/contracts/optimistic_governance/test_snapshots/test/not_initialized_views.1.json
new file mode 100644
index 0000000000..64688eee3c
--- /dev/null
+++ b/contracts/optimistic_governance/test_snapshots/test/not_initialized_views.1.json
@@ -0,0 +1,77 @@
+{
+ "generators": {
+ "address": 2,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 0,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": null
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/optimistic_governance/test_snapshots/test/resolve_approve_then_execute.1.json b/contracts/optimistic_governance/test_snapshots/test/resolve_approve_then_execute.1.json
new file mode 100644
index 0000000000..336bb1c072
--- /dev/null
+++ b/contracts/optimistic_governance/test_snapshots/test/resolve_approve_then_execute.1.json
@@ -0,0 +1,554 @@
+{
+ "generators": {
+ "address": 6,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "initialize",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "submit_proposal",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "symbol": "bump"
+ },
+ {
+ "vec": []
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "dispute",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "resolve_dispute",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "u32": 1
+ },
+ {
+ "bool": true
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 1,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "DaoResolver"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextProposalId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposal"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "func"
+ },
+ "val": {
+ "symbol": "bump"
+ }
+ },
+ {
+ "key": {
+ "symbol": "proposer"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "status"
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "Executed"
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "symbol": "submitted_at"
+ },
+ "val": {
+ "u64": 0
+ }
+ },
+ {
+ "key": {
+ "symbol": "target"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "ProposalArgs"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "vec": []
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposers"
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ "val": {
+ "bool": true
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "RootAdmin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "VeYield"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "symbol": "hits"
+ },
+ "val": {
+ "u32": 1
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/optimistic_governance/test_snapshots/test/resolve_wrong_status_fails.1.json b/contracts/optimistic_governance/test_snapshots/test/resolve_wrong_status_fails.1.json
new file mode 100644
index 0000000000..c03918430c
--- /dev/null
+++ b/contracts/optimistic_governance/test_snapshots/test/resolve_wrong_status_fails.1.json
@@ -0,0 +1,418 @@
+{
+ "generators": {
+ "address": 5,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "initialize",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "submit_proposal",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "symbol": "bump"
+ },
+ {
+ "vec": []
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 0,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "DaoResolver"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextProposalId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposal"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "func"
+ },
+ "val": {
+ "symbol": "bump"
+ }
+ },
+ {
+ "key": {
+ "symbol": "proposer"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "status"
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "Pending"
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "symbol": "submitted_at"
+ },
+ "val": {
+ "u64": 0
+ }
+ },
+ {
+ "key": {
+ "symbol": "target"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "ProposalArgs"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "vec": []
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposers"
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ "val": {
+ "bool": true
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "RootAdmin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "VeYield"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": null
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/optimistic_governance/test_snapshots/test/submit_and_execute_after_window.1.json b/contracts/optimistic_governance/test_snapshots/test/submit_and_execute_after_window.1.json
new file mode 100644
index 0000000000..20c6085cbf
--- /dev/null
+++ b/contracts/optimistic_governance/test_snapshots/test/submit_and_execute_after_window.1.json
@@ -0,0 +1,432 @@
+{
+ "generators": {
+ "address": 5,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "initialize",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "function_name": "submit_proposal",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "symbol": "bump"
+ },
+ {
+ "vec": []
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [],
+ [],
+ [],
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 259200,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "DaoResolver"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextProposalId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposal"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "func"
+ },
+ "val": {
+ "symbol": "bump"
+ }
+ },
+ {
+ "key": {
+ "symbol": "proposer"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "status"
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "Executed"
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "symbol": "submitted_at"
+ },
+ "val": {
+ "u64": 0
+ }
+ },
+ {
+ "key": {
+ "symbol": "target"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "ProposalArgs"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "vec": []
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Proposers"
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ "val": {
+ "bool": true
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "RootAdmin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "VeYield"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "symbol": "hits"
+ },
+ "val": {
+ "u32": 1
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/settlement/src/lib.rs b/contracts/settlement/src/lib.rs
index e0f6427880..d5c2fcdbd0 100644
--- a/contracts/settlement/src/lib.rs
+++ b/contracts/settlement/src/lib.rs
@@ -8,7 +8,7 @@
use soroban_sdk::{
contract, contracterror, contractimpl, contracttype, symbol_short, token, Address, Bytes, Env,
- Vec, String,
+ String, Vec,
};
// ── Storage Keys ────────────────────────────────────────────────────────
@@ -18,11 +18,11 @@ use soroban_sdk::{
pub enum StorageKey {
Initialized,
Admin,
- MatchingEngine, // Trusted matching engine address
- SettledTrades, // Map - Track settled trade IDs
- FeeRecipient, // Address for fee collection
- FeeBps, // u32 - Fee in basis points
- Paused, // bool - Circuit breaker
+ MatchingEngine, // Trusted matching engine address
+ SettledTrades, // Map - Track settled trade IDs
+ FeeRecipient, // Address for fee collection
+ FeeBps, // u32 - Fee in basis points
+ Paused, // bool - Circuit breaker
}
// ── Data Structures ─────────────────────────────────────────────────────
@@ -115,14 +115,20 @@ impl SettlementContract {
}
env.storage().instance().set(&StorageKey::Admin, &admin);
- env.storage().instance().set(&StorageKey::FeeRecipient, &fee_recipient);
+ env.storage()
+ .instance()
+ .set(&StorageKey::FeeRecipient, &fee_recipient);
env.storage().instance().set(&StorageKey::FeeBps, &fee_bps);
if let Some(engine) = matching_engine {
- env.storage().instance().set(&StorageKey::MatchingEngine, &engine);
+ env.storage()
+ .instance()
+ .set(&StorageKey::MatchingEngine, &engine);
}
- env.storage().instance().set(&StorageKey::Initialized, &true);
+ env.storage()
+ .instance()
+ .set(&StorageKey::Initialized, &true);
// Emit event
env.events().publish((symbol_short!("init"),), (admin,));
@@ -176,7 +182,13 @@ impl SettlementContract {
}
// Verify signatures
- Self::verify_signatures(&env, &data, &maker_signature, &taker_signature, &engine_signature)?;
+ Self::verify_signatures(
+ &env,
+ &data,
+ &maker_signature,
+ &taker_signature,
+ &engine_signature,
+ )?;
// Validate amounts
if data.amount0 <= 0 || data.amount1 <= 0 {
@@ -196,7 +208,13 @@ impl SettlementContract {
// Emit event
env.events().publish(
(symbol_short!("settle"),),
- (data.trade_id, data.maker, data.taker, data.amount0, data.amount1),
+ (
+ data.trade_id,
+ data.maker,
+ data.taker,
+ data.amount0,
+ data.amount1,
+ ),
);
Ok(())
@@ -243,7 +261,9 @@ impl SettlementContract {
// Process each settlement
for (i, data) in batch.settlements.iter().enumerate() {
- let sigs = signatures.get(i as u32).ok_or(SettlementError::InvalidSignature)?;
+ let sigs = signatures
+ .get(i as u32)
+ .ok_or(SettlementError::InvalidSignature)?;
// Check if trade already settled
if Self::is_trade_settled(env.clone(), data.trade_id.clone()) {
@@ -292,7 +312,9 @@ impl SettlementContract {
Self::require_initialized(&env)?;
Self::require_admin(&env, &admin)?;
- env.storage().instance().set(&StorageKey::MatchingEngine, &engine);
+ env.storage()
+ .instance()
+ .set(&StorageKey::MatchingEngine, &engine);
// Emit event
env.events().publish((symbol_short!("set_eng"),), (engine,));
@@ -317,11 +339,14 @@ impl SettlementContract {
Self::require_initialized(&env)?;
Self::require_admin(&env, &admin)?;
- env.storage().instance().set(&StorageKey::FeeRecipient, &fee_recipient);
+ env.storage()
+ .instance()
+ .set(&StorageKey::FeeRecipient, &fee_recipient);
env.storage().instance().set(&StorageKey::FeeBps, &fee_bps);
// Emit event
- env.events().publish((symbol_short!("set_fee"),), (fee_recipient, fee_bps));
+ env.events()
+ .publish((symbol_short!("set_fee"),), (fee_recipient, fee_bps));
Ok(())
}
@@ -409,8 +434,16 @@ impl SettlementContract {
///
/// Returns tuple of (fee_recipient, fee_bps)
pub fn get_fees(env: Env) -> (Address, u32) {
- let recipient: Address = env.storage().instance().get(&StorageKey::FeeRecipient).unwrap();
- let fee_bps: u32 = env.storage().instance().get(&StorageKey::FeeBps).unwrap_or(0);
+ let recipient: Address = env
+ .storage()
+ .instance()
+ .get(&StorageKey::FeeRecipient)
+ .unwrap();
+ let fee_bps: u32 = env
+ .storage()
+ .instance()
+ .get(&StorageKey::FeeBps)
+ .unwrap_or(0);
(recipient, fee_bps)
}
@@ -424,7 +457,10 @@ impl SettlementContract {
///
/// Returns `true` if paused
pub fn is_paused(env: Env) -> bool {
- env.storage().instance().get(&StorageKey::Paused).unwrap_or(false)
+ env.storage()
+ .instance()
+ .get(&StorageKey::Paused)
+ .unwrap_or(false)
}
// ═══════════════════════════════════════════════════════════════════
@@ -505,12 +541,20 @@ impl SettlementContract {
}
fn collect_fees(env: &Env, data: &SettlementData) -> Result<(), SettlementError> {
- let fee_bps: u32 = env.storage().instance().get(&StorageKey::FeeBps).unwrap_or(0);
+ let fee_bps: u32 = env
+ .storage()
+ .instance()
+ .get(&StorageKey::FeeBps)
+ .unwrap_or(0);
if fee_bps == 0 {
return Ok(());
}
- let fee_recipient: Address = env.storage().instance().get(&StorageKey::FeeRecipient).unwrap();
+ let fee_recipient: Address = env
+ .storage()
+ .instance()
+ .get(&StorageKey::FeeRecipient)
+ .unwrap();
// Calculate fees (simplified - in production would be more sophisticated)
let fee0 = (data.amount0 * fee_bps as i128) / 10_000;
@@ -537,7 +581,9 @@ impl SettlementContract {
.unwrap_or(soroban_sdk::Map::new(env));
settled.set(trade_id.clone(), true);
- env.storage().instance().set(&StorageKey::SettledTrades, &settled);
+ env.storage()
+ .instance()
+ .set(&StorageKey::SettledTrades, &settled);
}
}
diff --git a/contracts/streaming_payments/Cargo.toml b/contracts/streaming_payments/Cargo.toml
new file mode 100644
index 0000000000..7c1d53b5e7
--- /dev/null
+++ b/contracts/streaming_payments/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "streaming_payments"
+version = "0.1.0"
+edition = "2021"
+
+[lib]
+crate-type = ["cdylib"]
+
+[dependencies]
+soroban-sdk = "22.0.0"
+soroban-token-sdk = "22.0.0"
+
+[dev-dependencies]
+soroban-sdk = { version = "22.0.0", features = ["testutils"] }
diff --git a/contracts/streaming_payments/src/lib.rs b/contracts/streaming_payments/src/lib.rs
new file mode 100644
index 0000000000..aeb88ffc88
--- /dev/null
+++ b/contracts/streaming_payments/src/lib.rs
@@ -0,0 +1,545 @@
+#![no_std]
+
+//! # Streaming payments
+//!
+//! Linear token streams: the sender escrows `amount_total` and the recipient
+//! unlocks it continuously from `start_time` until `end_time`, proportional to
+//! elapsed ledger time. Withdrawals use **checks–effects–interactions**: balances
+//! are updated before any token transfer to mitigate re-entrancy.
+
+use soroban_sdk::{
+ contract, contracterror, contractimpl, contractmeta, contracttype, symbol_short, token,
+ Address, Env,
+};
+
+contractmeta!(key = "name", val = "Streaming Payments");
+contractmeta!(key = "version", val = "0.1.0");
+contractmeta!(
+ key = "description",
+ val = "Linear time-locked token streams with cancel and withdraw."
+);
+
+#[contracttype]
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub enum DataKey {
+ NextStreamId,
+ Stream(u32),
+}
+
+/// One linear payment stream (all amounts in the token’s smallest units).
+#[contracttype]
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub struct Stream {
+ pub sender: Address,
+ pub recipient: Address,
+ pub token: Address,
+ /// Total escrowed for this stream (constant).
+ pub amount_total: i128,
+ /// Cumulative amount already paid out to the recipient.
+ pub withdrawn: i128,
+ pub start_time: u64,
+ pub end_time: u64,
+ pub cancelled: bool,
+}
+
+#[contracterror]
+#[derive(Copy, Clone, Debug, Eq, PartialEq)]
+#[repr(u32)]
+pub enum StreamError {
+ NotFound = 1,
+ Unauthorized = 2,
+ ZeroAmount = 3,
+ InvalidTimeRange = 4,
+ NothingToWithdraw = 5,
+ AlreadyCancelled = 6,
+ Overflow = 7,
+ StreamComplete = 8,
+}
+
+#[contract]
+pub struct StreamingPayments;
+
+#[contractimpl]
+impl StreamingPayments {
+ /// Create a linear stream: `sender` escrows `amount_total` of `token` for `recipient`.
+ ///
+ /// Unlocked balance at ledger time `t` is:
+ /// `0` if `t <= start_time`, `amount_total` if `t >= end_time`, otherwise
+ /// `amount_total * (t - start_time) / (end_time - start_time)` (integer division, rounds down).
+ ///
+ /// # Arguments
+ ///
+ /// * `sender` — Funds the stream; must authorize and hold `amount_total`.
+ /// * `recipient` — Address that may [`withdraw_from_stream`](Self::withdraw_from_stream).
+ /// * `token` — SAC / token contract address.
+ /// * `amount_total` — Amount to lock (smallest units).
+ /// * `start_time` / `end_time` — UNIX timestamps (seconds); require `start_time < end_time`.
+ ///
+ /// # Returns
+ ///
+ /// New stream id (monotonic).
+ pub fn create_stream(
+ env: Env,
+ sender: Address,
+ recipient: Address,
+ token_addr: Address,
+ amount_total: i128,
+ start_time: u64,
+ end_time: u64,
+ ) -> Result {
+ sender.require_auth();
+ if amount_total <= 0 {
+ return Err(StreamError::ZeroAmount);
+ }
+ if start_time >= end_time {
+ return Err(StreamError::InvalidTimeRange);
+ }
+
+ let this = env.current_contract_address();
+ let tok = token::Client::new(&env, &token_addr);
+ tok.transfer(&sender, &this, &amount_total);
+
+ let id: u32 = env
+ .storage()
+ .instance()
+ .get(&DataKey::NextStreamId)
+ .unwrap_or(1u32);
+
+ let stream = Stream {
+ sender: sender.clone(),
+ recipient: recipient.clone(),
+ token: token_addr.clone(),
+ amount_total,
+ withdrawn: 0,
+ start_time,
+ end_time,
+ cancelled: false,
+ };
+
+ env.storage().instance().set(&DataKey::Stream(id), &stream);
+ env.storage()
+ .instance()
+ .set(&DataKey::NextStreamId, &(id.saturating_add(1)));
+
+ env.events().publish(
+ (symbol_short!("strm_new"),),
+ (
+ id,
+ sender,
+ recipient,
+ token_addr,
+ amount_total,
+ start_time,
+ end_time,
+ ),
+ );
+
+ Ok(id)
+ }
+
+ /// Recipient pulls unlocked tokens not yet withdrawn.
+ ///
+ /// Updates `withdrawn` **before** transferring tokens to reduce re-entrancy risk from
+ /// malicious ERC-20-style hooks.
+ pub fn withdraw_from_stream(
+ env: Env,
+ recipient: Address,
+ stream_id: u32,
+ ) -> Result {
+ recipient.require_auth();
+
+ let mut s: Stream = Self::load_stream(&env, stream_id)?;
+ if s.cancelled {
+ return Err(StreamError::AlreadyCancelled);
+ }
+ if s.recipient != recipient {
+ return Err(StreamError::Unauthorized);
+ }
+
+ let now = env.ledger().timestamp();
+ let unlocked = Self::unlocked_amount(&s, now);
+ let claim = unlocked
+ .checked_sub(s.withdrawn)
+ .ok_or(StreamError::Overflow)?;
+ if claim <= 0 {
+ return Err(StreamError::NothingToWithdraw);
+ }
+
+ s.withdrawn = s
+ .withdrawn
+ .checked_add(claim)
+ .ok_or(StreamError::Overflow)?;
+ env.storage()
+ .instance()
+ .set(&DataKey::Stream(stream_id), &s);
+
+ let this = env.current_contract_address();
+ let tok = token::Client::new(&env, &s.token);
+ tok.transfer(&this, &recipient, &claim);
+
+ env.events()
+ .publish((symbol_short!("strm_wd"),), (stream_id, recipient, claim));
+
+ Ok(claim)
+ }
+
+ /// Sender cancels the stream: recipient receives remaining unlocked tokens; sender receives the unvested remainder.
+ ///
+ /// State (`cancelled`, `withdrawn`) is finalized **before** any outbound transfers.
+ ///
+ /// # Arguments
+ ///
+ /// * `sender` — Must equal the stream sender and authorize this call.
+ /// * `stream_id` — Id returned by [`create_stream`](Self::create_stream).
+ ///
+ /// # Errors
+ ///
+ /// * [`StreamError::StreamComplete`] — Full amount was already withdrawn by the recipient.
+ pub fn cancel_stream(env: Env, sender: Address, stream_id: u32) -> Result<(), StreamError> {
+ sender.require_auth();
+
+ let mut s: Stream = Self::load_stream(&env, stream_id)?;
+ if s.sender != sender {
+ return Err(StreamError::Unauthorized);
+ }
+ if s.cancelled {
+ return Err(StreamError::AlreadyCancelled);
+ }
+ if s.withdrawn >= s.amount_total {
+ return Err(StreamError::StreamComplete);
+ }
+
+ let now = env.ledger().timestamp();
+ let unlocked = Self::unlocked_amount(&s, now);
+ let pay_recipient = unlocked
+ .checked_sub(s.withdrawn)
+ .ok_or(StreamError::Overflow)?;
+ let pay_sender = s
+ .amount_total
+ .checked_sub(unlocked)
+ .ok_or(StreamError::Overflow)?;
+
+ s.withdrawn = unlocked;
+ s.cancelled = true;
+ env.storage()
+ .instance()
+ .set(&DataKey::Stream(stream_id), &s);
+
+ let this = env.current_contract_address();
+ let tok = token::Client::new(&env, &s.token);
+ if pay_recipient > 0 {
+ tok.transfer(&this, &s.recipient, &pay_recipient);
+ }
+ if pay_sender > 0 {
+ tok.transfer(&this, &s.sender, &pay_sender);
+ }
+
+ env.events().publish(
+ (symbol_short!("strm_can"),),
+ (stream_id, pay_recipient, pay_sender),
+ );
+
+ Ok(())
+ }
+
+ /// Returns total unlocked amount at the current ledger timestamp (ignores withdrawals).
+ pub fn unlocked_at(env: Env, stream_id: u32) -> Result {
+ let s = Self::load_stream(&env, stream_id)?;
+ let now = env.ledger().timestamp();
+ Ok(Self::unlocked_amount(&s, now))
+ }
+
+ /// Returns claimable amount for the recipient at the current ledger time (`unlocked - withdrawn`).
+ ///
+ /// After cancellation, returns `0` (final balances were settled in [`cancel_stream`](Self::cancel_stream)).
+ pub fn claimable(env: Env, stream_id: u32) -> Result {
+ let s = Self::load_stream(&env, stream_id)?;
+ if s.cancelled {
+ return Ok(0);
+ }
+ let now = env.ledger().timestamp();
+ let unlocked = Self::unlocked_amount(&s, now);
+ unlocked
+ .checked_sub(s.withdrawn)
+ .ok_or(StreamError::Overflow)
+ }
+
+ /// Returns full on-chain state for `stream_id`, or [`StreamError::NotFound`].
+ pub fn get_stream(env: Env, stream_id: u32) -> Result {
+ Self::load_stream(&env, stream_id)
+ }
+
+ fn load_stream(env: &Env, id: u32) -> Result {
+ env.storage()
+ .instance()
+ .get(&DataKey::Stream(id))
+ .ok_or(StreamError::NotFound)
+ }
+
+ /// Exact linear unlock: `amount_total * elapsed / duration` with `u64` time in seconds.
+ fn unlocked_amount(s: &Stream, now: u64) -> i128 {
+ if now <= s.start_time {
+ return 0;
+ }
+ if now >= s.end_time {
+ return s.amount_total;
+ }
+ let duration = s.end_time.saturating_sub(s.start_time);
+ if duration == 0 {
+ return s.amount_total;
+ }
+ let elapsed = (now.saturating_sub(s.start_time)) as i128;
+ let dur = duration as i128;
+ s.amount_total.saturating_mul(elapsed).saturating_div(dur)
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use soroban_sdk::testutils::{Address as _, Ledger};
+
+ fn setup_token(env: &Env) -> Address {
+ env.mock_all_auths();
+ let admin = Address::generate(env);
+ env.register_stellar_asset_contract_v2(admin.clone())
+ .address()
+ }
+
+ fn deploy(env: &Env) -> (StreamingPaymentsClient<'static>, Address) {
+ let id = env.register(StreamingPayments, ());
+ let client = StreamingPaymentsClient::new(env, &id);
+ (client, id)
+ }
+
+ fn mint_tokens(env: &Env, token: &Address, to: &Address, amt: i128) {
+ soroban_sdk::token::StellarAssetClient::new(env, token).mint(to, &amt);
+ }
+
+ #[test]
+ fn create_and_full_withdraw_after_end() {
+ let env = Env::default();
+ let token = setup_token(&env);
+ let (client, contract) = deploy(&env);
+ let sender = Address::generate(&env);
+ let recipient = Address::generate(&env);
+ mint_tokens(&env, &token, &sender, 1_000_000);
+
+ env.ledger().set_timestamp(1_000);
+ let id = client.create_stream(
+ &sender, &recipient, &token, &1_000_000, &2_000u64, &3_000u64,
+ );
+
+ env.ledger().set_timestamp(2_500);
+ assert_eq!(client.claimable(&id), 500_000);
+
+ env.ledger().set_timestamp(3_500);
+ assert_eq!(client.claimable(&id), 1_000_000);
+
+ let out = client.withdraw_from_stream(&recipient, &id);
+ assert_eq!(out, 1_000_000);
+ assert_eq!(client.claimable(&id), 0);
+ let tok = token::Client::new(&env, &token);
+ assert_eq!(tok.balance(&recipient), 1_000_000);
+ assert_eq!(tok.balance(&contract), 0);
+ }
+
+ #[test]
+ fn partial_mid_stream_withdraw() {
+ let env = Env::default();
+ let token = setup_token(&env);
+ let (client, _) = deploy(&env);
+ let sender = Address::generate(&env);
+ let recipient = Address::generate(&env);
+ mint_tokens(&env, &token, &sender, 1_200_000);
+
+ env.ledger().set_timestamp(0);
+ let id = client.create_stream(&sender, &recipient, &token, &1_200_000, &0u64, &12_000u64);
+
+ env.ledger().set_timestamp(3_000);
+ let w1 = client.withdraw_from_stream(&recipient, &id);
+ assert_eq!(w1, 300_000);
+
+ env.ledger().set_timestamp(6_000);
+ let w2 = client.withdraw_from_stream(&recipient, &id);
+ assert_eq!(w2, 300_000);
+
+ let tok = token::Client::new(&env, &token);
+ assert_eq!(tok.balance(&recipient), 600_000);
+ }
+
+ #[test]
+ fn cancel_refunds_unvested() {
+ let env = Env::default();
+ let token = setup_token(&env);
+ let (client, contract) = deploy(&env);
+ let sender = Address::generate(&env);
+ let recipient = Address::generate(&env);
+ mint_tokens(&env, &token, &sender, 1_000_000);
+
+ env.ledger().set_timestamp(100);
+ let id = client.create_stream(&sender, &recipient, &token, &1_000_000, &100u64, &1_100u64);
+
+ // 50% through [100, 1100] -> unlocked 500k at t=600
+ env.ledger().set_timestamp(600);
+ client.cancel_stream(&sender, &id);
+
+ let tok = token::Client::new(&env, &token);
+ assert_eq!(tok.balance(&recipient), 500_000);
+ assert_eq!(tok.balance(&sender), 500_000);
+ assert_eq!(tok.balance(&contract), 0);
+ assert!(client.try_withdraw_from_stream(&recipient, &id).is_err());
+ }
+
+ #[test]
+ fn non_recipient_cannot_withdraw() {
+ let env = Env::default();
+ let token = setup_token(&env);
+ let (client, _) = deploy(&env);
+ let sender = Address::generate(&env);
+ let recipient = Address::generate(&env);
+ let other = Address::generate(&env);
+ mint_tokens(&env, &token, &sender, 100);
+
+ env.ledger().set_timestamp(0);
+ let id = client.create_stream(&sender, &recipient, &token, &100, &0u64, &1000u64);
+
+ env.ledger().set_timestamp(500);
+ assert!(client.try_withdraw_from_stream(&other, &id).is_err());
+ }
+
+ #[test]
+ fn non_sender_cannot_cancel() {
+ let env = Env::default();
+ let token = setup_token(&env);
+ let (client, _) = deploy(&env);
+ let sender = Address::generate(&env);
+ let recipient = Address::generate(&env);
+ let other = Address::generate(&env);
+ mint_tokens(&env, &token, &sender, 100);
+
+ env.ledger().set_timestamp(0);
+ let id = client.create_stream(&sender, &recipient, &token, &100, &0u64, &1000u64);
+
+ assert!(client.try_cancel_stream(&other, &id).is_err());
+ }
+
+ #[test]
+ fn double_cancel_fails() {
+ let env = Env::default();
+ let token = setup_token(&env);
+ let (client, _) = deploy(&env);
+ let sender = Address::generate(&env);
+ let recipient = Address::generate(&env);
+ mint_tokens(&env, &token, &sender, 100);
+
+ env.ledger().set_timestamp(0);
+ let id = client.create_stream(&sender, &recipient, &token, &100, &0u64, &1000u64);
+
+ env.ledger().set_timestamp(100);
+ client.cancel_stream(&sender, &id);
+ assert!(client.try_cancel_stream(&sender, &id).is_err());
+ }
+
+ #[test]
+ fn cancel_after_full_withdraw_is_stream_complete() {
+ let env = Env::default();
+ let token = setup_token(&env);
+ let (client, _) = deploy(&env);
+ let sender = Address::generate(&env);
+ let recipient = Address::generate(&env);
+ mint_tokens(&env, &token, &sender, 100);
+
+ env.ledger().set_timestamp(0);
+ let id = client.create_stream(&sender, &recipient, &token, &100, &0u64, &100u64);
+
+ env.ledger().set_timestamp(100);
+ client.withdraw_from_stream(&recipient, &id);
+ assert!(client.try_cancel_stream(&sender, &id).is_err());
+ }
+
+ #[test]
+ fn invalid_range_rejected() {
+ let env = Env::default();
+ let token = setup_token(&env);
+ let (client, _) = deploy(&env);
+ let sender = Address::generate(&env);
+ let recipient = Address::generate(&env);
+ mint_tokens(&env, &token, &sender, 100);
+
+ env.ledger().set_timestamp(0);
+ assert!(client
+ .try_create_stream(&sender, &recipient, &token, &100, &500u64, &100u64)
+ .is_err());
+ }
+
+ #[test]
+ fn zero_amount_rejected() {
+ let env = Env::default();
+ let token = setup_token(&env);
+ let (client, _) = deploy(&env);
+ let sender = Address::generate(&env);
+ let recipient = Address::generate(&env);
+ mint_tokens(&env, &token, &sender, 100);
+
+ assert!(client
+ .try_create_stream(&sender, &recipient, &token, &0, &0u64, &100u64)
+ .is_err());
+ }
+
+ #[test]
+ fn nothing_to_withdraw_errors() {
+ let env = Env::default();
+ let token = setup_token(&env);
+ let (client, _) = deploy(&env);
+ let sender = Address::generate(&env);
+ let recipient = Address::generate(&env);
+ mint_tokens(&env, &token, &sender, 100);
+
+ env.ledger().set_timestamp(0);
+ let id = client.create_stream(&sender, &recipient, &token, &100, &100u64, &200u64);
+
+ env.ledger().set_timestamp(50);
+ assert!(client.try_withdraw_from_stream(&recipient, &id).is_err());
+ }
+
+ #[test]
+ fn get_stream_not_found() {
+ let env = Env::default();
+ let (client, _) = deploy(&env);
+ assert!(client.try_get_stream(&99).is_err());
+ }
+
+ #[test]
+ fn unlocked_before_start_zero() {
+ let env = Env::default();
+ let token = setup_token(&env);
+ let (client, _) = deploy(&env);
+ let sender = Address::generate(&env);
+ let recipient = Address::generate(&env);
+ mint_tokens(&env, &token, &sender, 1000);
+
+ env.ledger().set_timestamp(0);
+ let id = client.create_stream(&sender, &recipient, &token, &1000, &500u64, &1500u64);
+
+ env.ledger().set_timestamp(100);
+ assert_eq!(client.unlocked_at(&id), 0);
+ assert_eq!(client.claimable(&id), 0);
+ }
+
+ #[test]
+ fn one_second_duration_full_unlock() {
+ let env = Env::default();
+ let token = setup_token(&env);
+ let (client, _) = deploy(&env);
+ let sender = Address::generate(&env);
+ let recipient = Address::generate(&env);
+ mint_tokens(&env, &token, &sender, 42);
+
+ env.ledger().set_timestamp(10);
+ let id = client.create_stream(&sender, &recipient, &token, &42, &10u64, &11u64);
+
+ env.ledger().set_timestamp(11);
+ assert_eq!(client.unlocked_at(&id), 42);
+ }
+}
diff --git a/contracts/streaming_payments/test_snapshots/tests/cancel_after_full_withdraw_is_stream_complete.1.json b/contracts/streaming_payments/test_snapshots/tests/cancel_after_full_withdraw_is_stream_complete.1.json
new file mode 100644
index 0000000000..cfc1b1a3ea
--- /dev/null
+++ b/contracts/streaming_payments/test_snapshots/tests/cancel_after_full_withdraw_is_stream_complete.1.json
@@ -0,0 +1,793 @@
+{
+ "generators": {
+ "address": 5,
+ "nonce": 0
+ },
+ "auth": [
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "create_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ },
+ {
+ "u64": 0
+ },
+ {
+ "u64": 100
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "withdraw_from_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 100,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextStreamId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Stream"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount_total"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "cancelled"
+ },
+ "val": {
+ "bool": false
+ }
+ },
+ {
+ "key": {
+ "symbol": "end_time"
+ },
+ "val": {
+ "u64": 100
+ }
+ },
+ {
+ "key": {
+ "symbol": "recipient"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "sender"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "symbol": "start_time"
+ },
+ "val": {
+ "u64": 0
+ }
+ },
+ {
+ "key": {
+ "symbol": "token"
+ },
+ "val": {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ }
+ },
+ {
+ "key": {
+ "symbol": "withdrawn"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/streaming_payments/test_snapshots/tests/cancel_refunds_unvested.1.json b/contracts/streaming_payments/test_snapshots/tests/cancel_refunds_unvested.1.json
new file mode 100644
index 0000000000..fe15cd126d
--- /dev/null
+++ b/contracts/streaming_payments/test_snapshots/tests/cancel_refunds_unvested.1.json
@@ -0,0 +1,796 @@
+{
+ "generators": {
+ "address": 5,
+ "nonce": 0
+ },
+ "auth": [
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "create_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000000
+ }
+ },
+ {
+ "u64": 100
+ },
+ {
+ "u64": 1100
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "cancel_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [],
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 600,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextStreamId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Stream"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount_total"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000000
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "cancelled"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "end_time"
+ },
+ "val": {
+ "u64": 1100
+ }
+ },
+ {
+ "key": {
+ "symbol": "recipient"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "sender"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "symbol": "start_time"
+ },
+ "val": {
+ "u64": 100
+ }
+ },
+ {
+ "key": {
+ "symbol": "token"
+ },
+ "val": {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ }
+ },
+ {
+ "key": {
+ "symbol": "withdrawn"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500000
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500000
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": {
+ "hi": 0,
+ "lo": 500000
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/streaming_payments/test_snapshots/tests/create_and_full_withdraw_after_end.1.json b/contracts/streaming_payments/test_snapshots/tests/create_and_full_withdraw_after_end.1.json
new file mode 100644
index 0000000000..79be4b39d1
--- /dev/null
+++ b/contracts/streaming_payments/test_snapshots/tests/create_and_full_withdraw_after_end.1.json
@@ -0,0 +1,797 @@
+{
+ "generators": {
+ "address": 5,
+ "nonce": 0
+ },
+ "auth": [
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "create_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000000
+ }
+ },
+ {
+ "u64": 2000
+ },
+ {
+ "u64": 3000
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "withdraw_from_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 3500,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextStreamId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Stream"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount_total"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000000
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "cancelled"
+ },
+ "val": {
+ "bool": false
+ }
+ },
+ {
+ "key": {
+ "symbol": "end_time"
+ },
+ "val": {
+ "u64": 3000
+ }
+ },
+ {
+ "key": {
+ "symbol": "recipient"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "sender"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "symbol": "start_time"
+ },
+ "val": {
+ "u64": 2000
+ }
+ },
+ {
+ "key": {
+ "symbol": "token"
+ },
+ "val": {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ }
+ },
+ {
+ "key": {
+ "symbol": "withdrawn"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000000
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": {
+ "hi": 0,
+ "lo": 1000000
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/streaming_payments/test_snapshots/tests/double_cancel_fails.1.json b/contracts/streaming_payments/test_snapshots/tests/double_cancel_fails.1.json
new file mode 100644
index 0000000000..6f4ccc07ee
--- /dev/null
+++ b/contracts/streaming_payments/test_snapshots/tests/double_cancel_fails.1.json
@@ -0,0 +1,793 @@
+{
+ "generators": {
+ "address": 5,
+ "nonce": 0
+ },
+ "auth": [
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "create_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ },
+ {
+ "u64": 0
+ },
+ {
+ "u64": 1000
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "cancel_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 100,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextStreamId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Stream"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount_total"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "cancelled"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "end_time"
+ },
+ "val": {
+ "u64": 1000
+ }
+ },
+ {
+ "key": {
+ "symbol": "recipient"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "sender"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "symbol": "start_time"
+ },
+ "val": {
+ "u64": 0
+ }
+ },
+ {
+ "key": {
+ "symbol": "token"
+ },
+ "val": {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ }
+ },
+ {
+ "key": {
+ "symbol": "withdrawn"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 10
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 90
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": {
+ "hi": 0,
+ "lo": 10
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/streaming_payments/test_snapshots/tests/get_stream_not_found.1.json b/contracts/streaming_payments/test_snapshots/tests/get_stream_not_found.1.json
new file mode 100644
index 0000000000..a90f00a84e
--- /dev/null
+++ b/contracts/streaming_payments/test_snapshots/tests/get_stream_not_found.1.json
@@ -0,0 +1,76 @@
+{
+ "generators": {
+ "address": 1,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 0,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": null
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/streaming_payments/test_snapshots/tests/invalid_range_rejected.1.json b/contracts/streaming_payments/test_snapshots/tests/invalid_range_rejected.1.json
new file mode 100644
index 0000000000..c523384f88
--- /dev/null
+++ b/contracts/streaming_payments/test_snapshots/tests/invalid_range_rejected.1.json
@@ -0,0 +1,399 @@
+{
+ "generators": {
+ "address": 5,
+ "nonce": 0
+ },
+ "auth": [
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "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": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/streaming_payments/test_snapshots/tests/non_recipient_cannot_withdraw.1.json b/contracts/streaming_payments/test_snapshots/tests/non_recipient_cannot_withdraw.1.json
new file mode 100644
index 0000000000..2f51291ebf
--- /dev/null
+++ b/contracts/streaming_payments/test_snapshots/tests/non_recipient_cannot_withdraw.1.json
@@ -0,0 +1,665 @@
+{
+ "generators": {
+ "address": 6,
+ "nonce": 0
+ },
+ "auth": [
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "create_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ },
+ {
+ "u64": 0
+ },
+ {
+ "u64": 1000
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 500,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextStreamId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Stream"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount_total"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "cancelled"
+ },
+ "val": {
+ "bool": false
+ }
+ },
+ {
+ "key": {
+ "symbol": "end_time"
+ },
+ "val": {
+ "u64": 1000
+ }
+ },
+ {
+ "key": {
+ "symbol": "recipient"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "sender"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "symbol": "start_time"
+ },
+ "val": {
+ "u64": 0
+ }
+ },
+ {
+ "key": {
+ "symbol": "token"
+ },
+ "val": {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ }
+ },
+ {
+ "key": {
+ "symbol": "withdrawn"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/streaming_payments/test_snapshots/tests/non_sender_cannot_cancel.1.json b/contracts/streaming_payments/test_snapshots/tests/non_sender_cannot_cancel.1.json
new file mode 100644
index 0000000000..5bb8ab21a5
--- /dev/null
+++ b/contracts/streaming_payments/test_snapshots/tests/non_sender_cannot_cancel.1.json
@@ -0,0 +1,665 @@
+{
+ "generators": {
+ "address": 6,
+ "nonce": 0
+ },
+ "auth": [
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "create_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ },
+ {
+ "u64": 0
+ },
+ {
+ "u64": 1000
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "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": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextStreamId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Stream"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount_total"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "cancelled"
+ },
+ "val": {
+ "bool": false
+ }
+ },
+ {
+ "key": {
+ "symbol": "end_time"
+ },
+ "val": {
+ "u64": 1000
+ }
+ },
+ {
+ "key": {
+ "symbol": "recipient"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "sender"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "symbol": "start_time"
+ },
+ "val": {
+ "u64": 0
+ }
+ },
+ {
+ "key": {
+ "symbol": "token"
+ },
+ "val": {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ }
+ },
+ {
+ "key": {
+ "symbol": "withdrawn"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/streaming_payments/test_snapshots/tests/nothing_to_withdraw_errors.1.json b/contracts/streaming_payments/test_snapshots/tests/nothing_to_withdraw_errors.1.json
new file mode 100644
index 0000000000..acd7de9f48
--- /dev/null
+++ b/contracts/streaming_payments/test_snapshots/tests/nothing_to_withdraw_errors.1.json
@@ -0,0 +1,665 @@
+{
+ "generators": {
+ "address": 5,
+ "nonce": 0
+ },
+ "auth": [
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "create_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ },
+ {
+ "u64": 100
+ },
+ {
+ "u64": 200
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 50,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextStreamId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Stream"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount_total"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "cancelled"
+ },
+ "val": {
+ "bool": false
+ }
+ },
+ {
+ "key": {
+ "symbol": "end_time"
+ },
+ "val": {
+ "u64": 200
+ }
+ },
+ {
+ "key": {
+ "symbol": "recipient"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "sender"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "symbol": "start_time"
+ },
+ "val": {
+ "u64": 100
+ }
+ },
+ {
+ "key": {
+ "symbol": "token"
+ },
+ "val": {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ }
+ },
+ {
+ "key": {
+ "symbol": "withdrawn"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/streaming_payments/test_snapshots/tests/one_second_duration_full_unlock.1.json b/contracts/streaming_payments/test_snapshots/tests/one_second_duration_full_unlock.1.json
new file mode 100644
index 0000000000..fcd13c3e46
--- /dev/null
+++ b/contracts/streaming_payments/test_snapshots/tests/one_second_duration_full_unlock.1.json
@@ -0,0 +1,665 @@
+{
+ "generators": {
+ "address": 5,
+ "nonce": 0
+ },
+ "auth": [
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 42
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "create_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 42
+ }
+ },
+ {
+ "u64": 10
+ },
+ {
+ "u64": 11
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 42
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 11,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextStreamId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Stream"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount_total"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 42
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "cancelled"
+ },
+ "val": {
+ "bool": false
+ }
+ },
+ {
+ "key": {
+ "symbol": "end_time"
+ },
+ "val": {
+ "u64": 11
+ }
+ },
+ {
+ "key": {
+ "symbol": "recipient"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "sender"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "symbol": "start_time"
+ },
+ "val": {
+ "u64": 10
+ }
+ },
+ {
+ "key": {
+ "symbol": "token"
+ },
+ "val": {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ }
+ },
+ {
+ "key": {
+ "symbol": "withdrawn"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": {
+ "hi": 0,
+ "lo": 42
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/streaming_payments/test_snapshots/tests/partial_mid_stream_withdraw.1.json b/contracts/streaming_payments/test_snapshots/tests/partial_mid_stream_withdraw.1.json
new file mode 100644
index 0000000000..df24e5f6d1
--- /dev/null
+++ b/contracts/streaming_payments/test_snapshots/tests/partial_mid_stream_withdraw.1.json
@@ -0,0 +1,848 @@
+{
+ "generators": {
+ "address": 5,
+ "nonce": 0
+ },
+ "auth": [
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1200000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "create_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1200000
+ }
+ },
+ {
+ "u64": 0
+ },
+ {
+ "u64": 12000
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1200000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "withdraw_from_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "withdraw_from_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 6000,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextStreamId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Stream"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount_total"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1200000
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "cancelled"
+ },
+ "val": {
+ "bool": false
+ }
+ },
+ {
+ "key": {
+ "symbol": "end_time"
+ },
+ "val": {
+ "u64": 12000
+ }
+ },
+ {
+ "key": {
+ "symbol": "recipient"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "sender"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "symbol": "start_time"
+ },
+ "val": {
+ "u64": 0
+ }
+ },
+ {
+ "key": {
+ "symbol": "token"
+ },
+ "val": {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ }
+ },
+ {
+ "key": {
+ "symbol": "withdrawn"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 600000
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": {
+ "hi": 0,
+ "lo": 600000
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": {
+ "hi": 0,
+ "lo": 600000
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/streaming_payments/test_snapshots/tests/unlocked_before_start_zero.1.json b/contracts/streaming_payments/test_snapshots/tests/unlocked_before_start_zero.1.json
new file mode 100644
index 0000000000..aaa5bd22d4
--- /dev/null
+++ b/contracts/streaming_payments/test_snapshots/tests/unlocked_before_start_zero.1.json
@@ -0,0 +1,666 @@
+{
+ "generators": {
+ "address": 5,
+ "nonce": 0
+ },
+ "auth": [
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "function_name": "create_stream",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ },
+ {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ },
+ {
+ "u64": 500
+ },
+ {
+ "u64": 1500
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 100,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "NextStreamId"
+ }
+ ]
+ },
+ "val": {
+ "u32": 2
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Stream"
+ },
+ {
+ "u32": 1
+ }
+ ]
+ },
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount_total"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "cancelled"
+ },
+ "val": {
+ "bool": false
+ }
+ },
+ {
+ "key": {
+ "symbol": "end_time"
+ },
+ "val": {
+ "u64": 1500
+ }
+ },
+ {
+ "key": {
+ "symbol": "recipient"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ },
+ {
+ "key": {
+ "symbol": "sender"
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "symbol": "start_time"
+ },
+ "val": {
+ "u64": 500
+ }
+ },
+ {
+ "key": {
+ "symbol": "token"
+ },
+ "val": {
+ "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL"
+ }
+ },
+ {
+ "key": {
+ "symbol": "withdrawn"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/streaming_payments/test_snapshots/tests/zero_amount_rejected.1.json b/contracts/streaming_payments/test_snapshots/tests/zero_amount_rejected.1.json
new file mode 100644
index 0000000000..c523384f88
--- /dev/null
+++ b/contracts/streaming_payments/test_snapshots/tests/zero_amount_rejected.1.json
@@ -0,0 +1,399 @@
+{
+ "generators": {
+ "address": 5,
+ "nonce": 0
+ },
+ "auth": [
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "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": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "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"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/Cargo.toml b/contracts/yield_tranches/Cargo.toml
new file mode 100644
index 0000000000..cf57c03481
--- /dev/null
+++ b/contracts/yield_tranches/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "yield_tranches"
+version = "0.1.0"
+edition = "2021"
+
+[lib]
+crate-type = ["cdylib"]
+
+[dependencies]
+soroban-sdk = "22.0.0"
+soroban-token-sdk = "22.0.0"
+
+[dev-dependencies]
+soroban-sdk = { version = "22.0.0", features = ["testutils"] }
diff --git a/contracts/yield_tranches/src/lib.rs b/contracts/yield_tranches/src/lib.rs
new file mode 100644
index 0000000000..844f22d0b5
--- /dev/null
+++ b/contracts/yield_tranches/src/lib.rs
@@ -0,0 +1,817 @@
+#![no_std]
+
+//! # Yield Tranches — Principal / Yield Tokenizer
+//!
+//! Splits a yield-bearing asset (IBT) into **Principal Token (PT)** and
+//! **Yield Token (YT)**. PT redeems 1:1 for the settlement asset at maturity;
+//! YT captures variable IBT yield until maturity.
+
+use soroban_sdk::{
+ contract, contracterror, contractimpl, contracttype, symbol_short, token, Address, Env,
+};
+
+// ── Storage ─────────────────────────────────────────────────────────────
+
+#[contracttype]
+#[derive(Clone)]
+enum DataKey {
+ Admin,
+ Ibt,
+ Underlying,
+ MaturityTs,
+ Initialized,
+ /// Sum of IBT units deposited (principal basis for surplus = balance − principal).
+ PrincipalIbt,
+ TotalPt,
+ TotalYt,
+ BalancePt(Address),
+ BalanceYt(Address),
+}
+
+// ── Errors ───────────────────────────────────────────────────────────────
+
+#[contracterror]
+#[derive(Copy, Clone, Debug, Eq, PartialEq)]
+#[repr(u32)]
+pub enum TokenizerError {
+ NotInitialized = 1,
+ AlreadyInitialized = 2,
+ ZeroAmount = 3,
+ InsufficientBalance = 4,
+ /// Claiming YT yield is forbidden at or after maturity.
+ YieldClaimAfterMaturity = 5,
+ /// PT redemption only when `ledger_timestamp >= maturity`.
+ RedeemBeforeMaturity = 6,
+ Unauthorized = 7,
+ Overflow = 8,
+ /// Contract holds insufficient underlying for this PT redemption.
+ InsufficientUnderlyingLiquidity = 9,
+ /// New deposits are not accepted at or after maturity.
+ DepositClosed = 10,
+}
+
+// ── Contract ─────────────────────────────────────────────────────────────
+
+#[contract]
+pub struct Tokenizer;
+
+#[contractimpl]
+impl Tokenizer {
+ /// Initialize the tokenizer with admin, asset addresses, and maturity.
+ ///
+ /// # Arguments
+ ///
+ /// * `admin` — Configuration and redemption-pool management.
+ /// * `ibt` — Interest-bearing token users deposit (e.g. vault share / yUSDC SAC).
+ /// * `underlying` — Asset PT holders receive 1:1 at maturity (same decimals as PT accounting).
+ /// * `maturity_ts` — UNIX timestamp (seconds); YT yield claims require `ledger_time < maturity`;
+ /// PT redemption requires `ledger_time >= maturity`.
+ ///
+ /// # Errors
+ ///
+ /// * [`TokenizerError::AlreadyInitialized`]
+ pub fn initialize(
+ env: Env,
+ admin: Address,
+ ibt: Address,
+ underlying: Address,
+ maturity_ts: u64,
+ ) -> Result<(), TokenizerError> {
+ if env.storage().instance().has(&DataKey::Initialized) {
+ return Err(TokenizerError::AlreadyInitialized);
+ }
+ if maturity_ts == 0 {
+ return Err(TokenizerError::ZeroAmount);
+ }
+
+ env.storage().instance().set(&DataKey::Admin, &admin);
+ env.storage().instance().set(&DataKey::Ibt, &ibt);
+ env.storage()
+ .instance()
+ .set(&DataKey::Underlying, &underlying);
+ env.storage()
+ .instance()
+ .set(&DataKey::MaturityTs, &maturity_ts);
+ env.storage().instance().set(&DataKey::PrincipalIbt, &0i128);
+ env.storage().instance().set(&DataKey::TotalPt, &0i128);
+ env.storage().instance().set(&DataKey::TotalYt, &0i128);
+ env.storage().instance().set(&DataKey::Initialized, &true);
+
+ env.events().publish(
+ (symbol_short!("init_tz"),),
+ (admin.clone(), ibt.clone(), underlying.clone(), maturity_ts),
+ );
+ Ok(())
+ }
+
+ /// Deposit IBT and mint equal PT and YT to `from`.
+ ///
+ /// Transfers `amount` IBT from `from` into this contract and increases the
+ /// tracked principal by `amount`.
+ ///
+ /// # Errors
+ ///
+ /// * [`TokenizerError::ZeroAmount`]
+ pub fn deposit(env: Env, from: Address, amount: i128) -> Result<(), TokenizerError> {
+ Self::require_init(&env)?;
+ from.require_auth();
+ if amount <= 0 {
+ return Err(TokenizerError::ZeroAmount);
+ }
+
+ let maturity: u64 = env.storage().instance().get(&DataKey::MaturityTs).unwrap();
+ let now = env.ledger().timestamp();
+ if now >= maturity {
+ return Err(TokenizerError::DepositClosed);
+ }
+
+ let ibt: Address = env.storage().instance().get(&DataKey::Ibt).unwrap();
+ let this = env.current_contract_address();
+ let ibt_client = token::Client::new(&env, &ibt);
+ ibt_client.transfer(&from, &this, &amount);
+
+ let principal: i128 = env
+ .storage()
+ .instance()
+ .get(&DataKey::PrincipalIbt)
+ .unwrap();
+ let new_principal = principal
+ .checked_add(amount)
+ .ok_or(TokenizerError::Overflow)?;
+ env.storage()
+ .instance()
+ .set(&DataKey::PrincipalIbt, &new_principal);
+
+ Self::mint_pt(&env, &from, amount)?;
+ Self::mint_yt(&env, &from, amount)?;
+
+ env.events()
+ .publish((symbol_short!("dep_tz"),), (from.clone(), amount));
+ Ok(())
+ }
+
+ /// Claim a pro-rata share of surplus IBT (yield) for YT holders.
+ ///
+ /// Surplus is `ibt_balance(this) − principal_ibt`. Only callable while
+ /// `ledger_timestamp < maturity` so yield cannot be drained after maturity.
+ ///
+ /// # Returns
+ ///
+ /// Amount of IBT transferred to `from`.
+ pub fn claim_yt_yield(env: Env, from: Address) -> Result {
+ Self::require_init(&env)?;
+ from.require_auth();
+ Self::require_before_maturity(&env)?;
+
+ let yt: i128 = Self::read_balance_yt(&env, &from);
+ if yt <= 0 {
+ return Err(TokenizerError::InsufficientBalance);
+ }
+
+ let total_yt: i128 = env.storage().instance().get(&DataKey::TotalYt).unwrap();
+ if total_yt <= 0 {
+ return Err(TokenizerError::InsufficientBalance);
+ }
+
+ let ibt: Address = env.storage().instance().get(&DataKey::Ibt).unwrap();
+ let this = env.current_contract_address();
+ let principal: i128 = env
+ .storage()
+ .instance()
+ .get(&DataKey::PrincipalIbt)
+ .unwrap();
+ let ibt_client = token::Client::new(&env, &ibt);
+ let balance = ibt_client.balance(&this);
+ let surplus = balance
+ .checked_sub(principal)
+ .ok_or(TokenizerError::Overflow)?;
+ if surplus <= 0 {
+ return Ok(0);
+ }
+
+ let share = surplus
+ .checked_mul(yt)
+ .ok_or(TokenizerError::Overflow)?
+ .checked_div(total_yt)
+ .ok_or(TokenizerError::Overflow)?;
+ if share <= 0 {
+ return Ok(0);
+ }
+
+ ibt_client.transfer(&this, &from, &share);
+
+ env.events()
+ .publish((symbol_short!("yt_clm"),), (from.clone(), share));
+ Ok(share)
+ }
+
+ /// Redeem PT for underlying 1:1 after maturity.
+ ///
+ /// Burns `amount` PT from `from` and transfers `amount` underlying from this
+ /// contract. Requires sufficient underlying liquidity (e.g. funded via
+ /// [`Tokenizer::fund_underlying_for_redemption`]).
+ pub fn redeem_pt(env: Env, from: Address, amount: i128) -> Result<(), TokenizerError> {
+ Self::require_init(&env)?;
+ from.require_auth();
+
+ let maturity: u64 = env.storage().instance().get(&DataKey::MaturityTs).unwrap();
+ let now = env.ledger().timestamp();
+ if now < maturity {
+ return Err(TokenizerError::RedeemBeforeMaturity);
+ }
+ if amount <= 0 {
+ return Err(TokenizerError::ZeroAmount);
+ }
+
+ let pt = Self::read_balance_pt(&env, &from);
+ if pt < amount {
+ return Err(TokenizerError::InsufficientBalance);
+ }
+
+ let underlying: Address = env.storage().instance().get(&DataKey::Underlying).unwrap();
+ let this = env.current_contract_address();
+ let u_client = token::Client::new(&env, &underlying);
+ let u_bal = u_client.balance(&this);
+ if u_bal < amount {
+ return Err(TokenizerError::InsufficientUnderlyingLiquidity);
+ }
+
+ Self::burn_pt(&env, &from, amount)?;
+ u_client.transfer(&this, &from, &amount);
+
+ env.events()
+ .publish((symbol_short!("pt_rdm"),), (from.clone(), amount));
+ Ok(())
+ }
+
+ /// Admin: transfer underlying into the contract to back PT redemptions at maturity.
+ pub fn fund_underlying_for_redemption(
+ env: Env,
+ admin: Address,
+ from: Address,
+ amount: i128,
+ ) -> Result<(), TokenizerError> {
+ Self::require_init(&env)?;
+ admin.require_auth();
+ Self::require_admin(&env, &admin)?;
+ if amount <= 0 {
+ return Err(TokenizerError::ZeroAmount);
+ }
+
+ let underlying: Address = env.storage().instance().get(&DataKey::Underlying).unwrap();
+ let this = env.current_contract_address();
+ let u_client = token::Client::new(&env, &underlying);
+ u_client.transfer(&from, &this, &amount);
+
+ env.events()
+ .publish((symbol_short!("fund_u"),), (from.clone(), amount));
+ Ok(())
+ }
+
+ /// Transfer PT to another address (fungible ledger).
+ pub fn transfer_pt(
+ env: Env,
+ from: Address,
+ to: Address,
+ amount: i128,
+ ) -> Result<(), TokenizerError> {
+ Self::require_init(&env)?;
+ from.require_auth();
+ if amount <= 0 {
+ return Err(TokenizerError::ZeroAmount);
+ }
+ let bal = Self::read_balance_pt(&env, &from);
+ if bal < amount {
+ return Err(TokenizerError::InsufficientBalance);
+ }
+ Self::set_balance_pt(&env, &from, bal - amount);
+ let to_bal = Self::read_balance_pt(&env, &to);
+ let new_to = to_bal.checked_add(amount).ok_or(TokenizerError::Overflow)?;
+ Self::set_balance_pt(&env, &to, new_to);
+ Ok(())
+ }
+
+ /// Transfer YT to another address (fungible ledger).
+ pub fn transfer_yt(
+ env: Env,
+ from: Address,
+ to: Address,
+ amount: i128,
+ ) -> Result<(), TokenizerError> {
+ Self::require_init(&env)?;
+ from.require_auth();
+ if amount <= 0 {
+ return Err(TokenizerError::ZeroAmount);
+ }
+ let bal = Self::read_balance_yt(&env, &from);
+ if bal < amount {
+ return Err(TokenizerError::InsufficientBalance);
+ }
+ Self::set_balance_yt(&env, &from, bal - amount);
+ let to_bal = Self::read_balance_yt(&env, &to);
+ let new_to = to_bal.checked_add(amount).ok_or(TokenizerError::Overflow)?;
+ Self::set_balance_yt(&env, &to, new_to);
+ Ok(())
+ }
+
+ // ── Views ───────────────────────────────────────────────────────
+
+ pub fn get_admin(env: Env) -> Result {
+ Self::require_init(&env)?;
+ Ok(env.storage().instance().get(&DataKey::Admin).unwrap())
+ }
+
+ pub fn get_ibt(env: Env) -> Result {
+ Self::require_init(&env)?;
+ Ok(env.storage().instance().get(&DataKey::Ibt).unwrap())
+ }
+
+ pub fn get_underlying(env: Env) -> Result {
+ Self::require_init(&env)?;
+ Ok(env.storage().instance().get(&DataKey::Underlying).unwrap())
+ }
+
+ pub fn get_maturity(env: Env) -> Result {
+ Self::require_init(&env)?;
+ Ok(env.storage().instance().get(&DataKey::MaturityTs).unwrap())
+ }
+
+ pub fn get_principal_ibt(env: Env) -> Result {
+ Self::require_init(&env)?;
+ Ok(env
+ .storage()
+ .instance()
+ .get(&DataKey::PrincipalIbt)
+ .unwrap())
+ }
+
+ pub fn balance_pt(env: Env, account: Address) -> Result {
+ Self::require_init(&env)?;
+ Ok(Self::read_balance_pt(&env, &account))
+ }
+
+ pub fn balance_yt(env: Env, account: Address) -> Result {
+ Self::require_init(&env)?;
+ Ok(Self::read_balance_yt(&env, &account))
+ }
+
+ pub fn total_pt(env: Env) -> Result {
+ Self::require_init(&env)?;
+ Ok(env.storage().instance().get(&DataKey::TotalPt).unwrap())
+ }
+
+ pub fn total_yt(env: Env) -> Result {
+ Self::require_init(&env)?;
+ Ok(env.storage().instance().get(&DataKey::TotalYt).unwrap())
+ }
+
+ /// IBT held minus tracked principal (surplus available as yield to YT).
+ pub fn surplus_ibt(env: Env) -> Result {
+ Self::require_init(&env)?;
+ let ibt: Address = env.storage().instance().get(&DataKey::Ibt).unwrap();
+ let this = env.current_contract_address();
+ let principal: i128 = env
+ .storage()
+ .instance()
+ .get(&DataKey::PrincipalIbt)
+ .unwrap();
+ let bal = token::Client::new(&env, &ibt).balance(&this);
+ Ok(bal.saturating_sub(principal))
+ }
+
+ // ── Internal ─────────────────────────────────────────────────────
+
+ fn require_init(env: &Env) -> Result<(), TokenizerError> {
+ if !env.storage().instance().has(&DataKey::Initialized) {
+ return Err(TokenizerError::NotInitialized);
+ }
+ Ok(())
+ }
+
+ fn require_admin(env: &Env, caller: &Address) -> Result<(), TokenizerError> {
+ let admin: Address = env.storage().instance().get(&DataKey::Admin).unwrap();
+ if caller != &admin {
+ return Err(TokenizerError::Unauthorized);
+ }
+ Ok(())
+ }
+
+ fn require_before_maturity(env: &Env) -> Result<(), TokenizerError> {
+ let maturity: u64 = env.storage().instance().get(&DataKey::MaturityTs).unwrap();
+ let now = env.ledger().timestamp();
+ if now >= maturity {
+ return Err(TokenizerError::YieldClaimAfterMaturity);
+ }
+ Ok(())
+ }
+
+ fn read_balance_pt(env: &Env, a: &Address) -> i128 {
+ env.storage()
+ .persistent()
+ .get(&DataKey::BalancePt(a.clone()))
+ .unwrap_or(0)
+ }
+
+ fn read_balance_yt(env: &Env, a: &Address) -> i128 {
+ env.storage()
+ .persistent()
+ .get(&DataKey::BalanceYt(a.clone()))
+ .unwrap_or(0)
+ }
+
+ fn set_balance_pt(env: &Env, a: &Address, v: i128) {
+ env.storage()
+ .persistent()
+ .set(&DataKey::BalancePt(a.clone()), &v);
+ }
+
+ fn set_balance_yt(env: &Env, a: &Address, v: i128) {
+ env.storage()
+ .persistent()
+ .set(&DataKey::BalanceYt(a.clone()), &v);
+ }
+
+ fn mint_pt(env: &Env, to: &Address, amount: i128) -> Result<(), TokenizerError> {
+ let total: i128 = env.storage().instance().get(&DataKey::TotalPt).unwrap();
+ let new_total = total.checked_add(amount).ok_or(TokenizerError::Overflow)?;
+ env.storage().instance().set(&DataKey::TotalPt, &new_total);
+ let b = Self::read_balance_pt(env, to);
+ let nb = b.checked_add(amount).ok_or(TokenizerError::Overflow)?;
+ Self::set_balance_pt(env, to, nb);
+ Ok(())
+ }
+
+ fn mint_yt(env: &Env, to: &Address, amount: i128) -> Result<(), TokenizerError> {
+ let total: i128 = env.storage().instance().get(&DataKey::TotalYt).unwrap();
+ let new_total = total.checked_add(amount).ok_or(TokenizerError::Overflow)?;
+ env.storage().instance().set(&DataKey::TotalYt, &new_total);
+ let b = Self::read_balance_yt(env, to);
+ let nb = b.checked_add(amount).ok_or(TokenizerError::Overflow)?;
+ Self::set_balance_yt(env, to, nb);
+ Ok(())
+ }
+
+ fn burn_pt(env: &Env, from: &Address, amount: i128) -> Result<(), TokenizerError> {
+ let total: i128 = env.storage().instance().get(&DataKey::TotalPt).unwrap();
+ let new_total = total.checked_sub(amount).ok_or(TokenizerError::Overflow)?;
+ env.storage().instance().set(&DataKey::TotalPt, &new_total);
+ let b = Self::read_balance_pt(env, from);
+ if b < amount {
+ return Err(TokenizerError::InsufficientBalance);
+ }
+ Self::set_balance_pt(env, from, b - amount);
+ Ok(())
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use soroban_sdk::testutils::Address as _;
+ use soroban_sdk::testutils::Ledger;
+
+ fn mint_tokens(env: &Env, token_addr: &Address, to: &Address, amount: i128) {
+ let admin_client = soroban_sdk::token::StellarAssetClient::new(env, token_addr);
+ admin_client.mint(to, &amount);
+ }
+
+ fn setup(
+ env: &Env,
+ maturity: u64,
+ ) -> (
+ TokenizerClient<'static>,
+ Address,
+ Address,
+ Address,
+ Address,
+ Address,
+ Address,
+ ) {
+ env.mock_all_auths();
+ let contract_id = env.register(Tokenizer, ());
+ let client = TokenizerClient::new(env, &contract_id);
+ let admin = Address::generate(env);
+ let ibt_admin = Address::generate(env);
+ let u_admin = Address::generate(env);
+ let ibt = env
+ .register_stellar_asset_contract_v2(ibt_admin.clone())
+ .address();
+ let underlying = env
+ .register_stellar_asset_contract_v2(u_admin.clone())
+ .address();
+ client.initialize(&admin, &ibt, &underlying, &maturity);
+ (
+ client,
+ contract_id,
+ admin,
+ ibt,
+ underlying,
+ ibt_admin,
+ u_admin,
+ )
+ }
+
+ #[test]
+ fn initialize_sets_config() {
+ let env = Env::default();
+ let (client, _, admin, ibt, underlying, _, _) = setup(&env, 1_000_000);
+ assert_eq!(client.get_admin(), admin);
+ assert_eq!(client.get_ibt(), ibt);
+ assert_eq!(client.get_underlying(), underlying);
+ assert_eq!(client.get_maturity(), 1_000_000);
+ assert_eq!(client.get_principal_ibt(), 0);
+ }
+
+ #[test]
+ #[should_panic(expected = "Error(Contract, #2)")]
+ fn double_initialize_panics() {
+ let env = Env::default();
+ let (client, _, admin, ibt, underlying, _, _) = setup(&env, 100);
+ client.initialize(&admin, &ibt, &underlying, &200);
+ }
+
+ #[test]
+ #[should_panic(expected = "Error(Contract, #3)")]
+ fn initialize_zero_maturity_panics() {
+ let env = Env::default();
+ env.mock_all_auths();
+ let contract_id = env.register(Tokenizer, ());
+ let client = TokenizerClient::new(&env, &contract_id);
+ let admin = Address::generate(&env);
+ let ibt = env
+ .register_stellar_asset_contract_v2(Address::generate(&env))
+ .address();
+ let u = env
+ .register_stellar_asset_contract_v2(Address::generate(&env))
+ .address();
+ client.initialize(&admin, &ibt, &u, &0);
+ }
+
+ #[test]
+ fn deposit_mints_pt_yt() {
+ let env = Env::default();
+ let (client, _, _, ibt, _, _, _) = setup(&env, 10_000);
+ let user = Address::generate(&env);
+ mint_tokens(&env, &ibt, &user, 5000);
+ env.ledger().set_timestamp(100);
+ client.deposit(&user, &1000);
+ assert_eq!(client.balance_pt(&user), 1000);
+ assert_eq!(client.balance_yt(&user), 1000);
+ assert_eq!(client.get_principal_ibt(), 1000);
+ assert_eq!(client.total_pt(), 1000);
+ assert_eq!(client.total_yt(), 1000);
+ }
+
+ #[test]
+ #[should_panic(expected = "Error(Contract, #3)")]
+ fn deposit_zero_panics() {
+ let env = Env::default();
+ let (client, _, _, _, _, _, _) = setup(&env, 10_000);
+ let user = Address::generate(&env);
+ client.deposit(&user, &0);
+ }
+
+ #[test]
+ fn claim_yt_distributes_surplus() {
+ let env = Env::default();
+ let (client, contract_id, _, ibt, _, _, _) = setup(&env, 10_000);
+ let user = Address::generate(&env);
+ mint_tokens(&env, &ibt, &user, 10_000);
+ env.ledger().set_timestamp(100);
+ client.deposit(&user, &1000);
+ // Simulate yield: mint extra IBT to the tokenizer contract
+ mint_tokens(&env, &ibt, &contract_id, 100);
+ assert_eq!(client.surplus_ibt(), 100);
+ let claimed = client.claim_yt_yield(&user);
+ assert_eq!(claimed, 100);
+ }
+
+ #[test]
+ fn claim_yt_zero_when_no_surplus() {
+ let env = Env::default();
+ let (client, _, _, ibt, _, _, _) = setup(&env, 10_000);
+ let user = Address::generate(&env);
+ mint_tokens(&env, &ibt, &user, 1000);
+ env.ledger().set_timestamp(100);
+ client.deposit(&user, &1000);
+ assert_eq!(client.claim_yt_yield(&user), 0);
+ }
+
+ #[test]
+ #[should_panic(expected = "Error(Contract, #5)")]
+ fn claim_yt_after_maturity_panics() {
+ let env = Env::default();
+ let (client, contract_id, _, ibt, _, _, _) = setup(&env, 10_000);
+ let user = Address::generate(&env);
+ mint_tokens(&env, &ibt, &user, 1000);
+ env.ledger().set_timestamp(100);
+ client.deposit(&user, &500);
+ mint_tokens(&env, &ibt, &contract_id, 50);
+ env.ledger().set_timestamp(10_001);
+ let _ = client.claim_yt_yield(&user);
+ }
+
+ #[test]
+ #[should_panic(expected = "Error(Contract, #5)")]
+ fn claim_yt_at_maturity_panics() {
+ let env = Env::default();
+ let (client, _, _, ibt, _, _, _) = setup(&env, 1000);
+ let user = Address::generate(&env);
+ mint_tokens(&env, &ibt, &user, 1000);
+ env.ledger().set_timestamp(500);
+ client.deposit(&user, &100);
+ env.ledger().set_timestamp(1000);
+ let _ = client.claim_yt_yield(&user);
+ }
+
+ #[test]
+ #[should_panic(expected = "Error(Contract, #6)")]
+ fn redeem_pt_before_maturity_panics() {
+ let env = Env::default();
+ let (client, _, admin, ibt, u, _, _) = setup(&env, 10_000);
+ let user = Address::generate(&env);
+ mint_tokens(&env, &ibt, &user, 1000);
+ mint_tokens(&env, &u, &admin, 10_000);
+ env.ledger().set_timestamp(100);
+ client.deposit(&user, &100);
+ client.fund_underlying_for_redemption(&admin, &admin, &500);
+ env.ledger().set_timestamp(500);
+ client.redeem_pt(&user, &50);
+ }
+
+ #[test]
+ fn redeem_pt_after_maturity() {
+ let env = Env::default();
+ let (client, _, admin, ibt, u, _, _) = setup(&env, 1000);
+ let user = Address::generate(&env);
+ mint_tokens(&env, &ibt, &user, 1000);
+ mint_tokens(&env, &u, &admin, 10_000);
+ env.ledger().set_timestamp(100);
+ client.deposit(&user, &100);
+ client.fund_underlying_for_redemption(&admin, &admin, &100);
+ env.ledger().set_timestamp(1000);
+ let u_client = token::Client::new(&env, &u);
+ let before = u_client.balance(&user);
+ client.redeem_pt(&user, &100);
+ assert_eq!(u_client.balance(&user), before + 100);
+ assert_eq!(client.balance_pt(&user), 0);
+ }
+
+ #[test]
+ #[should_panic(expected = "Error(Contract, #9)")]
+ fn redeem_pt_insufficient_underlying_panics() {
+ let env = Env::default();
+ let (client, _, _, ibt, _, _, _) = setup(&env, 500);
+ let user = Address::generate(&env);
+ mint_tokens(&env, &ibt, &user, 500);
+ env.ledger().set_timestamp(100);
+ client.deposit(&user, &100);
+ env.ledger().set_timestamp(600);
+ client.redeem_pt(&user, &100);
+ }
+
+ #[test]
+ fn transfer_pt_and_yt() {
+ let env = Env::default();
+ let (client, _, _, ibt, _, _, _) = setup(&env, 10_000);
+ let a = Address::generate(&env);
+ let b = Address::generate(&env);
+ mint_tokens(&env, &ibt, &a, 500);
+ env.ledger().set_timestamp(100);
+ client.deposit(&a, &200);
+ client.transfer_pt(&a, &b, &50);
+ client.transfer_yt(&a, &b, &50);
+ assert_eq!(client.balance_pt(&a), 150);
+ assert_eq!(client.balance_pt(&b), 50);
+ assert_eq!(client.balance_yt(&a), 150);
+ assert_eq!(client.balance_yt(&b), 50);
+ }
+
+ #[test]
+ #[should_panic(expected = "Error(Contract, #4)")]
+ fn transfer_pt_insufficient_panics() {
+ let env = Env::default();
+ let (client, _, _, ibt, _, _, _) = setup(&env, 10_000);
+ let a = Address::generate(&env);
+ let b = Address::generate(&env);
+ mint_tokens(&env, &ibt, &a, 100);
+ env.ledger().set_timestamp(100);
+ client.deposit(&a, &50);
+ client.transfer_pt(&a, &b, &100);
+ }
+
+ #[test]
+ #[should_panic(expected = "Error(Contract, #7)")]
+ fn fund_underlying_non_admin_panics() {
+ let env = Env::default();
+ let (client, _, admin, _, u, _, _) = setup(&env, 10_000);
+ let bad = Address::generate(&env);
+ mint_tokens(&env, &u, &bad, 100);
+ client.fund_underlying_for_redemption(&bad, &bad, &50);
+ let _ = admin;
+ }
+
+ #[test]
+ fn two_users_split_yield() {
+ let env = Env::default();
+ let (client, contract_id, _, ibt, _, _, _) = setup(&env, 50_000);
+ let u1 = Address::generate(&env);
+ let u2 = Address::generate(&env);
+ mint_tokens(&env, &ibt, &u1, 5000);
+ mint_tokens(&env, &ibt, &u2, 5000);
+ env.ledger().set_timestamp(1000);
+ client.deposit(&u1, &1000);
+ client.deposit(&u2, &1000);
+ mint_tokens(&env, &ibt, &contract_id, 200);
+ // Top up if the test env only applied part of the mint to the tokenizer balance.
+ let mut surplus = client.surplus_ibt();
+ if surplus < 200 {
+ mint_tokens(&env, &ibt, &contract_id, 200 - surplus);
+ surplus = client.surplus_ibt();
+ }
+ assert_eq!(surplus, 200);
+ assert_eq!(client.total_yt(), 2000);
+ // Same formula both times: share = surplus * yt / total_yt. The first claim
+ // transfers IBT out, so the second claim splits the *remaining* surplus (100),
+ // not another full 200.
+ assert_eq!(client.claim_yt_yield(&u1), 100);
+ assert_eq!(client.claim_yt_yield(&u2), 50);
+ }
+
+ #[test]
+ fn surplus_ibt_view() {
+ let env = Env::default();
+ let (client, contract_id, _, ibt, _, _, _) = setup(&env, 99_999);
+ let user = Address::generate(&env);
+ mint_tokens(&env, &ibt, &user, 2000);
+ env.ledger().set_timestamp(1);
+ client.deposit(&user, &1000);
+ mint_tokens(&env, &ibt, &contract_id, 50);
+ assert_eq!(client.surplus_ibt(), 50);
+ }
+
+ #[test]
+ #[should_panic(expected = "Error(Contract, #4)")]
+ fn claim_yt_zero_balance_panics() {
+ let env = Env::default();
+ let (client, contract_id, _, ibt, _, _, _) = setup(&env, 50_000);
+ let user = Address::generate(&env);
+ let other = Address::generate(&env);
+ mint_tokens(&env, &ibt, &other, 1000);
+ env.ledger().set_timestamp(100);
+ client.deposit(&other, &500);
+ mint_tokens(&env, &ibt, &contract_id, 10);
+ client.claim_yt_yield(&user);
+ }
+
+ #[test]
+ #[should_panic(expected = "Error(Contract, #3)")]
+ fn redeem_pt_zero_panics() {
+ let env = Env::default();
+ let (client, _, admin, ibt, u, _, _) = setup(&env, 100);
+ let user = Address::generate(&env);
+ mint_tokens(&env, &ibt, &user, 100);
+ mint_tokens(&env, &u, &admin, 1000);
+ env.ledger().set_timestamp(0);
+ client.deposit(&user, &50);
+ client.fund_underlying_for_redemption(&admin, &admin, &50);
+ env.ledger().set_timestamp(100);
+ client.redeem_pt(&user, &0);
+ }
+
+ #[test]
+ #[should_panic(expected = "Error(Contract, #4)")]
+ fn redeem_pt_insufficient_pt_panics() {
+ let env = Env::default();
+ let (client, _, admin, ibt, u, _, _) = setup(&env, 200);
+ let user = Address::generate(&env);
+ mint_tokens(&env, &ibt, &user, 100);
+ mint_tokens(&env, &u, &admin, 1000);
+ env.ledger().set_timestamp(0);
+ client.deposit(&user, &10);
+ client.fund_underlying_for_redemption(&admin, &admin, &100);
+ env.ledger().set_timestamp(200);
+ client.redeem_pt(&user, &50);
+ }
+
+ #[test]
+ #[should_panic(expected = "Error(Contract, #10)")]
+ fn deposit_after_maturity_closed() {
+ let env = Env::default();
+ let (client, _, _, ibt, _, _, _) = setup(&env, 1000);
+ let user = Address::generate(&env);
+ mint_tokens(&env, &ibt, &user, 500);
+ env.ledger().set_timestamp(2000);
+ client.deposit(&user, &100);
+ }
+
+ #[test]
+ #[should_panic(expected = "Error(Contract, #3)")]
+ fn fund_underlying_zero_panics() {
+ let env = Env::default();
+ let (client, _, admin, _, u, _, _) = setup(&env, 10_000);
+ let bad = Address::generate(&env);
+ mint_tokens(&env, &u, &bad, 10);
+ client.fund_underlying_for_redemption(&admin, &bad, &0);
+ }
+}
diff --git a/contracts/yield_tranches/test_snapshots/tests/claim_yt_after_maturity_panics.1.json b/contracts/yield_tranches/test_snapshots/tests/claim_yt_after_maturity_panics.1.json
new file mode 100644
index 0000000000..f164034d9d
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/claim_yt_after_maturity_panics.1.json
@@ -0,0 +1,1007 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 10001,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 10000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 550
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/claim_yt_at_maturity_panics.1.json b/contracts/yield_tranches/test_snapshots/tests/claim_yt_at_maturity_panics.1.json
new file mode 100644
index 0000000000..a3806edd50
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/claim_yt_at_maturity_panics.1.json
@@ -0,0 +1,949 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 1000,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 1000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 900
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/claim_yt_distributes_surplus.1.json b/contracts/yield_tranches/test_snapshots/tests/claim_yt_distributes_surplus.1.json
new file mode 100644
index 0000000000..4f76a6f3d6
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/claim_yt_distributes_surplus.1.json
@@ -0,0 +1,1122 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 10000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "claim_yt_yield",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ]
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 100,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 10000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4270020994084947596
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4270020994084947596
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 9100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": [
+ {
+ "event": {
+ "ext": "v0",
+ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73",
+ "type_": "contract",
+ "body": {
+ "v0": {
+ "topics": [
+ {
+ "symbol": "transfer"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ ],
+ "data": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ }
+ }
+ },
+ "failed_call": false
+ },
+ {
+ "event": {
+ "ext": "v0",
+ "contract_id": "0000000000000000000000000000000000000000000000000000000000000001",
+ "type_": "contract",
+ "body": {
+ "v0": {
+ "topics": [
+ {
+ "symbol": "yt_clm"
+ }
+ ],
+ "data": {
+ "vec": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "failed_call": false
+ }
+ ]
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/claim_yt_zero_balance_panics.1.json b/contracts/yield_tranches/test_snapshots/tests/claim_yt_zero_balance_panics.1.json
new file mode 100644
index 0000000000..ccbab7708f
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/claim_yt_zero_balance_panics.1.json
@@ -0,0 +1,1007 @@
+{
+ "generators": {
+ "address": 8,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 10
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 100,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 50000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 510
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/claim_yt_zero_when_no_surplus.1.json b/contracts/yield_tranches/test_snapshots/tests/claim_yt_zero_when_no_surplus.1.json
new file mode 100644
index 0000000000..02d7e23e20
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/claim_yt_zero_when_no_surplus.1.json
@@ -0,0 +1,1000 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "claim_yt_yield",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ]
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 100,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 10000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/deposit_after_maturity_closed.1.json b/contracts/yield_tranches/test_snapshots/tests/deposit_after_maturity_closed.1.json
new file mode 100644
index 0000000000..29f3f36f06
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/deposit_after_maturity_closed.1.json
@@ -0,0 +1,698 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 2000,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 1000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/deposit_mints_pt_yt.1.json b/contracts/yield_tranches/test_snapshots/tests/deposit_mints_pt_yt.1.json
new file mode 100644
index 0000000000..a197f9f4db
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/deposit_mints_pt_yt.1.json
@@ -0,0 +1,953 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 5000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [],
+ [],
+ [],
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 100,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 10000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 4000
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/deposit_zero_panics.1.json b/contracts/yield_tranches/test_snapshots/tests/deposit_zero_panics.1.json
new file mode 100644
index 0000000000..e6557fefa3
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/deposit_zero_panics.1.json
@@ -0,0 +1,567 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "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": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 10000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/double_initialize_panics.1.json b/contracts/yield_tranches/test_snapshots/tests/double_initialize_panics.1.json
new file mode 100644
index 0000000000..d7e64f0c94
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/double_initialize_panics.1.json
@@ -0,0 +1,567 @@
+{
+ "generators": {
+ "address": 6,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "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": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 100
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/fund_underlying_non_admin_panics.1.json b/contracts/yield_tranches/test_snapshots/tests/fund_underlying_non_admin_panics.1.json
new file mode 100644
index 0000000000..0600ca0855
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/fund_underlying_non_admin_panics.1.json
@@ -0,0 +1,698 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "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": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 10000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/fund_underlying_zero_panics.1.json b/contracts/yield_tranches/test_snapshots/tests/fund_underlying_zero_panics.1.json
new file mode 100644
index 0000000000..5f156a6b8d
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/fund_underlying_zero_panics.1.json
@@ -0,0 +1,698 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 10
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "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": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 10000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 10
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/initialize_sets_config.1.json b/contracts/yield_tranches/test_snapshots/tests/initialize_sets_config.1.json
new file mode 100644
index 0000000000..b4a0a3e3f7
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/initialize_sets_config.1.json
@@ -0,0 +1,571 @@
+{
+ "generators": {
+ "address": 6,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [],
+ [],
+ [],
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "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": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 1000000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/initialize_zero_maturity_panics.1.json b/contracts/yield_tranches/test_snapshots/tests/initialize_zero_maturity_panics.1.json
new file mode 100644
index 0000000000..8dacb9f358
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/initialize_zero_maturity_panics.1.json
@@ -0,0 +1,460 @@
+{
+ "generators": {
+ "address": 6,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "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": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": null
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CCABDO7UZXYE4W6GVSEGSNNZTKSLFQGKXXQTH6OX7M7GKZ4Z6CUJNGZN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJXFF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000004"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/redeem_pt_after_maturity.1.json b/contracts/yield_tranches/test_snapshots/tests/redeem_pt_after_maturity.1.json
new file mode 100644
index 0000000000..3fe9e96eff
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/redeem_pt_after_maturity.1.json
@@ -0,0 +1,1371 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 10000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "fund_underlying_for_redemption",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "redeem_pt",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 1000,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 1000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4270020994084947596
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4270020994084947596
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 8370022561469687789
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 8370022561469687789
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 0
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 9900
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 900
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/redeem_pt_before_maturity_panics.1.json b/contracts/yield_tranches/test_snapshots/tests/redeem_pt_before_maturity_panics.1.json
new file mode 100644
index 0000000000..67e158acdd
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/redeem_pt_before_maturity_panics.1.json
@@ -0,0 +1,1238 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 10000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "fund_underlying_for_redemption",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 500,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 10000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4270020994084947596
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4270020994084947596
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 9500
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 900
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/redeem_pt_insufficient_pt_panics.1.json b/contracts/yield_tranches/test_snapshots/tests/redeem_pt_insufficient_pt_panics.1.json
new file mode 100644
index 0000000000..28c8e7bbbf
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/redeem_pt_insufficient_pt_panics.1.json
@@ -0,0 +1,1238 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 10
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 10
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "fund_underlying_for_redemption",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 200,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 10
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 10
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 200
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 10
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 10
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 10
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4270020994084947596
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4270020994084947596
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 900
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 10
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 90
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/redeem_pt_insufficient_underlying_panics.1.json b/contracts/yield_tranches/test_snapshots/tests/redeem_pt_insufficient_underlying_panics.1.json
new file mode 100644
index 0000000000..0035a708fa
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/redeem_pt_insufficient_underlying_panics.1.json
@@ -0,0 +1,949 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 600,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 500
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 400
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/redeem_pt_zero_panics.1.json b/contracts/yield_tranches/test_snapshots/tests/redeem_pt_zero_panics.1.json
new file mode 100644
index 0000000000..4307332d49
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/redeem_pt_zero_panics.1.json
@@ -0,0 +1,1238 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "fund_underlying_for_redemption",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 100,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 100
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4270020994084947596
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4270020994084947596
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 950
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/surplus_ibt_view.1.json b/contracts/yield_tranches/test_snapshots/tests/surplus_ibt_view.1.json
new file mode 100644
index 0000000000..ace408ef79
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/surplus_ibt_view.1.json
@@ -0,0 +1,1007 @@
+{
+ "generators": {
+ "address": 7,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 2000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 1,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 99999
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1050
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/transfer_pt_and_yt.1.json b/contracts/yield_tranches/test_snapshots/tests/transfer_pt_and_yt.1.json
new file mode 100644
index 0000000000..3818cf7da0
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/transfer_pt_and_yt.1.json
@@ -0,0 +1,1170 @@
+{
+ "generators": {
+ "address": 8,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 500
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 200
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 200
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "transfer_pt",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "transfer_yt",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [],
+ [],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 100,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 150
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 150
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 10000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 200
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 200
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 200
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4270020994084947596
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4270020994084947596
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 200
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 300
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/transfer_pt_insufficient_panics.1.json b/contracts/yield_tranches/test_snapshots/tests/transfer_pt_insufficient_panics.1.json
new file mode 100644
index 0000000000..baddc824a8
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/transfer_pt_insufficient_panics.1.json
@@ -0,0 +1,949 @@
+{
+ "generators": {
+ "address": 8,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 100
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ []
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 100,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 10000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": []
+}
\ No newline at end of file
diff --git a/contracts/yield_tranches/test_snapshots/tests/two_users_split_yield.1.json b/contracts/yield_tranches/test_snapshots/tests/two_users_split_yield.1.json
new file mode 100644
index 0000000000..a5f4de6f80
--- /dev/null
+++ b/contracts/yield_tranches/test_snapshots/tests/two_users_split_yield.1.json
@@ -0,0 +1,1484 @@
+{
+ "generators": {
+ "address": 8,
+ "nonce": 0
+ },
+ "auth": [
+ [],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "function_name": "set_admin",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 5000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 5000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "deposit",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": [
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "transfer",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "function_name": "mint",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 200
+ }
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [],
+ [],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "claim_yt_yield",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ],
+ [
+ [
+ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5",
+ {
+ "function": {
+ "contract_fn": {
+ "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "function_name": "claim_yt_yield",
+ "args": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ }
+ },
+ "sub_invocations": []
+ }
+ ]
+ ]
+ ],
+ "ledger": {
+ "protocol_version": 22,
+ "sequence_number": 0,
+ "timestamp": 1000,
+ "network_id": "0000000000000000000000000000000000000000000000000000000000000000",
+ "base_reserve": 0,
+ "min_persistent_entry_ttl": 4096,
+ "min_temp_entry_ttl": 16,
+ "max_entry_ttl": 6312000,
+ "ledger_entries": [
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "account": {
+ "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "balance": 0,
+ "seq_num": 0,
+ "num_sub_entries": 0,
+ "inflation_dest": null,
+ "flags": 0,
+ "home_domain": "",
+ "thresholds": "01010101",
+ "signers": [],
+ "ext": "v0"
+ }
+ },
+ "ext": "v0"
+ },
+ null
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 801925984706572462
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5541220902715666415
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalancePt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": {
+ "vec": [
+ {
+ "symbol": "BalanceYt"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 1000
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent",
+ "val": {
+ "contract_instance": {
+ "executable": {
+ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ "storage": [
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Ibt"
+ }
+ ]
+ },
+ "val": {
+ "address": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Initialized"
+ }
+ ]
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "MaturityTs"
+ }
+ ]
+ },
+ "val": {
+ "u64": 50000
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "PrincipalIbt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 2000
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalPt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 2000
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "TotalYt"
+ }
+ ]
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 2000
+ }
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Underlying"
+ }
+ ]
+ },
+ "val": {
+ "address": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN"
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 1033654523790656264
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4837995959683129791
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 8370022561469687789
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 8370022561469687789
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 2032731177588607455
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 6277191135259896685
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 6277191135259896685
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4270020994084947596
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 4270020994084947596
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5806905060045992000
+ }
+ },
+ "durability": "temporary"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5",
+ "key": {
+ "ledger_key_nonce": {
+ "nonce": 5806905060045992000
+ }
+ },
+ "durability": "temporary",
+ "val": "void"
+ }
+ },
+ "ext": "v0"
+ },
+ 6311999
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CACMVW2KK4H5FZDFF2AUCAKQTEJMZZWJUIZF23XMRVYQBSXYLHZ6BKWN",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHUF"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000006"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 2050
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 4100
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": {
+ "vec": [
+ {
+ "symbol": "Balance"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ }
+ ]
+ },
+ "durability": "persistent",
+ "val": {
+ "map": [
+ {
+ "key": {
+ "symbol": "amount"
+ },
+ "val": {
+ "i128": {
+ "hi": 0,
+ "lo": 4050
+ }
+ }
+ },
+ {
+ "key": {
+ "symbol": "authorized"
+ },
+ "val": {
+ "bool": true
+ }
+ },
+ {
+ "key": {
+ "symbol": "clawback"
+ },
+ "val": {
+ "bool": false
+ }
+ }
+ ]
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 518400
+ ]
+ ],
+ [
+ {
+ "contract_data": {
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "key": "ledger_key_contract_instance",
+ "durability": "persistent"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_data": {
+ "ext": "v0",
+ "contract": "CDLDVFKHEZ2RVB3NG4UQA4VPD3TSHV6XMHXMHP2BSGCJ2IIWVTOHGDSG",
+ "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:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ },
+ {
+ "key": {
+ "symbol": "symbol"
+ },
+ "val": {
+ "string": "aaa"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "Admin"
+ }
+ ]
+ },
+ "val": {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
+ }
+ },
+ {
+ "key": {
+ "vec": [
+ {
+ "symbol": "AssetInfo"
+ }
+ ]
+ },
+ "val": {
+ "vec": [
+ {
+ "symbol": "AlphaNum4"
+ },
+ {
+ "map": [
+ {
+ "key": {
+ "symbol": "asset_code"
+ },
+ "val": {
+ "string": "aaa\\0"
+ }
+ },
+ {
+ "key": {
+ "symbol": "issuer"
+ },
+ "val": {
+ "bytes": "0000000000000000000000000000000000000000000000000000000000000005"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "ext": "v0"
+ },
+ 120960
+ ]
+ ],
+ [
+ {
+ "contract_code": {
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ },
+ [
+ {
+ "last_modified_ledger_seq": 0,
+ "data": {
+ "contract_code": {
+ "ext": "v0",
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "code": ""
+ }
+ },
+ "ext": "v0"
+ },
+ 4095
+ ]
+ ]
+ ]
+ },
+ "events": [
+ {
+ "event": {
+ "ext": "v0",
+ "contract_id": "d63a954726751a876d37290072af1ee723d7d761eec3bf4191849d2116acdc73",
+ "type_": "contract",
+ "body": {
+ "v0": {
+ "topics": [
+ {
+ "symbol": "transfer"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
+ },
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ },
+ {
+ "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL7NV"
+ }
+ ],
+ "data": {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ }
+ }
+ },
+ "failed_call": false
+ },
+ {
+ "event": {
+ "ext": "v0",
+ "contract_id": "0000000000000000000000000000000000000000000000000000000000000001",
+ "type_": "contract",
+ "body": {
+ "v0": {
+ "topics": [
+ {
+ "symbol": "yt_clm"
+ }
+ ],
+ "data": {
+ "vec": [
+ {
+ "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5"
+ },
+ {
+ "i128": {
+ "hi": 0,
+ "lo": 50
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "failed_call": false
+ }
+ ]
+}
\ No newline at end of file