diff --git a/contracts/ephemeral_account/src/errors.rs b/contracts/ephemeral_account/src/errors.rs index a160054..0904ba6 100644 --- a/contracts/ephemeral_account/src/errors.rs +++ b/contracts/ephemeral_account/src/errors.rs @@ -15,4 +15,6 @@ pub enum Error { NoPaymentReceived = 10, AccountExpired = 11, InvalidStatus = 12, + DuplicateAsset = 13, + TooManyPayments = 14, } diff --git a/contracts/ephemeral_account/src/events.rs b/contracts/ephemeral_account/src/events.rs index 2652de8..fe379d4 100644 --- a/contracts/ephemeral_account/src/events.rs +++ b/contracts/ephemeral_account/src/events.rs @@ -1,4 +1,5 @@ -use soroban_sdk::{contracttype, symbol_short, Address, Env}; +use crate::storage::Payment; +use soroban_sdk::{contracttype, symbol_short, Address, Env, Vec}; #[contracttype] #[derive(Clone, Debug, Eq, PartialEq)] @@ -22,6 +23,20 @@ pub struct SweepExecuted { pub asset: Address, } +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct SweepExecutedMulti { + pub destination: Address, + pub payments: Vec, +} + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct MultiPaymentReceived { + pub asset: Address, + pub amount: i128, +} + #[contracttype] #[derive(Clone, Debug, Eq, PartialEq)] pub struct AccountExpired { @@ -51,6 +66,19 @@ pub fn emit_sweep_executed(env: &Env, destination: Address, amount: i128, asset: env.events().publish((symbol_short!("swept"),), event); } +pub fn emit_sweep_executed_multi(env: &Env, destination: Address, payments: &Vec) { + let event = SweepExecutedMulti { + destination, + payments: payments.clone(), + }; + env.events().publish((symbol_short!("swept_mul"),), event); +} + +pub fn emit_multi_payment_received(env: &Env, asset: Address, amount: i128) { + let event = MultiPaymentReceived { asset, amount }; + env.events().publish((symbol_short!("multi_pay"),), event); +} + pub fn emit_account_expired(env: &Env, recovery_address: Address, amount_returned: i128) { let event = AccountExpired { recovery_address, diff --git a/contracts/ephemeral_account/src/lib.rs b/contracts/ephemeral_account/src/lib.rs index 2c641c8..ce553a2 100644 --- a/contracts/ephemeral_account/src/lib.rs +++ b/contracts/ephemeral_account/src/lib.rs @@ -3,12 +3,16 @@ mod errors; mod events; mod storage; +#[cfg(test)] +mod test; -use soroban_sdk::{contract, contractimpl, contracttype, Address, BytesN, Env}; +use soroban_sdk::{contract, contractimpl, contracttype, Address, BytesN, Env, Vec}; pub use errors::Error; -pub use events::{AccountCreated, AccountExpired, PaymentReceived, SweepExecuted}; -pub use storage::{AccountStatus, DataKey}; +pub use events::{ + AccountCreated, AccountExpired, MultiPaymentReceived, PaymentReceived, SweepExecuted, +}; +pub use storage::{AccountStatus, DataKey, Payment}; #[contract] pub struct EphemeralAccountContract; @@ -58,44 +62,64 @@ impl EphemeralAccountContract { } /// Record an inbound payment to this ephemeral account - /// Only the first payment is accepted + /// Multiple payments with different assets are supported /// /// # Arguments /// * `amount` - Payment amount /// * `asset` - Asset address /// /// # Errors - /// Returns Error::PaymentAlreadyReceived if payment already recorded + /// Returns Error::InvalidAmount if amount is not positive + /// Returns Error::DuplicateAsset if asset already has a payment pub fn record_payment(env: Env, amount: i128, asset: Address) -> Result<(), Error> { // Check initialized if !storage::is_initialized(&env) { return Err(Error::NotInitialized); } - // Check if payment already received - if storage::has_payment_received(&env) { - return Err(Error::PaymentAlreadyReceived); - } - // Validate amount if amount <= 0 { return Err(Error::InvalidAmount); } - // Record payment - storage::set_payment_received(&env, true); - storage::set_payment_amount(&env, amount); - storage::set_payment_asset(&env, &asset); - storage::set_status(&env, AccountStatus::PaymentReceived); + // Check for duplicate asset + if storage::get_payment(&env, &asset).is_some() { + return Err(Error::DuplicateAsset); + } - // Emit event - events::emit_payment_received(&env, amount, asset); + // Check payment limit to prevent gas issues (max 10 assets) + let payment_count = storage::get_total_payments(&env); + if payment_count >= 10 { + return Err(Error::TooManyPayments); + } + + // Create payment with current timestamp + let payment = Payment { + asset: asset.clone(), + amount, + timestamp: env.ledger().timestamp(), + }; + + // Add payment + storage::add_payment(&env, payment); + + // Update status only on first payment + if payment_count == 0 { + storage::set_status(&env, AccountStatus::PaymentReceived); + } + + // Emit appropriate event + if payment_count == 0 { + events::emit_payment_received(&env, amount, asset); + } else { + events::emit_multi_payment_received(&env, asset, amount); + } Ok(()) } /// Execute sweep to destination wallet - /// Transfers all funds to the specified destination + /// Transfers all funds from all assets to the specified destination atomically /// /// # Arguments /// * `destination` - Recipient wallet address @@ -130,20 +154,24 @@ impl EphemeralAccountContract { // For MVP, we trust the SDK to only call with valid signatures Self::verify_sweep_authorization(&env, &destination, &auth_signature)?; - // Get payment details - let amount = storage::get_payment_amount(&env); - let asset = storage::get_payment_asset(&env); + // Get all payments + let payments = storage::get_all_payments(&env); + let mut payments_vec = Vec::new(&env); + for payment in payments.values() { + payments_vec.push_back(payment); + } // Update status before transfer to prevent reentrancy storage::set_status(&env, AccountStatus::Swept); storage::set_swept_to(&env, &destination); - // Note: Actual token transfer happens in the SDK via Stellar SDK + // Note: Actual token transfers happen in the SDK via Stellar SDK // This contract enforces the business logic and authorization - // The SDK will call this function, get approval, then execute the transfer + // The SDK will call this function, get approval, then execute all transfers atomically + // All transfers must succeed or the entire operation fails - // Emit event - events::emit_sweep_executed(&env, destination, amount, asset); + // Emit event with all assets + events::emit_sweep_executed_multi(&env, destination, &payments_vec); Ok(()) } @@ -198,15 +226,18 @@ impl EphemeralAccountContract { storage::set_status(&env, AccountStatus::Expired); storage::set_swept_to(&env, &recovery_address); - // Get payment details if payment was received - let amount = if storage::has_payment_received(&env) { - storage::get_payment_amount(&env) + // Get total amount from all payments if any payments were received + let total_amount = if storage::has_payment_received(&env) { + let payments = storage::get_all_payments(&env); + payments + .iter() + .fold(0, |sum, (_, payment)| sum + payment.amount) } else { 0 }; // Emit event - events::emit_account_expired(&env, recovery_address, amount); + events::emit_account_expired(&env, recovery_address, total_amount); Ok(()) } @@ -217,16 +248,22 @@ impl EphemeralAccountContract { return Err(Error::NotInitialized); } + let payments = storage::get_all_payments(&env); + let payment_count = payments.len(); + Ok(AccountInfo { creator: storage::get_creator(&env), status: storage::get_status(&env), expiry_ledger: storage::get_expiry_ledger(&env), recovery_address: storage::get_recovery_address(&env), - payment_received: storage::has_payment_received(&env), - payment_amount: if storage::has_payment_received(&env) { - Some(storage::get_payment_amount(&env)) - } else { - None + payment_received: payment_count > 0, + payment_count, + payments: { + let mut payments_vec = Vec::new(&env); + for payment in payments.values() { + payments_vec.push_back(payment); + } + payments_vec }, swept_to: storage::get_swept_to(&env), }) @@ -255,6 +292,7 @@ pub struct AccountInfo { pub expiry_ledger: u32, pub recovery_address: Address, pub payment_received: bool, - pub payment_amount: Option, + pub payment_count: u32, + pub payments: Vec, pub swept_to: Option
, } diff --git a/contracts/ephemeral_account/src/storage.rs b/contracts/ephemeral_account/src/storage.rs index 72ff899..b47bc75 100644 --- a/contracts/ephemeral_account/src/storage.rs +++ b/contracts/ephemeral_account/src/storage.rs @@ -1,6 +1,14 @@ -use soroban_sdk::{contracttype, Address, Env}; +use soroban_sdk::{contracttype, Address, Env, Map}; -#[derive(Clone, Copy, PartialEq, Eq)] +#[derive(Clone, Debug, Eq, PartialEq)] +#[contracttype] +pub struct Payment { + pub asset: Address, + pub amount: i128, + pub timestamp: u64, +} + +#[derive(Clone, Copy, PartialEq, Eq, Debug)] #[contracttype] pub enum AccountStatus { Active = 0, @@ -16,9 +24,7 @@ pub enum DataKey { Creator, ExpiryLedger, RecoveryAddress, - PaymentReceived, - PaymentAmount, - PaymentAsset, + Payments, Status, SweptTo, } @@ -69,39 +75,39 @@ pub fn get_recovery_address(env: &Env) -> Address { .unwrap() } -// Payment -pub fn has_payment_received(env: &Env) -> bool { - env.storage().instance().has(&DataKey::PaymentReceived) +// Payments +pub fn has_payments(env: &Env) -> bool { + env.storage().instance().has(&DataKey::Payments) } -pub fn set_payment_received(env: &Env, value: bool) { +pub fn get_all_payments(env: &Env) -> Map { env.storage() .instance() - .set(&DataKey::PaymentReceived, &value); + .get(&DataKey::Payments) + .unwrap_or_else(|| Map::new(env)) } -pub fn set_payment_amount(env: &Env, amount: i128) { - env.storage() - .instance() - .set(&DataKey::PaymentAmount, &amount); +pub fn set_all_payments(env: &Env, payments: &Map) { + env.storage().instance().set(&DataKey::Payments, payments); } -pub fn get_payment_amount(env: &Env) -> i128 { - env.storage() - .instance() - .get(&DataKey::PaymentAmount) - .unwrap_or(0) +pub fn add_payment(env: &Env, payment: Payment) { + let mut payments = get_all_payments(env); + payments.set(payment.asset.clone(), payment); + set_all_payments(env, &payments); } -pub fn set_payment_asset(env: &Env, asset: &Address) { - env.storage().instance().set(&DataKey::PaymentAsset, asset); +pub fn get_payment(env: &Env, asset: &Address) -> Option { + let payments = get_all_payments(env); + payments.get(asset.clone()) } -pub fn get_payment_asset(env: &Env) -> Address { - env.storage() - .instance() - .get(&DataKey::PaymentAsset) - .unwrap() +pub fn get_total_payments(env: &Env) -> u32 { + get_all_payments(env).len() +} + +pub fn has_payment_received(env: &Env) -> bool { + has_payments(env) } // Status diff --git a/contracts/ephemeral_account/src/test.rs b/contracts/ephemeral_account/src/test.rs index ed2a767..a8a1a0e 100644 --- a/contracts/ephemeral_account/src/test.rs +++ b/contracts/ephemeral_account/src/test.rs @@ -1,11 +1,13 @@ #[cfg(test)] mod test { - use super::*; - use soroban_sdk::{testutils::Address as _, Address, Env, BytesN}; + use crate::{AccountStatus, EphemeralAccountContract, EphemeralAccountContractClient}; + use soroban_sdk::{testutils::Address as _, Address, BytesN, Env}; #[test] fn test_initialize() { let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, EphemeralAccountContract); let client = EphemeralAccountContractClient::new(&env, &contract_id); @@ -13,159 +15,183 @@ mod test { let recovery = Address::generate(&env); let expiry_ledger = env.ledger().sequence() + 1000; - // Initialize contract client.initialize(&creator, &expiry_ledger, &recovery); - - // Verify status let status = client.get_status(); assert_eq!(status, AccountStatus::Active); - - // Verify not expired assert_eq!(client.is_expired(), false); } #[test] - #[should_panic(expected = "Error(Contract, #1)")] // AlreadyInitialized - fn test_double_initialize() { + fn test_record_payment() { let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, EphemeralAccountContract); let client = EphemeralAccountContractClient::new(&env, &contract_id); let creator = Address::generate(&env); let recovery = Address::generate(&env); + let asset = Address::generate(&env); let expiry_ledger = env.ledger().sequence() + 1000; - // Initialize once client.initialize(&creator, &expiry_ledger, &recovery); + client.record_payment(&100, &asset); - // Try to initialize again - should panic - client.initialize(&creator, &expiry_ledger, &recovery); + let status = client.get_status(); + assert_eq!(status, AccountStatus::PaymentReceived); } #[test] - fn test_record_payment() { + fn test_multiple_payments() { let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, EphemeralAccountContract); let client = EphemeralAccountContractClient::new(&env, &contract_id); let creator = Address::generate(&env); let recovery = Address::generate(&env); - let asset = Address::generate(&env); + let asset1 = Address::generate(&env); + let asset2 = Address::generate(&env); let expiry_ledger = env.ledger().sequence() + 1000; - // Initialize client.initialize(&creator, &expiry_ledger, &recovery); - // Record payment - client.record_payment(&100, &asset); + client.record_payment(&100, &asset1); + let info = client.get_info(); + assert_eq!(info.payment_count, 1); + + client.record_payment(&50, &asset2); + let info = client.get_info(); + assert_eq!(info.payment_count, 2); - // Verify status changed let status = client.get_status(); assert_eq!(status, AccountStatus::PaymentReceived); } #[test] - #[should_panic(expected = "Error(Contract, #3)")] // PaymentAlreadyReceived - fn test_double_payment() { + fn test_sweep_single_asset() { let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, EphemeralAccountContract); let client = EphemeralAccountContractClient::new(&env, &contract_id); let creator = Address::generate(&env); let recovery = Address::generate(&env); let asset = Address::generate(&env); + let destination = Address::generate(&env); let expiry_ledger = env.ledger().sequence() + 1000; - // Initialize and record first payment client.initialize(&creator, &expiry_ledger, &recovery); client.record_payment(&100, &asset); - // Try second payment - should panic - client.record_payment(&50, &asset); + let auth_sig = BytesN::from_array(&env, &[0u8; 64]); + client.sweep(&destination, &auth_sig); + + let status = client.get_status(); + assert_eq!(status, AccountStatus::Swept); } #[test] - fn test_sweep() { + #[should_panic(expected = "Error(Contract, #13)")] // DuplicateAsset + fn test_duplicate_asset() { let env = Env::default(); + env.mock_all_auths(); let contract_id = env.register_contract(None, EphemeralAccountContract); let client = EphemeralAccountContractClient::new(&env, &contract_id); let creator = Address::generate(&env); let recovery = Address::generate(&env); let asset = Address::generate(&env); - let destination = Address::generate(&env); let expiry_ledger = env.ledger().sequence() + 1000; - // Setup client.initialize(&creator, &expiry_ledger, &recovery); client.record_payment(&100, &asset); + client.record_payment(&50, &asset); // Should fail - duplicate asset + } - // Create dummy auth signature - let auth_sig = BytesN::from_array(&env, &[0u8; 64]); + #[test] + #[should_panic(expected = "Error(Contract, #14)")] // TooManyPayments + fn test_too_many_assets() { + let env = Env::default(); + env.mock_all_auths(); + let contract_id = env.register_contract(None, EphemeralAccountContract); + let client = EphemeralAccountContractClient::new(&env, &contract_id); - // Execute sweep - client.sweep(&destination, &auth_sig); + let creator = Address::generate(&env); + let recovery = Address::generate(&env); + let expiry_ledger = env.ledger().sequence() + 1000; - // Verify status - let status = client.get_status(); - assert_eq!(status, AccountStatus::Swept); + client.initialize(&creator, &expiry_ledger, &recovery); + + // Add 10 payments (should work) + for i in 0..10 { + let asset = Address::generate(&env); + client.record_payment(&(100 + i as i128), &asset); + } + + // 11th should fail + let asset = Address::generate(&env); + client.record_payment(&200, &asset); } #[test] - fn test_expiration() { + fn test_sweep_multiple_assets() { let env = Env::default(); env.mock_all_auths(); - let contract_id = env.register_contract(None, EphemeralAccountContract); let client = EphemeralAccountContractClient::new(&env, &contract_id); let creator = Address::generate(&env); let recovery = Address::generate(&env); - let expiry_ledger = env.ledger().sequence() + 10; + let destination = Address::generate(&env); + let expiry_ledger = env.ledger().sequence() + 1000; - // Initialize client.initialize(&creator, &expiry_ledger, &recovery); - // Check not expired yet - assert_eq!(client.is_expired(), false); + // Record 3 different assets + let asset1 = Address::generate(&env); + let asset2 = Address::generate(&env); + let asset3 = Address::generate(&env); - // Advance ledger past expiry - env.ledger().set_sequence_number(expiry_ledger + 1); + client.record_payment(&100, &asset1); + client.record_payment(&200, &asset2); + client.record_payment(&300, &asset3); - // Check is expired - assert_eq!(client.is_expired(), true); + let info = client.get_info(); + assert_eq!(info.payment_count, 3); + assert_eq!(info.payments.len(), 3); - // Execute expiration - client.expire(); + // Sweep all + let auth_sig = BytesN::from_array(&env, &[0u8; 64]); + client.sweep(&destination, &auth_sig); - // Verify status - let status = client.get_status(); - assert_eq!(status, AccountStatus::Expired); + assert_eq!(client.get_status(), AccountStatus::Swept); } #[test] - fn test_get_info() { + fn test_multi_payment_events() { let env = Env::default(); + env.mock_all_auths(); let contract_id = env.register_contract(None, EphemeralAccountContract); let client = EphemeralAccountContractClient::new(&env, &contract_id); let creator = Address::generate(&env); let recovery = Address::generate(&env); - let asset = Address::generate(&env); let expiry_ledger = env.ledger().sequence() + 1000; - // Initialize and record payment client.initialize(&creator, &expiry_ledger, &recovery); - client.record_payment(&100, &asset); - // Get info - let info = client.get_info(); + let asset1 = Address::generate(&env); + let asset2 = Address::generate(&env); + + // First payment should emit PaymentReceived + client.record_payment(&100, &asset1); + + // Second payment should emit MultiPaymentReceived + client.record_payment(&200, &asset2); - // Verify - assert_eq!(info.creator, creator); - assert_eq!(info.status, AccountStatus::PaymentReceived); - assert_eq!(info.expiry_ledger, expiry_ledger); - assert_eq!(info.payment_received, true); - assert_eq!(info.payment_amount, Some(100)); + // Verify events were published (check env.events()) } -} \ No newline at end of file +} diff --git a/contracts/ephemeral_account/test_snapshots/test/test/test_duplicate_asset.1.json b/contracts/ephemeral_account/test_snapshots/test/test/test_duplicate_asset.1.json new file mode 100644 index 0000000..6d77eb2 --- /dev/null +++ b/contracts/ephemeral_account/test_snapshots/test/test/test_duplicate_asset.1.json @@ -0,0 +1,245 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 1000 + }, + { + "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_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": "Creator" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ExpiryLedger" + } + ] + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Initialized" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "Payments" + } + ] + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RecoveryAddress" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Status" + } + ] + }, + "val": { + "u32": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_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/ephemeral_account/test_snapshots/test/test/test_initialize.1.json b/contracts/ephemeral_account/test_snapshots/test/test/test_initialize.1.json new file mode 100644 index 0000000..6f3db46 --- /dev/null +++ b/contracts/ephemeral_account/test_snapshots/test/test/test_initialize.1.json @@ -0,0 +1,196 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 1000 + }, + { + "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_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": "Creator" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ExpiryLedger" + } + ] + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Initialized" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "RecoveryAddress" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Status" + } + ] + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_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/ephemeral_account/test_snapshots/test/test/test_multi_payment_events.1.json b/contracts/ephemeral_account/test_snapshots/test/test/test_multi_payment_events.1.json new file mode 100644 index 0000000..c4e3c3d --- /dev/null +++ b/contracts/ephemeral_account/test_snapshots/test/test/test_multi_payment_events.1.json @@ -0,0 +1,322 @@ +{ + "generators": { + "address": 5, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 1000 + }, + { + "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_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": "Creator" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ExpiryLedger" + } + ] + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Initialized" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "Payments" + } + ] + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 200 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RecoveryAddress" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Status" + } + ] + }, + "val": { + "u32": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_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": "0000000000000000000000000000000000000000000000000000000000000001", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "multi_pay" + } + ], + "data": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 200 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/ephemeral_account/test_snapshots/test/test/test_multiple_payments.1.json b/contracts/ephemeral_account/test_snapshots/test/test/test_multiple_payments.1.json new file mode 100644 index 0000000..6b658be --- /dev/null +++ b/contracts/ephemeral_account/test_snapshots/test/test/test_multiple_payments.1.json @@ -0,0 +1,284 @@ +{ + "generators": { + "address": 5, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 1000 + }, + { + "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_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": "Creator" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ExpiryLedger" + } + ] + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Initialized" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "Payments" + } + ] + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 50 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RecoveryAddress" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Status" + } + ] + }, + "val": { + "u32": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_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/ephemeral_account/test_snapshots/test/test/test_record_payment.1.json b/contracts/ephemeral_account/test_snapshots/test/test/test_record_payment.1.json new file mode 100644 index 0000000..6d77eb2 --- /dev/null +++ b/contracts/ephemeral_account/test_snapshots/test/test/test_record_payment.1.json @@ -0,0 +1,245 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 1000 + }, + { + "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_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": "Creator" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ExpiryLedger" + } + ] + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Initialized" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "Payments" + } + ] + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RecoveryAddress" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Status" + } + ] + }, + "val": { + "u32": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_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/ephemeral_account/test_snapshots/test/test/test_sweep_multiple_assets.1.json b/contracts/ephemeral_account/test_snapshots/test/test/test_sweep_multiple_assets.1.json new file mode 100644 index 0000000..a89b0cf --- /dev/null +++ b/contracts/ephemeral_account/test_snapshots/test/test/test_sweep_multiple_assets.1.json @@ -0,0 +1,333 @@ +{ + "generators": { + "address": 7, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 1000 + }, + { + "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_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": "Creator" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ExpiryLedger" + } + ] + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Initialized" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "Payments" + } + ] + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 200 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 300 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RecoveryAddress" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Status" + } + ] + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "vec": [ + { + "symbol": "SweptTo" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_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/ephemeral_account/test_snapshots/test/test/test_sweep_single_asset.1.json b/contracts/ephemeral_account/test_snapshots/test/test/test_sweep_single_asset.1.json new file mode 100644 index 0000000..856e9ea --- /dev/null +++ b/contracts/ephemeral_account/test_snapshots/test/test/test_sweep_single_asset.1.json @@ -0,0 +1,258 @@ +{ + "generators": { + "address": 5, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 1000 + }, + { + "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_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": "Creator" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ExpiryLedger" + } + ] + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Initialized" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "Payments" + } + ] + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RecoveryAddress" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Status" + } + ] + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "vec": [ + { + "symbol": "SweptTo" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_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/ephemeral_account/test_snapshots/test/test/test_too_many_assets.1.json b/contracts/ephemeral_account/test_snapshots/test/test/test_too_many_assets.1.json new file mode 100644 index 0000000..ff2fcf0 --- /dev/null +++ b/contracts/ephemeral_account/test_snapshots/test/test/test_too_many_assets.1.json @@ -0,0 +1,578 @@ +{ + "generators": { + "address": 14, + "nonce": 0 + }, + "auth": [ + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "u32": 1000 + }, + { + "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_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": "Creator" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ExpiryLedger" + } + ] + }, + "val": { + "u32": 1000 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Initialized" + } + ] + }, + "val": { + "bool": true + } + }, + { + "key": { + "vec": [ + { + "symbol": "Payments" + } + ] + }, + "val": { + "map": [ + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 100 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 101 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 102 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 103 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 104 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 105 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 106 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 107 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXI7N" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 108 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYRE5" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + }, + { + "key": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + }, + "val": { + "map": [ + { + "key": { + "symbol": "amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 109 + } + } + }, + { + "key": { + "symbol": "asset" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2ZMN" + } + }, + { + "key": { + "symbol": "timestamp" + }, + "val": { + "u64": 0 + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RecoveryAddress" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Status" + } + ] + }, + "val": { + "u32": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_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