diff --git a/.gitignore b/.gitignore index 3bd528b..8ea0e95 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,5 @@ deployments/*.json # OS .DS_Store + +packages/video diff --git a/README.md b/README.md index 54a841e..82d0a83 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,18 @@ Sender and receiver stay public and verifiable on-chain. Only the amount moves i +
+ +

Watch the launch demo

+ + + Watch the Lucent launch demo on YouTube + + +

Watch on YouTube — a short animated walkthrough of shielding USDC, confidential transfers, payroll, escrow, and selective disclosure.

+ +
+ Balances are Pedersen commitments on the Grumpkin curve. Every register, withdraw, and transfer carries an UltraHonk zero-knowledge proof, generated in the browser and verified natively on-chain by Soroban — no off-chain @@ -140,13 +152,24 @@ salary stays decryptable to them and opaque to everyone else. **PrivateEscrow** is custodial: each escrow deploys its own **instance contract**, giving it its own isolated confidential account (a confidential balance is keyed by contract address, so custody requires a dedicated address -per escrow). Funding an instance is two on-chain calls, not one — -`store_payout_proofs` stores the two pre-generated payout proofs -(instance→recipient, instance→depositor), then `fund` registers the instance -and transfers the amount in, refusing to run until the payout proofs are -already stored. They're split because all four proofs together (register + -transfer-in + both payout proofs, each a ~14KB UltraHonk proof) exceed what -fits in one Soroban transaction. +per escrow). Funding takes four on-chain calls: + +1. `prepare_funding` stores the exact registration and transfer-in inputs. +2. `store_payout_proof(true, …)` verifies the recipient payout against the future funded commitment. +3. `store_payout_proof(false, …)` verifies the depositor refund against the same commitment. +4. `fund()` atomically registers the instance, transfers the funds in, and merges once. + +Each payout call also supplies the remaining balance blinding factor. The token +checks that the remaining commitment opens to zero, so a partial-transfer proof +cannot settle an escrow. Amounts remain confidential. + +The updated payout interface requires redeploying the token, escrow instance +WASM, and factory together before using the updated SDK/app. Existing deployed +instances retain their previous interface. + +No funds move until both proofs pass. Re-preparing clears both validated proofs. +Separate calls keep the proof payloads within Soroban's transaction size limit. +Settlement spends the fixed commitment without merging unsolicited later credits. At settlement, the instance's own state machine (created → funded → completed → released / disputed / refunded / cancelled) submits exactly the @@ -224,9 +247,10 @@ cargo test --manifest-path contracts/Cargo.toml | Crate | Coverage | Tests | |---|---|---| +| `contracts/token` | Escrow preflight PI parity, zero-balance opening, partial-payout rejection, malformed inputs and verifier rejection | 6 | | `contracts/payroll` | State machine, employer auth, atomic batch payout, cancel paths | 10 | -| `contracts/escrow-instance` | Every state transition, release-window timing, arbiter vs. no-arbiter branches, auth, the two-step `store_payout_proofs` → `fund` guard | 18 | -| `contracts/escrow-factory` | Deploys a real instance and drives it through `store_payout_proofs` → `fund` → `mark_completed` → `release` | 1 | +| `contracts/escrow-instance` | Every state transition, release-window timing, arbiter vs. no-arbiter branches, auth, pre-funding proof validation and unsolicited-credit regressions | 24 | +| `contracts/escrow-factory` | Deploys a real instance and drives it through preparation → proof validation → funding → release | 1 | | `contracts/policy` | Allowlist add/remove/is_authorized round-trip, admin auth rejection | 3 | ## Deploying @@ -262,7 +286,7 @@ A full end-to-end walkthrough, real proofs on testnet: 2. **Send** — confidential transfer to a second registered account. 3. **Payroll** — create a template of employees, open + confirm a run, enter salaries, execute; then **Auditor** decrypts every salary amount. -4. **Escrow** — deploy + fund an escrow (two wallet confirmations); walk it +4. **Escrow** — deploy + fund an escrow (four funding confirmations); walk it through mark-completed → release (or dispute → resolve). 5. **Selective disclosure** — mint a request on the Verify screen, disclose the matching transfer from Home's activity feed, verify the returned diff --git a/contracts/Cargo.lock b/contracts/Cargo.lock index 745af6b..c83a306 100644 --- a/contracts/Cargo.lock +++ b/contracts/Cargo.lock @@ -311,6 +311,7 @@ version = "0.1.0" dependencies = [ "soroban-sdk", "stellar-access", + "stellar-contract-utils", "stellar-macros", "stellar-tokens", ] diff --git a/contracts/Cargo.toml b/contracts/Cargo.toml index 658f3f7..883e4a5 100644 --- a/contracts/Cargo.toml +++ b/contracts/Cargo.toml @@ -10,8 +10,9 @@ license = "MIT" # The confidential token, access-control, and proc-macro crates are consumed as # git dependencies from the `feat/confidential-verifier-ultrahonk` branch of # OpenZeppelin/stellar-contracts (they are NOT published to crates.io). Cargo.lock -# pins the exact resolved commit; this branch was validated at rev 539968f. Run -# `cargo update -p stellar-tokens` to move to the branch tip. +# pins the exact resolved commit; this branch was validated at rev 539968f. +# Do not update independently of SDK/circuits/VKs: newer branch revisions change +# the proof protocol. See ../UPSTREAM_RECONCILIATION.md. # # Transitive deps (soroban-poseidon, stellar-contract-utils, stellar-governance, # and the pinned `ultrahonk-soroban-verifier` git rev) are resolved through that @@ -25,6 +26,7 @@ soroban-sdk = { version = "26.0.0" } stellar-access = { git = "https://github.com/OpenZeppelin/stellar-contracts", branch = "feat/confidential-verifier-ultrahonk" } stellar-macros = { git = "https://github.com/OpenZeppelin/stellar-contracts", branch = "feat/confidential-verifier-ultrahonk" } stellar-tokens = { git = "https://github.com/OpenZeppelin/stellar-contracts", branch = "feat/confidential-verifier-ultrahonk" } +stellar-contract-utils = { git = "https://github.com/OpenZeppelin/stellar-contracts", branch = "feat/confidential-verifier-ultrahonk" } # Soroban release profile: optimize for wasm code size and determinism. [profile.release] diff --git a/contracts/escrow-factory/src/test.rs b/contracts/escrow-factory/src/test.rs index fad4255..9ef7d1b 100644 --- a/contracts/escrow-factory/src/test.rs +++ b/contracts/escrow-factory/src/test.rs @@ -23,11 +23,25 @@ impl MockToken { } pub fn confidential_transfer(e: &Env, from: Address, to: Address, _data: Bytes) { from.require_auth(); - let mut log: Vec<(Address, Address)> = - e.storage().instance().get(&symbol_short!("xfers")).unwrap_or(Vec::new(e)); + let mut log: Vec<(Address, Address)> = e + .storage() + .instance() + .get(&symbol_short!("xfers")) + .unwrap_or(Vec::new(e)); log.push_back((from, to)); e.storage().instance().set(&symbol_short!("xfers"), &log); } + pub fn verify_escrow_payout( + _e: &Env, + _register_data: Bytes, + _auditor_id: u32, + transfer_in: Bytes, + _to: Address, + data: Bytes, + _remaining_blinding: soroban_sdk::BytesN<32>, + ) -> bool { + !data.is_empty() && data == transfer_in + } pub fn merge(_e: &Env, account: Address) { account.require_auth(); } @@ -59,14 +73,21 @@ fn create_escrow_deploys_a_working_instance() { // through fund -> mark_completed -> release. let escrow = instance::Client::new(&e, &addr); let blob = Bytes::from_array(&e, &[7u8; 8]); - escrow.store_payout_proofs(&blob, &blob); - escrow.fund(&blob, &0u32, &blob); + escrow.prepare_funding(&blob, &0u32, &blob); + escrow.store_payout_proof(&true, &blob, &soroban_sdk::BytesN::from_array(&e, &[0; 32])); + escrow.store_payout_proof( + &false, + &blob, + &soroban_sdk::BytesN::from_array(&e, &[0; 32]), + ); + escrow.fund(); escrow.mark_completed(&String::from_str(&e, "ipfs://x")); escrow.release(); assert_eq!(escrow.get_escrow().state, instance::EscrowState::Released); // Second escrow gets a distinct address. - let (id2, addr2) = factory.create_escrow(&depositor, &recipient, &Some(recipient.clone()), &10u64); + let (id2, addr2) = + factory.create_escrow(&depositor, &recipient, &Some(recipient.clone()), &10u64); assert_eq!(id2, 2); assert_ne!(addr, addr2); } diff --git a/contracts/escrow-factory/test_snapshots/test/create_escrow_deploys_a_working_instance.1.json b/contracts/escrow-factory/test_snapshots/test/create_escrow_deploys_a_working_instance.1.json index 5ca74fa..bf5136d 100644 --- a/contracts/escrow-factory/test_snapshots/test/create_escrow_deploys_a_working_instance.1.json +++ b/contracts/escrow-factory/test_snapshots/test/create_escrow_deploys_a_working_instance.1.json @@ -42,11 +42,14 @@ "function": { "contract_fn": { "contract_address": "CDDMUEDPF7Z22WY7BL24MYJZWHJK7OPKG5UN4MDPDIRROZZUBU6H3OPS", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "0707070707070707" }, + { + "u32": 0 + }, { "bytes": "0707070707070707" } @@ -64,20 +67,60 @@ "function": { "contract_fn": { "contract_address": "CDDMUEDPF7Z22WY7BL24MYJZWHJK7OPKG5UN4MDPDIRROZZUBU6H3OPS", - "function_name": "fund", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "0707070707070707" }, { - "u32": 0 + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CDDMUEDPF7Z22WY7BL24MYJZWHJK7OPKG5UN4MDPDIRROZZUBU6H3OPS", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false }, { "bytes": "0707070707070707" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + { + "function": { + "contract_fn": { + "contract_address": "CDDMUEDPF7Z22WY7BL24MYJZWHJK7OPKG5UN4MDPDIRROZZUBU6H3OPS", + "function_name": "fund", + "args": [] + } + }, "sub_invocations": [ { "function": { @@ -320,7 +363,7 @@ ] }, "val": { - "bytes": "44c5852692374c24c5fe2cc6c9e7fcfa936418365ae352266182743794501306" + "bytes": "1f938006aa0e0e65dc09716be4054ea5d591e2c9e3a17ca8d9ac0d479a89ca0d" } }, { @@ -413,7 +456,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": "4270020994084947596" + "nonce": "4837995959683129791" } }, "durability": "temporary", @@ -444,6 +487,46 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "6277191135259896685" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "ledger_key_nonce": { + "nonce": "8370022561469687789" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, @@ -453,7 +536,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": "4837995959683129791" + "nonce": "4270020994084947596" } }, "durability": "temporary", @@ -476,7 +559,7 @@ "val": { "contract_instance": { "executable": { - "wasm": "44c5852692374c24c5fe2cc6c9e7fcfa936418365ae352266182743794501306" + "wasm": "1f938006aa0e0e65dc09716be4054ea5d591e2c9e3a17ca8d9ac0d479a89ca0d" }, "storage": [ { @@ -581,7 +664,7 @@ "val": { "contract_instance": { "executable": { - "wasm": "44c5852692374c24c5fe2cc6c9e7fcfa936418365ae352266182743794501306" + "wasm": "1f938006aa0e0e65dc09716be4054ea5d591e2c9e3a17ca8d9ac0d479a89ca0d" }, "storage": [ { @@ -706,21 +789,21 @@ "ext": "v0", "cost_inputs": { "ext": "v0", - "n_instructions": 1731, - "n_functions": 36, + "n_instructions": 2099, + "n_functions": 42, "n_globals": 4, "n_table_entries": 0, - "n_types": 17, + "n_types": 20, "n_data_segments": 1, "n_elem_segments": 0, - "n_imports": 14, - "n_exports": 17, - "n_data_segment_bytes": 341 + "n_imports": 16, + "n_exports": 18, + "n_data_segment_bytes": 413 } } }, - "hash": "44c5852692374c24c5fe2cc6c9e7fcfa936418365ae352266182743794501306", - "code": "0061736d010000000166116000017e60017e017e60027e7e017e60037e7e7e017e60027f7e0060017f017e60017f0060027e7e0060037f7f7f0060047e7e7e7e017e60017e017f60017f017f60047e7e7e7e0060027f7f017e60037e7e7e0060047f7f7f7f017e60057e7e7e7e7e017e02550e016901300001016d016100090178013700000178013100020169015f00010161013000010162016a00020164015f0003017801340000016c01310002016c01300002016c015f0003017601670002016d0139000303252404050a010b06050704040c080d0e060007050f080410000000010300010000000200050605030100110621047f01418080c0000b7f0041d882c0000b7f0041d882c0000b7f0041e082c0000b07f10111066d656d6f727902000d5f5f636f6e7374727563746f7200230663616e63656c002512636c61696d5f61667465725f77696e646f77002612646973707574655f776974685f70726f6f6600270466756e6400280a6765745f657363726f7700290e6d61726b5f636f6d706c65746564002a0772656c65617365002b147265736f6c76655f746f5f6465706f7369746f72002c147265736f6c76655f746f5f726563697069656e74002d1373746f72655f7061796f75745f70726f6f6673002e0774696d656f7574002f05746f6b656e001d015f03010a5f5f646174615f656e6403020b5f5f686561705f6261736503030c01010aea1b244902017f017e027e2001a741ff0171220241c0004704402002410647044042012103428390808080010c020b20014208880c010b200110000b210120002003370300200020013703080bbb0102017f017e230041106b2201240002400240024002400240200041ff017141016b0e03010203000b200141bd81c000410510210c030b200141c281c000410610210c020b200141c881c000410c10210c010b200141d481c000410b10210b0240200128020045044020012903082102230041106b2200240020002002370308200041086a4101101a21022001420037030020012002370308200041106a2400200129030821022001290300500d010b000b200141106a240020020b0b0020004202100a4201510b08002000420210090b08002000100f10100b0c004101100f2000101410150bd80102027f077e230041d0006b220124002000290308210320002903002104200141406b2202200029033010220240024020012802400d002001290348210520022000290320102220012802400d002001290348210620003100382107200029031821082000290310210920022000290328102220012802404101470d010b000b2001200129034837033820012008370328200120093703202001200637031820012005370310200120074220864204843703302001200342022004a71b37030841f080c0004107200141086a41071020200141d0006a24000b0b00200020014202100b1a0b0a002000100f200110150b350020014202520440200142ff018342cd00520440200042023703000f0b20002001370308200042013703000f0b200042003703000bab0102027f017e230041306b22042400200441186a41a881c00041151019200428021841014704402004290320210620042003370310200420023703082004200137030003402005411846044041002105034020054118470440200441186a20056a200420056a290300370300200541086a21050c010b0b20002006200441186a4103101a101b200441306a24000f05200441186a20056a4202370300200541086a21050c010b000b000b000bc40102037f017e027e0240200241094b0d00200221042001210503402006420886420e842004450d021a027f410120052d0000220341df00460d001a0240200341306b41ff0171410a4f0440200341c1006b41ff0171411a490d01200341e1006b41ff0171411a4f0d042003413b6b0c020b2003412e6b0c010b200341356b0bad42ff01832006420686842106200441016b2104200541016a21050c000b000b2001ad4220864204842002ad42208642048410060b210620004200370300200020063703080b16002000ad4220864204842001ad422086420484100c0b1500200020012002100742ff01834202520440000b0be00202027f087e230041d0006b2201240002404101100f220310100440200310112103034020024138470440200141086a20026a4202370300200241086a21020c010b0b0240200342ff018342cc00520d0020034284808080808e8008200141086aad4220864204844284808080f00010011a200141406b220220012903081017200129034022044202510d002001290348210520022001290310100e20012802400d002001290348210620022001290318100e20012802400d002001290320220742ff018342cd00520d002001290328220842ff018342cd00520d002001290330220342ff0183420452200342ffffffffef0056720d002001290348210920022001290338100e20012802404101470d020b000b000b2001290348210a200020063703302000200a3703282000200937032020002008370318200020073703102000200537030820002004370300200020034220883c0038200141d0006a24000b5a02017f017e230041106b220024000240024020004100100f22011010047e20011011220142ff018342cd00520d012000200137030842010542000b3703000c010b000b2000280200450440000b2000290308200041106a24000b6502027f037e230041106b22022400101d21042002100222053703004202210641012103034020030440200341016b2103200521060c010b0b200220063703082004428ed4ecdbaa06200241086a4101101a101b20042005200120001018200241106a24000b4f02017f027e230041106b220124002001200029030022033703004202210241012100034020000440200041016b2100200321020c010b0b20012002370308200141086a4101101a200141106a24000b280020012003470440000b2000ad4220864204842002ad4220864204842001ad422086420484100d0b3801017f230041106b22032400200320012002101920002003280200047e4201052000200329030837030842000b370300200341106a24000b2f00200142ffffffffffffffff0058047e200142088642068405200110040b210120004200370300200020013703080bc70102017f027e230041406a2205240002400240200042ff018342cd0052200142ff018342cd005272200242ff018342cd0052720d00200520031017200529030022064202510d002005290308210720052004100e20052802004101460d0020052903082104102421034100100f20001015200320047c22002003540d012005200237031820052001370310200541003a0038200520073703082005200637030020054200370330200520003703282005200337032020051013200541406b240042020f0b000b000b2b02017e017f10082200a741ff017122014106470440200141c000460440200010000f0b000b20004208880b6102027f017e230041d0006b22002400200041086a2201101c200029031810051a20002d0040047f410405200041063a004020011013418080c000101f41044100200041c8006a4100102010031a41000b4103742903808240200041d0006a24000b870102017f037e230041406a220024002000101c2000290318220110051a027f410420002d00384102470d001a1024210202402000290330220342a77b5804402002200342d8047c5a0d0141050c020b000b410720002802000d001a200041033a003820001013410210302001101e41f881c000103141000b4103742903808240200041406b24000bb20102017f037e230041d0006b22012400200042ff018342c9005104402001101c2001290318220310051a027f410420012d00384102470d001a1024210202402001290330220442a77b5804402002200442d8047c5a0d0141050c020b000b41062001290300500d001a200141043a00382001101341e881c000101f2001200037034820012003370340419480c0004102200141406b4102102010031a41000b4103742903808240200141d0006a24000f0b000bb90202037f037e230041f0006b220424000240200042ff018342c80052200142ff018342045272200242ff018342c80052724504402004101c2004290310220810051a4104210320042d00380d01410a210341021012450d0141031012450d01101d210610022107200420003703502004200142848080807083370348200420073703404100210303402003411846044041002103034020034118470440200441d8006a20036a200441406b20036a290300370300200341086a21030c010b0b2006428eeeea9ceee5aaef00200441d8006a22054103101a101b20062008200720021018200441013a0038200410134100210341e081c000101f4104410020054100102010031a0c0305200441d8006a20036a4202370300200341086a21030c010b000b000b000b20034103742903808240200441f0006a24000b1e02017f017e230041406a220024002000101c20001014200041406b24000b870102017f027e230041d0006b22012400200042ff018342c9005104402001101c2001290318220210051a20012d0038410146047f200141023a0038200110243703302001101341a880c000101f2001200037034820012002370340419480c0004102200141406b4102102010031a41000541040b4103742903808240200141d0006a24000f0b000b5e02017f017e230041406a220024002000101c200029031010051a20002d003841016b41ff017141014d047f200041033a003820001013410210302000290318101e41f881c000103141000541040b4103742903808240200041406b24000b6602017f017e230041406a220024002000101c027f410620002802004101470d001a200029030810051a410420002d00384104470d001a200041053a003820001013410310302000290310101e41f081c000103141000b4103742903808240200041406b24000b6602017f017e230041406a220024002000101c027f410620002802004101470d001a200029030810051a410420002d00384104470d001a200041033a003820001013410210302000290318101e41f881c000103141000b4103742903808240200041406b24000b5c01017f230041406a22022400200042ff018342c80052200142ff018342c80052724504402002101c200229031010051a20022d0038047f41040541022000101641032001101641000b4103742903808240200241406b24000f0b000b6502017f017e230041406a220024002000101c2000290310220110051a027f410420002d00384101470d001a410810242000290328540d001a200041053a003820001013410310302001101e41f081c000103141000b4103742903808240200041406b24000b5a02017f017e230041106b220124000240024020012000100f22021010047e20021011220242ff018342c800520d012001200237030842010542000b3703000c010b000b2001280200450440000b2001290308200141106a24000b2801017f230041106b220124002000101f41044100200141086a4100102010031a200141106a24000b0bdf020100418080c0000bd5020ea91ac72a3a9b28627970726f6f665f7572690008001000020000000a00100009000000000000000ea99aab712dd32861726269746572636f6d706c657465645f6174637265617465645f61746465706f7369746f72726563697069656e74737461746574696d656f75745f617400003000100007000000370010000c000000430010000a0000004d0010000900000056001000090000005f00100005000000640010000a000000636f6e666964656e7469616c5f7472616e73666572546f6b656e457363726f7752656c6561736550726f6f66526566756e6450726f6f66000ea99acefa0a00000ea99aeb35eea6000ea99acefaaade000ea98a9b6aacde000200000000000000030000000100000003000000020000000300000003000000030000000400000003000000050000000300000006000000030000000700000003000000080000000300000009000000030000000a00c3200e636f6e7472616374737065637630000000040000000000000000000000054572726f720000000000000a000000000000000c4e6f744465706f7369746f7200000001000000000000000c4e6f74526563697069656e7400000002000000000000000a4e6f74417262697465720000000000030000000000000008426164537461746500000004000000000000001352656c6561736557696e646f77416374697665000000000500000000000000094e6f4172626974657200000000000006000000000000000a417262697465725365740000000000070000000000000008546f6f4561726c790000000800000000000000084e6f74466f756e6400000009000000436066756e6460207761732063616c6c6564206265666f7265206073746f72655f7061796f75745f70726f6f66736020e280942073656520696e7374616e63652e72732e00000000135061796f757450726f6f66734d697373696e67000000000a000000010000002152656164206d6f64656c206f6620616e20657363726f7720696e7374616e63652e0000000000000000000006457363726f7700000000000700000000000000076172626974657200000003e800000013000000000000000c636f6d706c657465645f617400000006000000000000000a637265617465645f617400000000000600000000000000096465706f7369746f72000000000000130000000000000009726563697069656e740000000000001300000000000000057374617465000000000007d00000000b457363726f77537461746500000000000000000a74696d656f75745f617400000000000600000003000000414c6966656379636c65206f6620616e20657363726f772c206d6972726f72696e672074686520536f6c6964697479207265666572656e63652065786163746c792e000000000000000000000b457363726f77537461746500000000070000001e5368656c6c20637265617465642c206e6f74207965742066756e6465642e000000000007437265617465640000000000000000274465706f7369746f72206c6f636b65642066756e64733b2074696d656f7574206163746976652e000000000646756e64656400000000000100000042526563697069656e74206d61726b65642064656c69766572793b2072656c656173652077696e646f77206163746976653b2074696d656f757420626c6f636b65642e000000000009436f6d706c65746564000000000000020000001846756e64732073656e7420746f20726563697069656e742e0000000852656c65617365640000000300000012417262697465722063616c6c656420696e2e0000000000084469737075746564000000040000001c46756e64732072657475726e656420746f206465706f7369746f722e00000008526566756e646564000000050000001943616e63656c6c6564206265666f72652066756e64696e672e0000000000000943616e63656c6c6564000000000000060000000500000000000000000000000646756e6465640000000000010000000666756e6465640000000000000000000200000005000000000000000000000008446973707574656400000001000000086469737075746564000000020000000000000002627900000000001300000000000000000000000970726f6f665f75726900000000000010000000000000000200000005000000000000000000000008526566756e6465640000000100000008726566756e64656400000000000000020000000500000000000000000000000852656c6561736564000000010000000872656c656173656400000000000000020000000500000000000000000000000943616e63656c6c6564000000000000010000000963616e63656c6c6564000000000000000000000200000005000000000000000000000009436f6d706c657465640000000000000100000009636f6d706c65746564000000000000020000000000000002627900000000001300000000000000000000000970726f6f665f75726900000000000010000000000000000200000000000001ca4c6f636b2066756e647320696e746f207468697320657363726f772e20546865206465706f7369746f723a0a2a20726567697374657273207468697320696e7374616e6365206173206120636f6e666964656e7469616c206163636f756e7420286072656769737465725f64617461600a6973207468652072656769737465722070726f6f6620666f722074686520696e7374616e63652773204772756d706b696e206964656e74697479292c20616e640a2a2060636f6e666964656e7469616c5f7472616e7366657260732074686520616d6f756e7420696e2028607472616e736665725f696e60292e0a5265717569726573206073746f72655f7061796f75745f70726f6f66736020746f206861766520616c7265616479206265656e2063616c6c656420e28094206046756e646564602069730a6f6e6c79206576657220726561636865642077697468206120636f6d706c6574652c20776f726b696e67207061796f75742d70726f6f662073657420616c726561647920696e0a706c6163652c20736f207468657265206973206e6f20726561636861626c652068616c662d66756e6465642073746174652e2053746174653a2043726561746564202d3e2046756e6465642e00000000000466756e6400000003000000000000000d72656769737465725f646174610000000000000e000000000000000a61756469746f725f6964000000000004000000000000000b7472616e736665725f696e000000000e00000001000003e90000000200000003000000000000000000000005746f6b656e000000000000000000000100000013000000000000003643616e63656c20616e20756e66756e646564207368656c6c2e2053746174653a2043726561746564202d3e2043616e63656c6c65642e00000000000663616e63656c00000000000000000001000003e90000000200000003000000000000006c4465706f7369746f722072656c656173657320746f2074686520726563697069656e742e2043616c6c61626c652066726f6d2046756e64656420286561726c7929206f720a436f6d706c6574656420286e6f726d616c292e2053746174653a202d3e2052656c65617365642e0000000772656c65617365000000000000000001000003e9000000020000000300000000000000804465706f7369746f72207265636c61696d732061207374696c6c2d6046756e6465646020657363726f772061667465722074696d656f75742e20426c6f636b6564206f6e6365207468650a726563697069656e74206d61726b7320636f6d706c657465642e2053746174653a2046756e646564202d3e20526566756e6465642e0000000774696d656f7574000000000000000001000003e9000000020000000300000000000000000000000a6765745f657363726f7700000000000000000001000007d000000006457363726f77000000000000000000794465706c6f7965642062792074686520666163746f72792e206074696d656f75745f7365636f6e64736020636f756e74732066726f6d206e6f773b2061667465722069742c207468650a6465706f7369746f72206d61792073656c662d726566756e64207768696c65207374696c6c206046756e646564602e0000000000000d5f5f636f6e7374727563746f72000000000000050000000000000005746f6b656e0000000000001300000000000000096465706f7369746f72000000000000130000000000000009726563697069656e740000000000001300000000000000076172626974657200000003e800000013000000000000000f74696d656f75745f7365636f6e64730000000006000000000000000000000060526563697069656e74206d61726b732064656c69766572793b20737461727473207468652072656c656173652077696e646f772c20626c6f636b732074696d656f75742e0a53746174653a2046756e646564202d3e20436f6d706c657465642e0000000e6d61726b5f636f6d706c65746564000000000001000000000000000970726f6f665f7572690000000000001000000001000003e900000002000000030000000000000070526563697069656e74206175746f2d636c61696d73207768656e207468657265206973206e6f206172626974657220616e64207468652072656c656173652077696e646f77206861730a657870697265642e2053746174653a20436f6d706c65746564202d3e2052656c65617365642e00000012636c61696d5f61667465725f77696e646f7700000000000000000001000003e90000000200000003000000000000006f526563697069656e7420657363616c6174657320746f207468652061726269746572206166746572207468652072656c656173652077696e646f772e20526571756972657320616e0a617262697465722e2053746174653a20436f6d706c65746564202d3e2044697370757465642e0000000012646973707574655f776974685f70726f6f66000000000001000000000000000970726f6f665f7572690000000000001000000001000003e9000000020000000300000000000001c753746f7265207468652074776f207072652d67656e657261746564207061796f75742070726f6f66732028696e7374616e636520e2869220726563697069656e742c0a696e7374616e636520e28692206465706f7369746f722920746865207374617465206d616368696e652077696c6c206c617465722073656c656374206265747765656e2e0a53706c6974206f75742066726f6d206066756e646020626563617573652062756e646c696e6720626f74682070726f6f667320616c6f6e6773696465207468650a726567697374657220616e64207472616e736665722d696e2070726f6f667320696e206f6e65207472616e73616374696f6e206578636565647320536f726f62616e27730a7065722d7472616e73616374696f6e2073697a65206365696c696e6720e2809420666f7572207e31344b4220556c747261486f6e6b2070726f6f667320697320746f6f206d7563680a666f7220612073696e676c652063616c6c2e204d7573742062652063616c6c6564206265666f7265206066756e64603b206861726d6c65737320746f2063616c6c20616761696e0a7768696c65207374696c6c2060437265617465646020286c6173742077726974652077696e73292e000000001373746f72655f7061796f75745f70726f6f66730000000002000000000000000d72656c656173655f70726f6f660000000000000e000000000000000c726566756e645f70726f6f660000000e00000001000003e900000002000000030000000000000049417262697465722072657475726e732074686520657363726f7720746f20746865206465706f7369746f722e2053746174653a204469737075746564202d3e20526566756e6465642e000000000000147265736f6c76655f746f5f6465706f7369746f720000000000000001000003e90000000200000003000000000000004841726269746572206177617264732074686520657363726f7720746f2074686520726563697069656e742e2053746174653a204469737075746564202d3e2052656c65617365642e000000147265736f6c76655f746f5f726563697069656e740000000000000001000003e90000000200000003001e11636f6e7472616374656e766d6574617630000000000000001a00000000006f0e636f6e74726163746d65746176300000000000000005727376657200000000000006312e39312e3100000000000000000008727373646b7665720000002f32362e312e3023313735616134313330366633383330353761386364666338346236386439333136363466633334650000530e636f6e74726163746d65746176300000000000000006636c6976657200000000002f32372e302e30233561376335666537363533306266343234383437376163383132666337353731343662393863633400" + "hash": "1f938006aa0e0e65dc09716be4054ea5d591e2c9e3a17ca8d9ac0d479a89ca0d", + "code": "0061736d01000000017a146000017e60017e017e60027e7e017e60037e7e7e017e60027f7e0060017f017e60017f0060027e7e0060027f7f017e60037f7f7f0060047e7e7e7e017e60027f7f0060017e017f60017f017f60077e7e7f7e7e7e7e017f60047e7e7e7e0060037e7e7e0060047f7f7f7f017e60057e7e7e7e7e017e60017e000261100169013000010164015f0003016d0161000a0178013700000178013100020169015f00010161013000010162013800010162016a0002017801340000016c01310002016c01300002016c01320002016c015f0003017601670002016d01390003032b2a040b050c01060d06050704040e08080f100600070511040912000000010013000103000000030009050605030100110621047f01418080c0000b7f0041a083c0000b7f0041a083c0000b7f0041a083c0000b07820212066d656d6f727902000d5f5f636f6e7374727563746f7200280663616e63656c002a12636c61696d5f61667465725f77696e646f77002b12646973707574655f776974685f70726f6f66002c0466756e64002d0a6765745f657363726f77002f0e6d61726b5f636f6d706c6574656400300f707265706172655f66756e64696e6700310772656c656173650032147265736f6c76655f746f5f6465706f7369746f720033147265736f6c76655f746f5f726563697069656e7400341273746f72655f7061796f75745f70726f6f6600350774696d656f7574003605746f6b656e0022015f03010a5f5f646174615f656e6403020b5f5f686561705f6261736503030c01010ad4212a4902017f017e027e2001a741ff0171220241c0004704402002410647044042012103428390808080010c020b20014208880c010b200110000b210120002003370300200020013703080b3501017e024020002001101222021013047e20021014220242ff018342c800520d012000200237030842010542000b3703000f0b000bee0102017f017e230041106b2201240002400240024002400240024002400240200041ff017141016b0e06010203040506000b200141d181c000410510270c060b200141d681c000410610270c050b200141dc81c000410c10270c040b200141e881c000410b10270c030b200141f381c000410c10270c020b200141ff81c000410910270c010b2001418882c000410a10270b0240200128020045044020012903082102230041106b2200240020002002370308200041086a4101101e21022001420037030020012002370308200041106a2400200129030821022001290300500d010b000b200141106a240020020b0b0020004202100b4201510b080020004202100a0b4202017e027f02404105101222011013047f20011014220142ff01834204520d012001422088a7210241010541000b210320002002360204200020033602000f0b000b08002000101210130b0c00410110122000101810190bd80102027f077e230041d0006b220124002000290308210320002903002104200141406b2202200029033010260240024020012802400d002001290348210520022000290320102620012802400d002001290348210620003100382107200029031821082000290310210920022000290328102620012802404101470d010b000b2001200129034837033820012008370328200120093703202001200637031820012005370310200120074220864204843703302001200342022004a71b37030841f080c0004107200141086a41071025200141d0006a24000b0b00200020014202100d1a0b0a0020001012200110190b350020014202520440200142ff018342cd00520440200042023703000f0b20002001370308200042013703000f0b200042003703000bd20102017f017e230041e0006b2207240041a881c0004114101d2108200720063703282007200537032020072004370318200720033703102007200137030020072002ad42208642048437030841002102037f2002413046047f41002102034020024130470440200741306a20026a200220076a290300370300200241086a21020c010b0b4101210202400240024020002008200741306a4106101e1001a741ff01710e020102000b000b410021020b200741e0006a2400200205200741306a20026a4202370300200241086a21020c010b0b0b2f02017f017e230041106b22022400200220002001103720022802004101460440000b2002290308200241106a24000b16002000ad4220864204842001ad422086420484100e0b920102027f017e230041306b2205240041bc81c0004115101d210620052003370310200520023703082005200137030003402004411846044041002104034020044118470440200541186a20046a200420056a290300370300200441086a21040c010b0b20002006200541186a4103101e1020200541306a240005200541186a20046a4202370300200441086a21040c010b0b0b1500200020012002100142ff01834202520440000b0be00202027f087e230041d0006b22012400024041011012220310130440200310142103034020024138470440200141086a20026a4202370300200241086a21020c010b0b0240200342ff018342cc00520d0020034284808080808e8008200141086aad4220864204844284808080f00010021a200141406b22022001290308101b200129034022044202510d002001290348210520022001290310101020012802400d002001290348210620022001290318101020012802400d002001290320220742ff018342cd00520d002001290328220842ff018342cd00520d002001290330220342ff0183420452200342ffffffffef0056720d002001290348210920022001290338101020012802404101470d020b000b000b2001290348210a200020063703302000200a3703282000200937032020002008370318200020073703102000200537030820002004370300200020034220883c0038200141d0006a24000b5a02017f017e230041106b220024000240024020004100101222011013047e20011014220142ff018342cd00520d012000200137030842010542000b3703000c010b000b2000280200450440000b2000290308200041106a24000b0c001022100320012000101f0b4f02017f027e230041106b220124002001200029030022033703004202210241012100034020000440200041016b2100200321020c010b0b20012002370308200141086a4101101e200141106a24000b280020012003470440000b2000ad4220864204842002ad4220864204842001ad422086420484100f0b2f00200142ffffffffffffffff0058047e200142088642068405200110050b210120004200370300200020013703080b3801017f230041106b22032400200320012002103720002003280200047e4201052000200329030837030842000b370300200341106a24000bc70102017f027e230041406a2205240002400240200042ff018342cd0052200142ff018342cd005272200242ff018342cd0052720d0020052003101b200529030022064202510d002005290308210720052004101020052802004101460d0020052903082104102921034100101220001019200320047c22002003540d012005200237031820052001370310200541003a0038200520073703082005200637030020054200370330200520003703282005200337032020051017200541406b240042020f0b000b000b2b02017e017f10092200a741ff017122014106470440200141c000460440200010000f0b000b20004208880b6102027f017e230041d0006b22002400200041086a22011021200029031810061a20002d0040047f410405200041063a004020011017418080c000102441044100200041c8006a4100102510041a41000b4103742903b88240200041d0006a24000b870102017f037e230041406a22002400200010212000290318220110061a027f410420002d00384102470d001a1029210202402000290330220342a77b5804402002200342d8047c5a0d0141050c020b000b410720002802000d001a200041033a003820001017410210382001102341b082c000103941000b4103742903b88240200041406b24000bb20102017f037e230041d0006b22012400200042ff018342c900510440200110212001290318220310061a027f410420012d00384102470d001a1029210202402001290330220442a77b5804402002200442d8047c5a0d0141050c020b000b41062001290300500d001a200141043a00382001101741a082c00010242001200037034820012003370340419480c0004102200141406b4102102510041a41000b4103742903b88240200141d0006a24000f0b000bbb0302037f057e23004180016b22002400200041106a10212000290320220410061a41042101024020002d00480d00410a210141021016450d0041031016450d00200041e8006a22014104101102402000280268450d0020002903702106200041086a10152000280208410171450d00200028020c21022001410610112000280268450d00200029037021071022210510032103200020063703602000200337035020002002ad4220864204843703584100210103402001411846044041002101034020014118470440200041e8006a20016a200041d0006a20016a290300370300200141086a21010c010b0b2005428eeeea9ceee5aaef00200041e8006a4103101e10202005200420032007101f200020033703504202210441012101034020010440200141016b2101200321040c010b0b200020043703682005428ed4ecdbaa06200041e8006a22024101101e102041041012102e41061012102e41051012102e200041013a0048200041106a101741002101419882c00010244104410020024100102510041a0c0305200041e8006a20016a4202370300200141086a21010c010b000b000b000b20014103742903b8824020004180016a24000b090020004202100c1a0b1e02017f017e230041406a220024002000102120001018200041406b24000b870102017f027e230041d0006b22012400200042ff018342c900510440200110212001290318220210061a20012d0038410146047f200141023a0038200110293703302001101741a880c00010242001200037034820012002370340419480c0004102200141406b4102102510041a41000541040b4103742903b88240200141d0006a24000f0b000b810101017f230041406a22032400200042ff018342c80052200142ff018342045272200242ff018342c800527245044020031021200329031010061a20032d0038047f41040541042000101a41051012200142848080807083101941062002101a41021012102e41031012102e41000b4103742903b88240200341406b24000f0b000b5e02017f017e230041406a2200240020001021200029031010061a20002d003841016b41ff017141014d047f200041033a003820001017410210382000290318102341b082c000103941000541040b4103742903b88240200041406b24000b6602017f017e230041406a2200240020001021027f410620002802004101470d001a200029030810061a410420002d00384104470d001a200041053a003820001017410310382000290310102341a882c000103941000b4103742903b88240200041406b24000b6602017f017e230041406a2200240020001021027f410620002802004101470d001a200029030810061a410420002d00384104470d001a200041033a003820001017410210382000290318102341b082c000103941000b4103742903b88240200041406b24000ba70202047f027e230041e0006b22032400024002404101410241002000a741ff017122041b20044101461b2205410246200142ff018342c8005272200242ff018342c80052720d00200210074280808080708342808080808004520d00200341106a10212003290320220810061a027f410420032d00480d001a200341d0006a220641041011410b20032802504101470d001a20032903582100200341086a10152003280208410171450d02200328020c21042006410610112003280250450d0220032903582107027f0240024020054101714504401022200020042007200820012002101c450d0141030c030b1022200020042007200329032820012002101c0d010b410c0c020b41020b2001101a41000b4103742903b88240200341e0006a24000f0b000b000b6502017f017e230041406a22002400200010212000290310220110061a027f410420002d00384101470d001a410810292000290328540d001a200041053a003820001017410310382001102341a882c000103941000b4103742903b88240200041406b24000bc40102037f017e027e0240200241094b0d00200221042001210503402006420886420e842004450d021a027f410120052d0000220341df00460d001a0240200341306b41ff0171410a4f0440200341c1006b41ff0171411a490d01200341e1006b41ff0171411a4f0d042003413b6b0c020b2003412e6b0c010b200341356b0bad42ff01832006420686842106200441016b2104200541016a21050c000b000b2001ad4220864204842002ad42208642048410080b210620004200370300200020063703080b2b02017f017e230041106b220124002001200010112001280200450440000b2001290308200141106a24000b2801017f230041106b220124002000102441044100200141086a4100102510041a200141106a24000b0ba7030100418080c0000b9d030ea91ac72a3a9b28627970726f6f665f7572690008001000020000000a00100009000000000000000ea99aab712dd32861726269746572636f6d706c657465645f6174637265617465645f61746465706f7369746f72726563697069656e74737461746574696d656f75745f617400003000100007000000370010000c000000430010000a0000004d0010000900000056001000090000005f00100005000000640010000a0000007665726966795f657363726f775f7061796f7574636f6e666964656e7469616c5f7472616e73666572546f6b656e457363726f7752656c6561736550726f6f66526566756e6450726f6f6652656769737465724461746141756469746f7249645472616e73666572496e0000000000000ea99acefa0a00000ea99aeb35eea6000ea99acefaaade000ea98a9b6aacde000200000000000000030000000100000003000000020000000300000003000000030000000400000003000000050000000300000006000000030000000700000003000000080000000300000009000000030000000a000000030000000b000000030000000c00af1f0e636f6e7472616374737065637630000000040000000000000000000000054572726f720000000000000c000000000000000c4e6f744465706f7369746f7200000001000000000000000c4e6f74526563697069656e7400000002000000000000000a4e6f74417262697465720000000000030000000000000008426164537461746500000004000000000000001352656c6561736557696e646f77416374697665000000000500000000000000094e6f4172626974657200000000000006000000000000000a417262697465725365740000000000070000000000000008546f6f4561726c790000000800000000000000084e6f74466f756e640000000900000034426f7468207061796f7574206272616e63686573206d757374206265207665726966696564206265666f7265206066756e64602e000000135061796f757450726f6f66734d697373696e67000000000a000000000000001246756e64696e674e6f74507265706172656400000000000b0000000000000012496e76616c69645061796f757450726f6f6600000000000c000000010000002152656164206d6f64656c206f6620616e20657363726f7720696e7374616e63652e0000000000000000000006457363726f7700000000000700000000000000076172626974657200000003e800000013000000000000000c636f6d706c657465645f617400000006000000000000000a637265617465645f617400000000000600000000000000096465706f7369746f72000000000000130000000000000009726563697069656e740000000000001300000000000000057374617465000000000007d00000000b457363726f77537461746500000000000000000a74696d656f75745f617400000000000600000003000000414c6966656379636c65206f6620616e20657363726f772c206d6972726f72696e672074686520536f6c6964697479207265666572656e63652065786163746c792e000000000000000000000b457363726f77537461746500000000070000001e5368656c6c20637265617465642c206e6f74207965742066756e6465642e000000000007437265617465640000000000000000274465706f7369746f72206c6f636b65642066756e64733b2074696d656f7574206163746976652e000000000646756e64656400000000000100000042526563697069656e74206d61726b65642064656c69766572793b2072656c656173652077696e646f77206163746976653b2074696d656f757420626c6f636b65642e000000000009436f6d706c65746564000000000000020000001846756e64732073656e7420746f20726563697069656e742e0000000852656c65617365640000000300000012417262697465722063616c6c656420696e2e0000000000084469737075746564000000040000001c46756e64732072657475726e656420746f206465706f7369746f722e00000008526566756e646564000000050000001943616e63656c6c6564206265666f72652066756e64696e672e0000000000000943616e63656c6c6564000000000000060000000500000000000000000000000646756e6465640000000000010000000666756e6465640000000000000000000200000005000000000000000000000008446973707574656400000001000000086469737075746564000000020000000000000002627900000000001300000000000000000000000970726f6f665f75726900000000000010000000000000000200000005000000000000000000000008526566756e6465640000000100000008726566756e64656400000000000000020000000500000000000000000000000852656c6561736564000000010000000872656c656173656400000000000000020000000500000000000000000000000943616e63656c6c6564000000000000010000000963616e63656c6c6564000000000000000000000200000005000000000000000000000009436f6d706c657465640000000000000100000009636f6d706c65746564000000000000020000000000000002627900000000001300000000000000000000000970726f6f665f757269000000000000100000000000000002000000000000011d45786563757465207468652070726570617265642066756e64696e67206f6e6c7920616674657220424f5448207061796f75742070726f6f6673207061737365642e0a526567697374726174696f6e2c207472616e7366657220616e64206d65726765206172652061746f6d69633a206e6f626f64792063616e20696e6a6563742061206372656469740a6265747765656e20726567697374726174696f6e20616e642074686973206f6e65206d657267652e204c617465722063726564697473207374617920696e20726563656976696e670a616e642063616e6e6f7420696e76616c6964617465207468652066726f7a656e207370656e6461626c6520636f6d6d69746d656e74207573656420617420736574746c656d656e742e0000000000000466756e640000000000000001000003e90000000200000003000000000000000000000005746f6b656e000000000000000000000100000013000000000000003643616e63656c20616e20756e66756e646564207368656c6c2e2053746174653a2043726561746564202d3e2043616e63656c6c65642e00000000000663616e63656c00000000000000000001000003e90000000200000003000000000000006c4465706f7369746f722072656c656173657320746f2074686520726563697069656e742e2043616c6c61626c652066726f6d2046756e64656420286561726c7929206f720a436f6d706c6574656420286e6f726d616c292e2053746174653a202d3e2052656c65617365642e0000000772656c65617365000000000000000001000003e9000000020000000300000000000000804465706f7369746f72207265636c61696d732061207374696c6c2d6046756e6465646020657363726f772061667465722074696d656f75742e20426c6f636b6564206f6e6365207468650a726563697069656e74206d61726b7320636f6d706c657465642e2053746174653a2046756e646564202d3e20526566756e6465642e0000000774696d656f7574000000000000000001000003e9000000020000000300000000000000000000000a6765745f657363726f7700000000000000000001000007d000000006457363726f77000000000000000000794465706c6f7965642062792074686520666163746f72792e206074696d656f75745f7365636f6e64736020636f756e74732066726f6d206e6f773b2061667465722069742c207468650a6465706f7369746f72206d61792073656c662d726566756e64207768696c65207374696c6c206046756e646564602e0000000000000d5f5f636f6e7374727563746f72000000000000050000000000000005746f6b656e0000000000001300000000000000096465706f7369746f72000000000000130000000000000009726563697069656e740000000000001300000000000000076172626974657200000003e800000013000000000000000f74696d656f75745f7365636f6e64730000000006000000000000000000000060526563697069656e74206d61726b732064656c69766572793b20737461727473207468652072656c656173652077696e646f772c20626c6f636b732074696d656f75742e0a53746174653a2046756e646564202d3e20436f6d706c657465642e0000000e6d61726b5f636f6d706c65746564000000000001000000000000000970726f6f665f7572690000000000001000000001000003e9000000020000000300000000000000915072657061726520696d6d757461626c6520696e7075747320666f72207061796f75742076616c69646174696f6e2e2052652d707265706172696e6720696e76616c6964617465730a626f74682070726576696f75736c7920636865636b65642070726f6f66732e204e6f20746f6b656e20726567697374726174696f6e206f722066756e6473206d6f7665207965742e0000000000000f707265706172655f66756e64696e670000000003000000000000000d72656769737465725f646174610000000000000e000000000000000a61756469746f725f6964000000000004000000000000000b7472616e736665725f696e000000000e00000001000003e900000002000000030000000000000070526563697069656e74206175746f2d636c61696d73207768656e207468657265206973206e6f206172626974657220616e64207468652072656c656173652077696e646f77206861730a657870697265642e2053746174653a20436f6d706c65746564202d3e2052656c65617365642e00000012636c61696d5f61667465725f77696e646f7700000000000000000001000003e90000000200000003000000000000006f526563697069656e7420657363616c6174657320746f207468652061726269746572206166746572207468652072656c656173652077696e646f772e20526571756972657320616e0a617262697465722e2053746174653a20436f6d706c65746564202d3e2044697370757465642e0000000012646973707574655f776974685f70726f6f66000000000001000000000000000970726f6f665f7572690000000000001000000001000003e9000000020000000300000000000000d2566572696679206f6e6520736574746c656d656e74206272616e636820616761696e7374207468652045584143542070726570617265642066756e64696e6720696e707574730a6265666f72652073746f72696e672069742e204f6e652070726f6f66207065722063616c6c206b65657073207472616e73616374696f6e2073697a6520616e642070726f76696e670a766572696669636174696f6e20636f737420626f756e6465642e20412072656a65637465642070726f6f66206e6576657220656e61626c65732066756e64696e672e00000000001273746f72655f7061796f75745f70726f6f66000000000003000000000000000772656c656173650000000001000000000000000570726f6f660000000000000e000000000000001272656d61696e696e675f626c696e64696e670000000003ee0000002000000001000003e900000002000000030000000000000049417262697465722072657475726e732074686520657363726f7720746f20746865206465706f7369746f722e2053746174653a204469737075746564202d3e20526566756e6465642e000000000000147265736f6c76655f746f5f6465706f7369746f720000000000000001000003e90000000200000003000000000000004841726269746572206177617264732074686520657363726f7720746f2074686520726563697069656e742e2053746174653a204469737075746564202d3e2052656c65617365642e000000147265736f6c76655f746f5f726563697069656e740000000000000001000003e90000000200000003001e11636f6e7472616374656e766d6574617630000000000000001a00000000006f0e636f6e74726163746d65746176300000000000000005727376657200000000000006312e39332e3100000000000000000008727373646b7665720000002f32362e312e3023313735616134313330366633383330353761386364666338346236386439333136363466633334650000530e636f6e74726163746d65746176300000000000000006636c6976657200000000002f32372e302e30233561376335666537363533306266343234383437376163383132666337353731343662393863633400" } }, "ext": "v0" diff --git a/contracts/escrow-factory/testdata/private_escrow_instance.wasm b/contracts/escrow-factory/testdata/private_escrow_instance.wasm index 7278934..0bbcc7b 100644 Binary files a/contracts/escrow-factory/testdata/private_escrow_instance.wasm and b/contracts/escrow-factory/testdata/private_escrow_instance.wasm differ diff --git a/contracts/escrow-instance/src/instance.rs b/contracts/escrow-instance/src/instance.rs index a787b5f..8943940 100644 --- a/contracts/escrow-instance/src/instance.rs +++ b/contracts/escrow-instance/src/instance.rs @@ -6,7 +6,7 @@ use soroban_sdk::{ contract, contractevent, contractimpl, contracttype, Address, Bytes, Env, String, }; -use crate::{Escrow, EscrowState, Error, TokenClient, RELEASE_WINDOW}; +use crate::{Error, Escrow, EscrowState, TokenClient, RELEASE_WINDOW}; #[contracttype] enum DataKey { @@ -16,6 +16,9 @@ enum DataKey { ReleaseProof, /// Pre-generated payout proof: instance -> depositor. RefundProof, + RegisterData, + AuditorId, + TransferIn, } #[contractevent] @@ -79,37 +82,81 @@ impl PrivateEscrowInstance { ); } - /// Store the two pre-generated payout proofs (instance → recipient, - /// instance → depositor) the state machine will later select between. - /// Split out from `fund` because bundling both proofs alongside the - /// register and transfer-in proofs in one transaction exceeds Soroban's - /// per-transaction size ceiling — four ~14KB UltraHonk proofs is too much - /// for a single call. Must be called before `fund`; harmless to call again - /// while still `Created` (last write wins). - pub fn store_payout_proofs(e: &Env, release_proof: Bytes, refund_proof: Bytes) -> Result<(), Error> { + /// Prepare immutable inputs for payout validation. Re-preparing invalidates + /// both previously checked proofs. No token registration or funds move yet. + pub fn prepare_funding( + e: &Env, + register_data: Bytes, + auditor_id: u32, + transfer_in: Bytes, + ) -> Result<(), Error> { let esc = get(e); esc.depositor.require_auth(); if esc.state != EscrowState::Created { return Err(Error::BadState); } - e.storage().instance().set(&DataKey::ReleaseProof, &release_proof); - e.storage().instance().set(&DataKey::RefundProof, &refund_proof); + e.storage() + .instance() + .set(&DataKey::RegisterData, ®ister_data); + e.storage().instance().set(&DataKey::AuditorId, &auditor_id); + e.storage() + .instance() + .set(&DataKey::TransferIn, &transfer_in); + e.storage().instance().remove(&DataKey::ReleaseProof); + e.storage().instance().remove(&DataKey::RefundProof); Ok(()) } - /// Lock funds into this escrow. The depositor: - /// * registers this instance as a confidential account (`register_data` - /// is the register proof for the instance's Grumpkin identity), and - /// * `confidential_transfer`s the amount in (`transfer_in`). - /// Requires `store_payout_proofs` to have already been called — `Funded` is - /// only ever reached with a complete, working payout-proof set already in - /// place, so there is no reachable half-funded state. State: Created -> Funded. - pub fn fund( + /// Verify one settlement branch against the EXACT prepared funding inputs + /// before storing it. One proof per call keeps transaction size and proving + /// verification cost bounded. A rejected proof never enables funding. + pub fn store_payout_proof( e: &Env, - register_data: Bytes, - auditor_id: u32, - transfer_in: Bytes, + release: bool, + proof: Bytes, + remaining_blinding: soroban_sdk::BytesN<32>, ) -> Result<(), Error> { + let esc = get(e); + esc.depositor.require_auth(); + if esc.state != EscrowState::Created { + return Err(Error::BadState); + } + let register_data: Bytes = e + .storage() + .instance() + .get(&DataKey::RegisterData) + .ok_or(Error::FundingNotPrepared)?; + let auditor_id: u32 = e.storage().instance().get(&DataKey::AuditorId).unwrap(); + let transfer_in: Bytes = e.storage().instance().get(&DataKey::TransferIn).unwrap(); + let to = if release { + &esc.recipient + } else { + &esc.depositor + }; + if !token(e).verify_escrow_payout( + ®ister_data, + &auditor_id, + &transfer_in, + to, + &proof, + &remaining_blinding, + ) { + return Err(Error::InvalidPayoutProof); + } + let key = if release { + DataKey::ReleaseProof + } else { + DataKey::RefundProof + }; + e.storage().instance().set(&key, &proof); + Ok(()) + } + + /// Execute the prepared funding only after BOTH payout proofs passed. + /// Registration, transfer and merge are atomic: nobody can inject a credit + /// between registration and this one merge. Later credits stay in receiving + /// and cannot invalidate the frozen spendable commitment used at settlement. + pub fn fund(e: &Env) -> Result<(), Error> { let mut esc = get(e); esc.depositor.require_auth(); if esc.state != EscrowState::Created { @@ -120,14 +167,18 @@ impl PrivateEscrowInstance { { return Err(Error::PayoutProofsMissing); } - + let register_data: Bytes = e.storage().instance().get(&DataKey::RegisterData).unwrap(); + let auditor_id: u32 = e.storage().instance().get(&DataKey::AuditorId).unwrap(); + let transfer_in: Bytes = e.storage().instance().get(&DataKey::TransferIn).unwrap(); let token = token(e); let this = e.current_contract_address(); - // The instance authorizes its own registration by invocation. token.register(&this, &auditor_id, ®ister_data); - // from = depositor (the transaction source authorizes this). token.confidential_transfer(&esc.depositor, &this, &transfer_in); + token.merge(&this); + e.storage().instance().remove(&DataKey::RegisterData); + e.storage().instance().remove(&DataKey::TransferIn); + e.storage().instance().remove(&DataKey::AuditorId); esc.state = EscrowState::Funded; put(e, &esc); Funded {}.publish(e); @@ -145,7 +196,11 @@ impl PrivateEscrowInstance { esc.state = EscrowState::Completed; esc.completed_at = e.ledger().timestamp(); put(e, &esc); - Completed { by: esc.recipient, proof_uri }.publish(e); + Completed { + by: esc.recipient, + proof_uri, + } + .publish(e); Ok(()) } @@ -180,7 +235,11 @@ impl PrivateEscrowInstance { } esc.state = EscrowState::Disputed; put(e, &esc); - Disputed { by: esc.recipient, proof_uri }.publish(e); + Disputed { + by: esc.recipient, + proof_uri, + } + .publish(e); Ok(()) } @@ -299,11 +358,11 @@ fn depositor_proof(e: &Env) -> Bytes { e.storage().instance().get(&DataKey::RefundProof).unwrap() } -/// Fold received funds into spendable, then send them out with the selected -/// pre-generated proof. `from` is this contract, which authorizes by invocation. +/// Spend only the commitment fixed during funding, using the selected +/// pre-verified proof. Unsolicited credits remain isolated in receiving. +/// `from` is this contract, which authorizes by invocation. fn payout(e: &Env, proof: &Bytes, to: &Address) { let token = token(e); let this = e.current_contract_address(); - token.merge(&this); token.confidential_transfer(&this, to, proof); } diff --git a/contracts/escrow-instance/src/lib.rs b/contracts/escrow-instance/src/lib.rs index f5a3046..2c06c69 100644 --- a/contracts/escrow-instance/src/lib.rs +++ b/contracts/escrow-instance/src/lib.rs @@ -11,15 +11,11 @@ //! and pays out with a `confidential_transfer` where `from` is the instance //! itself — a contract authorizes its own outgoing transfer by invocation, so //! the recipient or arbiter can trigger a payout without holding any key. -//! * Because a contract cannot prove on-chain, the depositor pre-generates the -//! two possible payout proofs (instance → recipient, instance → depositor) -//! and stores them via `store_payout_proofs` *before* calling `fund` — the -//! instance submits exactly the one the state machine selects, later. This -//! is two transactions, not one: four ~14KB UltraHonk proofs bundled into a -//! single `fund` call (register + transfer-in + both payout proofs) exceeds -//! Soroban's per-transaction size ceiling. `fund` refuses to run until the -//! payout proofs are already in place, so `Funded` is only ever reached with -//! a complete, working proof set — there's no reachable half-funded state. +//! * The depositor prepares registration + funding inputs, then submits each +//! payout proof for on-chain verification against that future commitment. +//! Only after both branches validate can `fund` atomically register, receive +//! and merge the exact prepared transfer. Settlement never merges later credits. +//! Four transactions keep proof payloads within the transaction size limit. //! //! # Trust caveat //! @@ -45,6 +41,15 @@ pub trait ConfidentialTokenInterface { fn register(env: Env, account: Address, auditor_id: u32, data: Bytes); fn confidential_transfer(env: Env, from: Address, to: Address, data: Bytes); fn merge(env: Env, account: Address); + fn verify_escrow_payout( + env: Env, + register_data: Bytes, + auditor_id: u32, + transfer_in: Bytes, + to: Address, + data: Bytes, + remaining_blinding: soroban_sdk::BytesN<32>, + ) -> bool; } #[contracterror] @@ -60,8 +65,10 @@ pub enum Error { ArbiterSet = 7, TooEarly = 8, NotFound = 9, - /// `fund` was called before `store_payout_proofs` — see instance.rs. + /// Both payout branches must be verified before `fund`. PayoutProofsMissing = 10, + FundingNotPrepared = 11, + InvalidPayoutProof = 12, } /// Lifecycle of an escrow, mirroring the Solidity reference exactly. diff --git a/contracts/escrow-instance/src/test.rs b/contracts/escrow-instance/src/test.rs index b55264b..dbd91e9 100644 --- a/contracts/escrow-instance/src/test.rs +++ b/contracts/escrow-instance/src/test.rs @@ -16,12 +16,44 @@ pub struct MockToken; #[contractimpl] impl MockToken { - pub fn register(_e: &Env, account: Address, _auditor_id: u32, _data: Bytes) { + pub fn register(e: &Env, account: Address, _auditor_id: u32, _data: Bytes) { account.require_auth(); + e.storage() + .instance() + .set(&(symbol_short!("spend"), account.clone()), &0u32); + e.storage() + .instance() + .set(&(symbol_short!("receive"), account), &0u32); + } + + pub fn verify_escrow_payout( + _e: &Env, + _register_data: Bytes, + _auditor_id: u32, + transfer_in: Bytes, + _to: Address, + data: Bytes, + _remaining_blinding: soroban_sdk::BytesN<32>, + ) -> bool { + !data.is_empty() && data == transfer_in } - pub fn confidential_transfer(e: &Env, from: Address, to: Address, _data: Bytes) { + pub fn credit(e: &Env, account: Address, amount: u32) { + let key = (symbol_short!("receive"), account); + let prior: u32 = e.storage().instance().get(&key).unwrap_or(0); + e.storage().instance().set(&key, &(prior + amount)); + } + + pub fn confidential_transfer(e: &Env, from: Address, to: Address, data: Bytes) { from.require_auth(); + // Model a proof bound to the sender's original commitment. Any later + // merge of unsolicited credits makes this check fail. + let key = (symbol_short!("spend"), from.clone()); + if let Some(spend) = e.storage().instance().get::<_, u32>(&key) { + assert_eq!(spend, data.get(0).unwrap() as u32); + e.storage().instance().set(&key, &0u32); + } + Self::credit(e, to.clone(), data.get(0).unwrap() as u32); let mut log: Vec<(Address, Address)> = e .storage() .instance() @@ -31,12 +63,21 @@ impl MockToken { e.storage().instance().set(&symbol_short!("xfers"), &log); } - pub fn merge(_e: &Env, account: Address) { + pub fn merge(e: &Env, account: Address) { account.require_auth(); + let spend_key = (symbol_short!("spend"), account.clone()); + let receive_key = (symbol_short!("receive"), account); + let spend: u32 = e.storage().instance().get(&spend_key).unwrap_or(0); + let receive: u32 = e.storage().instance().get(&receive_key).unwrap_or(0); + e.storage().instance().set(&spend_key, &(spend + receive)); + e.storage().instance().set(&receive_key, &0u32); } pub fn xfers(e: &Env) -> Vec<(Address, Address)> { - e.storage().instance().get(&symbol_short!("xfers")).unwrap_or(Vec::new(e)) + e.storage() + .instance() + .get(&symbol_short!("xfers")) + .unwrap_or(Vec::new(e)) } } @@ -59,13 +100,30 @@ fn setup(with_arbiter: bool) -> Fixture { let token = e.register(MockToken, ()); let depositor = Address::generate(&e); let recipient = Address::generate(&e); - let arbiter = if with_arbiter { Some(Address::generate(&e)) } else { None }; + let arbiter = if with_arbiter { + Some(Address::generate(&e)) + } else { + None + }; let id = e.register( PrivateEscrowInstance, - (token.clone(), depositor.clone(), recipient.clone(), arbiter.clone(), TIMEOUT), + ( + token.clone(), + depositor.clone(), + recipient.clone(), + arbiter.clone(), + TIMEOUT, + ), ); let escrow = PrivateEscrowInstanceClient::new(&e, &id); - Fixture { e, token, escrow, depositor, recipient, arbiter } + Fixture { + e, + token, + escrow, + depositor, + recipient, + arbiter, + } } fn b(f: &Fixture) -> Bytes { @@ -73,12 +131,23 @@ fn b(f: &Fixture) -> Bytes { } fn fund(f: &Fixture) { - f.escrow.store_payout_proofs(&b(f), &b(f)); - f.escrow.fund(&b(f), &0u32, &b(f)); + f.escrow.prepare_funding(&b(f), &0u32, &b(f)); + f.escrow.store_payout_proof( + &true, + &b(f), + &soroban_sdk::BytesN::from_array(&f.e, &[0; 32]), + ); + f.escrow.store_payout_proof( + &false, + &b(f), + &soroban_sdk::BytesN::from_array(&f.e, &[0; 32]), + ); + f.escrow.fund(); } fn advance_past_window(f: &Fixture, completed_at: u64) { - f.e.ledger().set_timestamp(completed_at + RELEASE_WINDOW + 1); + f.e.ledger() + .set_timestamp(completed_at + RELEASE_WINDOW + 1); } fn last_payout_to(f: &Fixture) -> Address { @@ -105,7 +174,8 @@ fn fund_moves_to_funded() { fn normal_release_pays_recipient() { let f = setup(false); fund(&f); - f.escrow.mark_completed(&String::from_str(&f.e, "ipfs://proof")); + f.escrow + .mark_completed(&String::from_str(&f.e, "ipfs://proof")); assert_eq!(f.escrow.get_escrow().state, EscrowState::Completed); f.escrow.release(); assert_eq!(f.escrow.get_escrow().state, EscrowState::Released); @@ -140,7 +210,8 @@ fn dispute_then_resolve_to_recipient() { f.escrow.mark_completed(&String::from_str(&f.e, "x")); let completed_at = f.escrow.get_escrow().completed_at; advance_past_window(&f, completed_at); - f.escrow.dispute_with_proof(&String::from_str(&f.e, "evidence")); + f.escrow + .dispute_with_proof(&String::from_str(&f.e, "evidence")); assert_eq!(f.escrow.get_escrow().state, EscrowState::Disputed); f.escrow.resolve_to_recipient(); assert_eq!(f.escrow.get_escrow().state, EscrowState::Released); @@ -154,7 +225,8 @@ fn dispute_then_resolve_to_depositor() { f.escrow.mark_completed(&String::from_str(&f.e, "x")); let completed_at = f.escrow.get_escrow().completed_at; advance_past_window(&f, completed_at); - f.escrow.dispute_with_proof(&String::from_str(&f.e, "evidence")); + f.escrow + .dispute_with_proof(&String::from_str(&f.e, "evidence")); f.escrow.resolve_to_depositor(); assert_eq!(f.escrow.get_escrow().state, EscrowState::Refunded); assert_eq!(last_payout_to(&f), f.depositor); @@ -183,25 +255,33 @@ fn cancel_unfunded() { fn cannot_fund_twice() { let f = setup(false); fund(&f); - let res = f.escrow.try_fund(&b(&f), &0u32, &b(&f)); + let res = f.escrow.try_fund(); assert_eq!(res, Err(Ok(Error::BadState))); } #[test] fn fund_before_payout_proofs_blocked() { let f = setup(false); - let res = f.escrow.try_fund(&b(&f), &0u32, &b(&f)); + let res = f.escrow.try_fund(); assert_eq!(res, Err(Ok(Error::PayoutProofsMissing))); } #[test] -fn store_payout_proofs_can_be_overwritten_before_funding() { +fn preparing_again_invalidates_both_payout_proofs() { let f = setup(false); - f.escrow.store_payout_proofs(&b(&f), &b(&f)); - // Last write wins; still Created, so this is allowed. - f.escrow.store_payout_proofs(&b(&f), &b(&f)); - f.escrow.fund(&b(&f), &0u32, &b(&f)); - assert_eq!(f.escrow.get_escrow().state, EscrowState::Funded); + f.escrow.prepare_funding(&b(&f), &0u32, &b(&f)); + f.escrow.store_payout_proof( + &true, + &b(&f), + &soroban_sdk::BytesN::from_array(&f.e, &[0; 32]), + ); + f.escrow.store_payout_proof( + &false, + &b(&f), + &soroban_sdk::BytesN::from_array(&f.e, &[0; 32]), + ); + f.escrow.prepare_funding(&b(&f), &1u32, &b(&f)); + assert_eq!(f.escrow.try_fund(), Err(Ok(Error::PayoutProofsMissing))); } #[test] @@ -238,7 +318,9 @@ fn dispute_without_arbiter_blocked() { f.escrow.mark_completed(&String::from_str(&f.e, "x")); let completed_at = f.escrow.get_escrow().completed_at; advance_past_window(&f, completed_at); - let res = f.escrow.try_dispute_with_proof(&String::from_str(&f.e, "x")); + let res = f + .escrow + .try_dispute_with_proof(&String::from_str(&f.e, "x")); assert_eq!(res, Err(Ok(Error::NoArbiter))); } @@ -273,15 +355,127 @@ fn stranger_cannot_mark_completed() { let recipient = Address::generate(&e); let id = e.register( PrivateEscrowInstance, - (token, depositor.clone(), recipient, None::
, TIMEOUT), + ( + token, + depositor.clone(), + recipient, + None::
, + TIMEOUT, + ), ); let escrow = PrivateEscrowInstanceClient::new(&e, &id); e.mock_all_auths(); - escrow.store_payout_proofs(&Bytes::from_array(&e, &[1]), &Bytes::from_array(&e, &[1])); - escrow.fund(&Bytes::from_array(&e, &[1]), &0u32, &Bytes::from_array(&e, &[1])); + let blob = Bytes::from_array(&e, &[1]); + escrow.prepare_funding(&blob, &0u32, &blob); + escrow.store_payout_proof(&true, &blob, &soroban_sdk::BytesN::from_array(&e, &[0; 32])); + escrow.store_payout_proof( + &false, + &blob, + &soroban_sdk::BytesN::from_array(&e, &[0; 32]), + ); + escrow.fund(); // Real auth required now: nobody authorized as the recipient. e.set_auths(&[]); escrow.mark_completed(&String::from_str(&e, "x")); } + +#[test] +fn invalid_release_proof_cannot_enable_funding() { + let f = setup(false); + f.escrow.prepare_funding(&b(&f), &0u32, &b(&f)); + f.escrow.store_payout_proof( + &false, + &b(&f), + &soroban_sdk::BytesN::from_array(&f.e, &[0; 32]), + ); + assert_eq!( + f.escrow.try_store_payout_proof( + &true, + &Bytes::new(&f.e), + &soroban_sdk::BytesN::from_array(&f.e, &[0; 32]) + ), + Err(Ok(Error::InvalidPayoutProof)) + ); + assert_eq!(f.escrow.try_fund(), Err(Ok(Error::PayoutProofsMissing))); + assert_eq!(f.escrow.get_escrow().state, EscrowState::Created); + assert!(MockTokenClient::new(&f.e, &f.token).xfers().is_empty()); + // A corrected proof can be submitted before funding, with no funds at risk. + f.escrow.store_payout_proof( + &true, + &b(&f), + &soroban_sdk::BytesN::from_array(&f.e, &[0; 32]), + ); + f.escrow.fund(); +} + +#[test] +fn invalid_refund_proof_cannot_enable_funding() { + let f = setup(false); + f.escrow.prepare_funding(&b(&f), &0u32, &b(&f)); + f.escrow.store_payout_proof( + &true, + &b(&f), + &soroban_sdk::BytesN::from_array(&f.e, &[0; 32]), + ); + assert_eq!( + f.escrow.try_store_payout_proof( + &false, + &Bytes::from_array(&f.e, &[1]), + &soroban_sdk::BytesN::from_array(&f.e, &[0; 32]) + ), + Err(Ok(Error::InvalidPayoutProof)) + ); + assert_eq!(f.escrow.try_fund(), Err(Ok(Error::PayoutProofsMissing))); +} + +#[test] +fn payout_proof_requires_prepared_inputs() { + let f = setup(false); + assert_eq!( + f.escrow.try_store_payout_proof( + &true, + &b(&f), + &soroban_sdk::BytesN::from_array(&f.e, &[0; 32]) + ), + Err(Ok(Error::FundingNotPrepared)) + ); +} + +#[test] +fn unsolicited_credit_does_not_block_release() { + let f = setup(false); + fund(&f); + MockTokenClient::new(&f.e, &f.token).credit(&f.escrow.address, &1); + f.escrow.release(); + assert_eq!(last_payout_to(&f), f.recipient); +} + +#[test] +fn unsolicited_credit_does_not_block_refund() { + let f = setup(false); + fund(&f); + MockTokenClient::new(&f.e, &f.token).credit(&f.escrow.address, &1); + f.e.ledger().with_mut(|li| li.timestamp = TIMEOUT + 1); + f.escrow.timeout(); + assert_eq!(last_payout_to(&f), f.depositor); +} + +#[test] +fn cannot_replace_prepared_inputs_or_proofs_after_funding() { + let f = setup(false); + fund(&f); + assert_eq!( + f.escrow.try_prepare_funding(&b(&f), &0, &b(&f)), + Err(Ok(Error::BadState)) + ); + assert_eq!( + f.escrow.try_store_payout_proof( + &true, + &b(&f), + &soroban_sdk::BytesN::from_array(&f.e, &[0; 32]) + ), + Err(Ok(Error::BadState)) + ); +} diff --git a/contracts/escrow-instance/test_snapshots/test/cannot_fund_twice.1.json b/contracts/escrow-instance/test_snapshots/test/cannot_fund_twice.1.json index 5643cc3..6bb6d09 100644 --- a/contracts/escrow-instance/test_snapshots/test/cannot_fund_twice.1.json +++ b/contracts/escrow-instance/test_snapshots/test/cannot_fund_twice.1.json @@ -14,11 +14,14 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "0909090909090909" }, + { + "u32": 0 + }, { "bytes": "0909090909090909" } @@ -36,20 +39,60 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "fund", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "0909090909090909" }, { - "u32": 0 + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false }, { "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "fund", + "args": [] + } + }, "sub_invocations": [ { "function": { @@ -120,6 +163,36 @@ } ] } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 9 + } } ] } @@ -150,6 +223,46 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/escrow-instance/test_snapshots/test/cannot_replace_prepared_inputs_or_proofs_after_funding.1.json b/contracts/escrow-instance/test_snapshots/test/cannot_replace_prepared_inputs_or_proofs_after_funding.1.json new file mode 100644 index 0000000..68f9830 --- /dev/null +++ b/contracts/escrow-instance/test_snapshots/test/cannot_replace_prepared_inputs_or_proofs_after_funding.1.json @@ -0,0 +1,431 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "prepare_funding", + "args": [ + { + "bytes": "0909090909090909" + }, + { + "u32": 0 + }, + { + "bytes": "0909090909090909" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": true + }, + { + "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false + }, + { + "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "fund", + "args": [] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "confidential_transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "bytes": "0909090909090909" + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "xfers" + }, + "val": { + "vec": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 9 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Escrow" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "arbiter" + }, + "val": "void" + }, + { + "key": { + "symbol": "completed_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "depositor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "timeout_at" + }, + "val": { + "u64": "3600" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RefundProof" + } + ] + }, + "val": { + "bytes": "0909090909090909" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ReleaseProof" + } + ] + }, + "val": { + "bytes": "0909090909090909" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/escrow-instance/test_snapshots/test/claim_after_window_blocked_when_arbiter_set.1.json b/contracts/escrow-instance/test_snapshots/test/claim_after_window_blocked_when_arbiter_set.1.json index d85e0d5..e9a8dcd 100644 --- a/contracts/escrow-instance/test_snapshots/test/claim_after_window_blocked_when_arbiter_set.1.json +++ b/contracts/escrow-instance/test_snapshots/test/claim_after_window_blocked_when_arbiter_set.1.json @@ -14,11 +14,14 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "0909090909090909" }, + { + "u32": 0 + }, { "bytes": "0909090909090909" } @@ -36,20 +39,60 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "fund", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "0909090909090909" }, { - "u32": 0 + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false }, { "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "fund", + "args": [] + } + }, "sub_invocations": [ { "function": { @@ -140,6 +183,36 @@ } ] } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "val": { + "u32": 9 + } } ] } @@ -170,6 +243,46 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, @@ -199,7 +312,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": "1033654523790656264" + "nonce": "2032731177588607455" } }, "durability": "temporary", diff --git a/contracts/escrow-instance/test_snapshots/test/claim_after_window_no_arbiter.1.json b/contracts/escrow-instance/test_snapshots/test/claim_after_window_no_arbiter.1.json index 0d5e445..e3ae62d 100644 --- a/contracts/escrow-instance/test_snapshots/test/claim_after_window_no_arbiter.1.json +++ b/contracts/escrow-instance/test_snapshots/test/claim_after_window_no_arbiter.1.json @@ -14,11 +14,14 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "0909090909090909" }, + { + "u32": 0 + }, { "bytes": "0909090909090909" } @@ -36,20 +39,60 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "fund", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "0909090909090909" }, { - "u32": 0 + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false }, { "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "fund", + "args": [] + } + }, "sub_invocations": [ { "function": { @@ -166,6 +209,51 @@ } ] } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "u32": 9 + } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } } ] } @@ -196,6 +284,46 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, @@ -225,7 +353,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": "1033654523790656264" + "nonce": "2032731177588607455" } }, "durability": "temporary", @@ -245,7 +373,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": "4837995959683129791" + "nonce": "4270020994084947596" } }, "durability": "temporary", diff --git a/contracts/escrow-instance/test_snapshots/test/claim_before_window_blocked.1.json b/contracts/escrow-instance/test_snapshots/test/claim_before_window_blocked.1.json index dad52d5..4768937 100644 --- a/contracts/escrow-instance/test_snapshots/test/claim_before_window_blocked.1.json +++ b/contracts/escrow-instance/test_snapshots/test/claim_before_window_blocked.1.json @@ -14,11 +14,14 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "0909090909090909" }, + { + "u32": 0 + }, { "bytes": "0909090909090909" } @@ -36,20 +39,60 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "fund", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "0909090909090909" }, { - "u32": 0 + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false }, { "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "fund", + "args": [] + } + }, "sub_invocations": [ { "function": { @@ -139,6 +182,36 @@ } ] } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 9 + } } ] } @@ -169,6 +242,46 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, @@ -198,7 +311,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": "1033654523790656264" + "nonce": "2032731177588607455" } }, "durability": "temporary", diff --git a/contracts/escrow-instance/test_snapshots/test/dispute_then_resolve_to_depositor.1.json b/contracts/escrow-instance/test_snapshots/test/dispute_then_resolve_to_depositor.1.json index 23ce429..c5b732f 100644 --- a/contracts/escrow-instance/test_snapshots/test/dispute_then_resolve_to_depositor.1.json +++ b/contracts/escrow-instance/test_snapshots/test/dispute_then_resolve_to_depositor.1.json @@ -14,11 +14,14 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "0909090909090909" }, + { + "u32": 0 + }, { "bytes": "0909090909090909" } @@ -36,20 +39,60 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "fund", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "0909090909090909" }, { - "u32": 0 + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false }, { "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "fund", + "args": [] + } + }, "sub_invocations": [ { "function": { @@ -185,6 +228,51 @@ } ] } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "u32": 9 + } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "val": { + "u32": 0 + } } ] } @@ -215,6 +303,46 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, @@ -244,7 +372,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": "1033654523790656264" + "nonce": "2032731177588607455" } }, "durability": "temporary", @@ -264,7 +392,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": "4837995959683129791" + "nonce": "4270020994084947596" } }, "durability": "temporary", @@ -284,7 +412,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": "2032731177588607455" + "nonce": "8370022561469687789" } }, "durability": "temporary", diff --git a/contracts/escrow-instance/test_snapshots/test/dispute_then_resolve_to_recipient.1.json b/contracts/escrow-instance/test_snapshots/test/dispute_then_resolve_to_recipient.1.json index db627c2..76f3f3a 100644 --- a/contracts/escrow-instance/test_snapshots/test/dispute_then_resolve_to_recipient.1.json +++ b/contracts/escrow-instance/test_snapshots/test/dispute_then_resolve_to_recipient.1.json @@ -14,11 +14,14 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "0909090909090909" }, + { + "u32": 0 + }, { "bytes": "0909090909090909" } @@ -36,20 +39,60 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", - "function_name": "fund", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "0909090909090909" }, { - "u32": 0 + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false }, { "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "fund", + "args": [] + } + }, "sub_invocations": [ { "function": { @@ -186,6 +229,51 @@ } ] } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "u32": 9 + } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "val": { + "u32": 0 + } } ] } @@ -216,6 +304,46 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, @@ -245,7 +373,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": "1033654523790656264" + "nonce": "2032731177588607455" } }, "durability": "temporary", @@ -265,7 +393,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": "4837995959683129791" + "nonce": "4270020994084947596" } }, "durability": "temporary", @@ -285,7 +413,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": "2032731177588607455" + "nonce": "8370022561469687789" } }, "durability": "temporary", diff --git a/contracts/escrow-instance/test_snapshots/test/dispute_without_arbiter_blocked.1.json b/contracts/escrow-instance/test_snapshots/test/dispute_without_arbiter_blocked.1.json index 59c46d6..2810b1f 100644 --- a/contracts/escrow-instance/test_snapshots/test/dispute_without_arbiter_blocked.1.json +++ b/contracts/escrow-instance/test_snapshots/test/dispute_without_arbiter_blocked.1.json @@ -14,11 +14,14 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "0909090909090909" }, + { + "u32": 0 + }, { "bytes": "0909090909090909" } @@ -36,20 +39,60 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "fund", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "0909090909090909" }, { - "u32": 0 + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false }, { "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "fund", + "args": [] + } + }, "sub_invocations": [ { "function": { @@ -140,6 +183,36 @@ } ] } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 9 + } } ] } @@ -170,6 +243,46 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, @@ -199,7 +312,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": "1033654523790656264" + "nonce": "2032731177588607455" } }, "durability": "temporary", diff --git a/contracts/escrow-instance/test_snapshots/test/early_release_from_funded.1.json b/contracts/escrow-instance/test_snapshots/test/early_release_from_funded.1.json index 64016d9..65c09d1 100644 --- a/contracts/escrow-instance/test_snapshots/test/early_release_from_funded.1.json +++ b/contracts/escrow-instance/test_snapshots/test/early_release_from_funded.1.json @@ -14,11 +14,14 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "0909090909090909" }, + { + "u32": 0 + }, { "bytes": "0909090909090909" } @@ -36,20 +39,60 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "fund", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "0909090909090909" }, { - "u32": 0 + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false }, { "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "fund", + "args": [] + } + }, "sub_invocations": [ { "function": { @@ -146,6 +189,51 @@ } ] } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "u32": 9 + } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } } ] } @@ -196,6 +284,46 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/escrow-instance/test_snapshots/test/fund_moves_to_funded.1.json b/contracts/escrow-instance/test_snapshots/test/fund_moves_to_funded.1.json index a6913f7..68f9830 100644 --- a/contracts/escrow-instance/test_snapshots/test/fund_moves_to_funded.1.json +++ b/contracts/escrow-instance/test_snapshots/test/fund_moves_to_funded.1.json @@ -14,11 +14,14 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "0909090909090909" }, + { + "u32": 0 + }, { "bytes": "0909090909090909" } @@ -36,20 +39,60 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "fund", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "0909090909090909" }, { - "u32": 0 + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false }, { "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "fund", + "args": [] + } + }, "sub_invocations": [ { "function": { @@ -121,6 +164,36 @@ } ] } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 9 + } } ] } @@ -151,6 +224,46 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/escrow-instance/test_snapshots/test/invalid_refund_proof_cannot_enable_funding.1.json b/contracts/escrow-instance/test_snapshots/test/invalid_refund_proof_cannot_enable_funding.1.json new file mode 100644 index 0000000..bba953c --- /dev/null +++ b/contracts/escrow-instance/test_snapshots/test/invalid_refund_proof_cannot_enable_funding.1.json @@ -0,0 +1,304 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "prepare_funding", + "args": [ + { + "bytes": "0909090909090909" + }, + { + "u32": 0 + }, + { + "bytes": "0909090909090909" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": true + }, + { + "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "AuditorId" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "Escrow" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "arbiter" + }, + "val": "void" + }, + { + "key": { + "symbol": "completed_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "depositor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "timeout_at" + }, + "val": { + "u64": "3600" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RegisterData" + } + ] + }, + "val": { + "bytes": "0909090909090909" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ReleaseProof" + } + ] + }, + "val": { + "bytes": "0909090909090909" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TransferIn" + } + ] + }, + "val": { + "bytes": "0909090909090909" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/escrow-instance/test_snapshots/test/invalid_release_proof_cannot_enable_funding.1.json b/contracts/escrow-instance/test_snapshots/test/invalid_release_proof_cannot_enable_funding.1.json new file mode 100644 index 0000000..ed5c7b9 --- /dev/null +++ b/contracts/escrow-instance/test_snapshots/test/invalid_release_proof_cannot_enable_funding.1.json @@ -0,0 +1,454 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "prepare_funding", + "args": [ + { + "bytes": "0909090909090909" + }, + { + "u32": 0 + }, + { + "bytes": "0909090909090909" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false + }, + { + "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": true + }, + { + "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "fund", + "args": [] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "confidential_transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "bytes": "0909090909090909" + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "xfers" + }, + "val": { + "vec": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 9 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4270020994084947596" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Escrow" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "arbiter" + }, + "val": "void" + }, + { + "key": { + "symbol": "completed_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "depositor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "timeout_at" + }, + "val": { + "u64": "3600" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RefundProof" + } + ] + }, + "val": { + "bytes": "0909090909090909" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ReleaseProof" + } + ] + }, + "val": { + "bytes": "0909090909090909" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [ + { + "event": { + "ext": "v0", + "contract_id": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "type_": "contract", + "body": { + "v0": { + "topics": [ + { + "symbol": "funded" + } + ], + "data": { + "map": [] + } + } + } + }, + "failed_call": false + } + ] +} \ No newline at end of file diff --git a/contracts/escrow-instance/test_snapshots/test/normal_release_pays_recipient.1.json b/contracts/escrow-instance/test_snapshots/test/normal_release_pays_recipient.1.json index 2c39487..a667075 100644 --- a/contracts/escrow-instance/test_snapshots/test/normal_release_pays_recipient.1.json +++ b/contracts/escrow-instance/test_snapshots/test/normal_release_pays_recipient.1.json @@ -14,11 +14,14 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "0909090909090909" }, + { + "u32": 0 + }, { "bytes": "0909090909090909" } @@ -36,20 +39,60 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "fund", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "0909090909090909" }, { - "u32": 0 + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false }, { "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "fund", + "args": [] + } + }, "sub_invocations": [ { "function": { @@ -166,6 +209,51 @@ } ] } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "u32": 9 + } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } } ] } @@ -196,6 +284,46 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4270020994084947596" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, @@ -245,7 +373,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": "1033654523790656264" + "nonce": "2032731177588607455" } }, "durability": "temporary", diff --git a/contracts/escrow-instance/test_snapshots/test/payout_proof_requires_prepared_inputs.1.json b/contracts/escrow-instance/test_snapshots/test/payout_proof_requires_prepared_inputs.1.json new file mode 100644 index 0000000..75e5eb1 --- /dev/null +++ b/contracts/escrow-instance/test_snapshots/test/payout_proof_requires_prepared_inputs.1.json @@ -0,0 +1,165 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Escrow" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "arbiter" + }, + "val": "void" + }, + { + "key": { + "symbol": "completed_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "depositor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "timeout_at" + }, + "val": { + "u64": "3600" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/escrow-instance/test_snapshots/test/store_payout_proofs_can_be_overwritten_before_funding.1.json b/contracts/escrow-instance/test_snapshots/test/preparing_again_invalidates_both_payout_proofs.1.json similarity index 83% rename from contracts/escrow-instance/test_snapshots/test/store_payout_proofs_can_be_overwritten_before_funding.1.json rename to contracts/escrow-instance/test_snapshots/test/preparing_again_invalidates_both_payout_proofs.1.json index 3374ce8..2b41cbd 100644 --- a/contracts/escrow-instance/test_snapshots/test/store_payout_proofs_can_be_overwritten_before_funding.1.json +++ b/contracts/escrow-instance/test_snapshots/test/preparing_again_invalidates_both_payout_proofs.1.json @@ -14,11 +14,14 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "0909090909090909" }, + { + "u32": 0 + }, { "bytes": "0909090909090909" } @@ -36,13 +39,41 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "store_payout_proofs", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "0909090909090909" }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false + }, { "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } @@ -58,13 +89,13 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "fund", + "function_name": "prepare_funding", "args": [ { "bytes": "0909090909090909" }, { - "u32": 0 + "u32": 1 }, { "bytes": "0909090909090909" @@ -72,28 +103,7 @@ ] } }, - "sub_invocations": [ - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "function_name": "confidential_transfer", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - }, - { - "bytes": "0909090909090909" - } - ] - } - }, - "sub_invocations": [] - } - ] + "sub_invocations": [] } ] ], @@ -123,27 +133,7 @@ "executable": { "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - "storage": [ - { - "key": { - "symbol": "xfers" - }, - "val": { - "vec": [ - { - "vec": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" - } - ] - } - ] - } - } - ] + "storage": null } } } @@ -192,6 +182,26 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, @@ -227,6 +237,18 @@ "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "storage": [ + { + "key": { + "vec": [ + { + "symbol": "AuditorId" + } + ] + }, + "val": { + "u32": 1 + } + }, { "key": { "vec": [ @@ -280,7 +302,7 @@ "symbol": "state" }, "val": { - "u32": 1 + "u32": 0 } }, { @@ -298,7 +320,7 @@ "key": { "vec": [ { - "symbol": "RefundProof" + "symbol": "RegisterData" } ] }, @@ -310,24 +332,24 @@ "key": { "vec": [ { - "symbol": "ReleaseProof" + "symbol": "Token" } ] }, "val": { - "bytes": "0909090909090909" + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" } }, { "key": { "vec": [ { - "symbol": "Token" + "symbol": "TransferIn" } ] }, "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + "bytes": "0909090909090909" } } ] diff --git a/contracts/escrow-instance/test_snapshots/test/stranger_cannot_mark_completed.1.json b/contracts/escrow-instance/test_snapshots/test/stranger_cannot_mark_completed.1.json index 0c9cc8f..4042fa5 100644 --- a/contracts/escrow-instance/test_snapshots/test/stranger_cannot_mark_completed.1.json +++ b/contracts/escrow-instance/test_snapshots/test/stranger_cannot_mark_completed.1.json @@ -14,11 +14,14 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "01" }, + { + "u32": 0 + }, { "bytes": "01" } @@ -36,20 +39,60 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "fund", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "01" }, { - "u32": 0 + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false }, { "bytes": "01" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "fund", + "args": [] + } + }, "sub_invocations": [ { "function": { @@ -120,6 +163,36 @@ } ] } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 1 + } } ] } @@ -150,6 +223,46 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/escrow-instance/test_snapshots/test/timeout_blocked_after_completed.1.json b/contracts/escrow-instance/test_snapshots/test/timeout_blocked_after_completed.1.json index 15302b4..46ce156 100644 --- a/contracts/escrow-instance/test_snapshots/test/timeout_blocked_after_completed.1.json +++ b/contracts/escrow-instance/test_snapshots/test/timeout_blocked_after_completed.1.json @@ -14,11 +14,14 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "0909090909090909" }, + { + "u32": 0 + }, { "bytes": "0909090909090909" } @@ -36,20 +39,60 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "fund", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "0909090909090909" }, { - "u32": 0 + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false }, { "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "fund", + "args": [] + } + }, "sub_invocations": [ { "function": { @@ -139,6 +182,36 @@ } ] } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 9 + } } ] } @@ -169,6 +242,46 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, @@ -198,7 +311,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", "key": { "ledger_key_nonce": { - "nonce": "1033654523790656264" + "nonce": "2032731177588607455" } }, "durability": "temporary", diff --git a/contracts/escrow-instance/test_snapshots/test/timeout_refunds_depositor.1.json b/contracts/escrow-instance/test_snapshots/test/timeout_refunds_depositor.1.json index bbe8c62..5ba0aed 100644 --- a/contracts/escrow-instance/test_snapshots/test/timeout_refunds_depositor.1.json +++ b/contracts/escrow-instance/test_snapshots/test/timeout_refunds_depositor.1.json @@ -14,11 +14,14 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "0909090909090909" }, + { + "u32": 0 + }, { "bytes": "0909090909090909" } @@ -36,20 +39,60 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "fund", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "0909090909090909" }, { - "u32": 0 + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false }, { "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "fund", + "args": [] + } + }, "sub_invocations": [ { "function": { @@ -146,6 +189,51 @@ } ] } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "u32": 9 + } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } } ] } @@ -196,6 +284,46 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/escrow-instance/test_snapshots/test/timeout_too_early.1.json b/contracts/escrow-instance/test_snapshots/test/timeout_too_early.1.json index 5643cc3..6bb6d09 100644 --- a/contracts/escrow-instance/test_snapshots/test/timeout_too_early.1.json +++ b/contracts/escrow-instance/test_snapshots/test/timeout_too_early.1.json @@ -14,11 +14,14 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "store_payout_proofs", + "function_name": "prepare_funding", "args": [ { "bytes": "0909090909090909" }, + { + "u32": 0 + }, { "bytes": "0909090909090909" } @@ -36,20 +39,60 @@ "function": { "contract_fn": { "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", - "function_name": "fund", + "function_name": "store_payout_proof", "args": [ + { + "bool": true + }, { "bytes": "0909090909090909" }, { - "u32": 0 + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false }, { "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" } ] } }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "fund", + "args": [] + } + }, "sub_invocations": [ { "function": { @@ -120,6 +163,36 @@ } ] } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 9 + } } ] } @@ -150,6 +223,46 @@ }, "live_until": 6311999 }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, { "entry": { "last_modified_ledger_seq": 0, diff --git a/contracts/escrow-instance/test_snapshots/test/unsolicited_credit_does_not_block_refund.1.json b/contracts/escrow-instance/test_snapshots/test/unsolicited_credit_does_not_block_refund.1.json new file mode 100644 index 0000000..e903205 --- /dev/null +++ b/contracts/escrow-instance/test_snapshots/test/unsolicited_credit_does_not_block_refund.1.json @@ -0,0 +1,491 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "prepare_funding", + "args": [ + { + "bytes": "0909090909090909" + }, + { + "u32": 0 + }, + { + "bytes": "0909090909090909" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": true + }, + { + "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false + }, + { + "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "fund", + "args": [] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "confidential_transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "bytes": "0909090909090909" + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "timeout", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 0, + "timestamp": 3601, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "xfers" + }, + "val": { + "vec": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + ] + }, + "val": { + "u32": 9 + } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Escrow" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "arbiter" + }, + "val": "void" + }, + { + "key": { + "symbol": "completed_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "depositor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "timeout_at" + }, + "val": { + "u64": "3600" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RefundProof" + } + ] + }, + "val": { + "bytes": "0909090909090909" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ReleaseProof" + } + ] + }, + "val": { + "bytes": "0909090909090909" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/escrow-instance/test_snapshots/test/unsolicited_credit_does_not_block_release.1.json b/contracts/escrow-instance/test_snapshots/test/unsolicited_credit_does_not_block_release.1.json new file mode 100644 index 0000000..a913233 --- /dev/null +++ b/contracts/escrow-instance/test_snapshots/test/unsolicited_credit_does_not_block_release.1.json @@ -0,0 +1,491 @@ +{ + "generators": { + "address": 4, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "prepare_funding", + "args": [ + { + "bytes": "0909090909090909" + }, + { + "u32": 0 + }, + { + "bytes": "0909090909090909" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": true + }, + { + "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "store_payout_proof", + "args": [ + { + "bool": false + }, + { + "bytes": "0909090909090909" + }, + { + "bytes": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "fund", + "args": [] + } + }, + "sub_invocations": [ + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "function_name": "confidential_transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "bytes": "0909090909090909" + } + ] + } + }, + "sub_invocations": [] + } + ] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "function_name": "release", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "xfers" + }, + "val": { + "vec": [ + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + ] + }, + "val": { + "u32": 9 + } + }, + { + "key": { + "vec": [ + { + "symbol": "receive" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "vec": [ + { + "symbol": "spend" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "val": { + "u32": 0 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "1033654523790656264" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "2032731177588607455" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "4837995959683129791" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": { + "ledger_key_nonce": { + "nonce": "5541220902715666415" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Escrow" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "arbiter" + }, + "val": "void" + }, + { + "key": { + "symbol": "completed_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "created_at" + }, + "val": { + "u64": "0" + } + }, + { + "key": { + "symbol": "depositor" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "symbol": "recipient" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "symbol": "state" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "symbol": "timeout_at" + }, + "val": { + "u64": "3600" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RefundProof" + } + ] + }, + "val": { + "bytes": "0909090909090909" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ReleaseProof" + } + ] + }, + "val": { + "bytes": "0909090909090909" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Token" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token/Cargo.toml b/contracts/token/Cargo.toml index ed0c029..e9a7cfc 100644 --- a/contracts/token/Cargo.toml +++ b/contracts/token/Cargo.toml @@ -14,6 +14,7 @@ soroban-sdk = { workspace = true } stellar-access = { workspace = true } stellar-macros = { workspace = true } stellar-tokens = { workspace = true } +stellar-contract-utils = { workspace = true } [dev-dependencies] soroban-sdk = { workspace = true, features = ["testutils"] } diff --git a/contracts/token/src/escrow.rs b/contracts/token/src/escrow.rs new file mode 100644 index 0000000..6f6927c --- /dev/null +++ b/contracts/token/src/escrow.rs @@ -0,0 +1,133 @@ +//! Read-only preflight for an escrow's future outgoing transfer. This does not +//! authorize a transfer, register an account, or move funds. The escrow must +//! later execute exactly the register_data / transfer_in it validated here. +//! PI order and canonical checks mirror stellar-tokens 539968f storage.rs. + +use soroban_sdk::{contractimpl, panic_with_error, Address, Bytes, BytesN, Env}; +use stellar_contract_utils::crypto::grumpkin::{Grumpkin, Point}; +use stellar_tokens::confidential::{ + auditor::ConfidentialAuditorClient, + storage::{self, RegisterData, TransferData}, + verifier::{CircuitType, ConfidentialVerifierClient}, + ConfidentialTokenError, +}; + +use crate::{ + ConfidentialTokenContract, ConfidentialTokenContractArgs, ConfidentialTokenContractClient, +}; + +#[contractimpl] +impl ConfidentialTokenContract { + /// Validate a payout against the account and spendable commitment that + /// atomic register -> transfer-in -> merge will produce. Account keys and + /// auditor keys for the recipient are read from this token, never supplied + /// by the depositor. The funding call independently verifies registration + /// and transfer-in before committing either of them. + pub fn verify_escrow_payout( + e: &Env, + register_data: Bytes, + auditor_id: u32, + transfer_in: Bytes, + to: Address, + data: Bytes, + remaining_blinding: soroban_sdk::BytesN<32>, + ) -> bool { + let registration: RegisterData = storage::decode_data(e, ®ister_data); + let funding: TransferData = storage::decode_data(e, &transfer_in); + let payout: TransferData = storage::decode_data(e, &data); + let recipient = storage::get_account(e, &to); + let auditor = ConfidentialAuditorClient::new(e, &storage::get_auditor(e)); + let p = &payout.payload; + + // A general transfer proof permits a partial payout. Bind its remaining + // commitment to a publicly opened zero balance before accepting it. + if !Grumpkin::is_canonical_field(&remaining_blinding) + || p.c_spend_new != zero_commitment(e, &remaining_blinding) + { + return false; + } + let mut pi = Bytes::new(e); + append_point(&mut pi, &funding.payload.c_tx); + append_point(&mut pi, ®istration.payload.y); + append_point(&mut pi, &recipient.viewing_public_key); + append_field(&mut pi, &storage::get_address_as_field_element(e)); + append_point(&mut pi, &auditor.get_key(&recipient.auditor_id)); + append_point(&mut pi, &auditor.get_key(&auditor_id)); + append_point(&mut pi, &p.c_spend_new); + append_point(&mut pi, &p.c_tx); + append_point(&mut pi, &p.r_e); + for field in [ + &p.v_tilde, &p.b_tilde, &p.sigma, &p.v_aud_r, &p.r_aud_r, &p.v_aud_s, &p.b_aud_s, + ] { + append_field(&mut pi, field); + } + ConfidentialVerifierClient::new(e, &storage::get_verifier(e)).verify_proof( + &CircuitType::Transfer, + &pi, + &payout.proof, + ) + } +} + +fn append_point(pi: &mut Bytes, point: &Point) { + if !Grumpkin::is_canonical_point(point) { + panic_with_error!(pi.env(), ConfidentialTokenError::NonCanonicalEncoding); + } + pi.append(&Bytes::from(point)); +} + +fn append_field(pi: &mut Bytes, field: &BytesN<32>) { + if !Grumpkin::is_canonical_field(field) { + panic_with_error!(pi.env(), ConfidentialTokenError::NonCanonicalEncoding); + } + pi.append(&Bytes::from(field)); +} + +/// Compute r·H with the same independent blinding generator as the circuits. +fn zero_commitment(e: &Env, r: &BytesN<32>) -> Point { + let h = BytesN::from_array( + e, + &[ + 5, 74, 168, 106, 115, 203, 138, 52, 82, 94, 91, 190, 214, 228, 59, 161, 25, 142, 134, + 15, 95, 57, 80, 38, 143, 113, 223, 69, 145, 189, 228, 2, 32, 157, 207, 191, 44, 251, + 87, 249, 246, 4, 111, 68, 215, 26, 198, 250, 248, 114, 84, 175, 199, 64, 124, 4, 235, + 98, 26, 98, 135, 202, 193, 38, + ], + ); + let mut result = Grumpkin::identity(e); + for byte in r.to_array() { + for bit in (0..8).rev() { + result = Grumpkin::add(e, &result, &result); + if byte & (1 << bit) != 0 { + result = Grumpkin::add(e, &result, &h); + } + } + } + result +} + +#[cfg(test)] +mod zero_tests { + use super::*; + + #[test] + fn zero_opening_uses_the_circuit_blinding_generator() { + let e = Env::default(); + let mut one = [0u8; 32]; + one[31] = 1; + let h = zero_commitment(&e, &BytesN::from_array(&e, &one)); + assert!(Grumpkin::is_on_curve(&e, &h)); + assert_ne!(h, Grumpkin::generator(&e)); + let mut two = one; + two[31] = 2; + assert_eq!( + zero_commitment(&e, &BytesN::from_array(&e, &two)), + Grumpkin::add(&e, &h, &h) + ); + let large = [0x10u8; 32]; + assert!(Grumpkin::is_on_curve( + &e, + &zero_commitment(&e, &BytesN::from_array(&e, &large)) + )); + } +} diff --git a/contracts/token/src/lib.rs b/contracts/token/src/lib.rs index 615ee0c..9a014d1 100644 --- a/contracts/token/src/lib.rs +++ b/contracts/token/src/lib.rs @@ -36,6 +36,11 @@ use stellar_tokens::confidential::{ storage as token_storage, ConfidentialAccount, ConfidentialToken, SpenderDelegation, }; +mod escrow; + +#[cfg(test)] +mod test; + #[contract] pub struct ConfidentialTokenContract; diff --git a/contracts/token/src/test.rs b/contracts/token/src/test.rs new file mode 100644 index 0000000..84c3deb --- /dev/null +++ b/contracts/token/src/test.rs @@ -0,0 +1,229 @@ +extern crate std; + +use crate::{ConfidentialTokenContract, ConfidentialTokenContractClient}; +use soroban_sdk::{ + contract, contractimpl, symbol_short, testutils::Address as _, xdr::ToXdr, Address, Bytes, + BytesN, Env, +}; +use stellar_contract_utils::crypto::grumpkin::{Grumpkin, Point}; +use stellar_tokens::confidential::{ + storage::{ + self, ConfidentialTokenStorageKey, RegisterData, RegisterPayload, TransferData, + TransferPayload, + }, + verifier::CircuitType, + ConfidentialAccount, +}; + +#[contract] +struct Verifier; +#[contractimpl] +impl Verifier { + pub fn verify_proof( + e: &Env, + circuit_type: CircuitType, + public_inputs: Bytes, + proof: Bytes, + ) -> bool { + assert_eq!(circuit_type, CircuitType::Transfer); + e.storage() + .instance() + .set(&symbol_short!("pi"), &public_inputs); + proof == Bytes::from_array(e, &[42]) + } + pub fn inputs(e: &Env) -> Bytes { + e.storage().instance().get(&symbol_short!("pi")).unwrap() + } +} + +#[contract] +struct Auditor; +#[contractimpl] +impl Auditor { + pub fn get_key(e: &Env, auditor_id: u32) -> Point { + Grumpkin::mul(e, &Grumpkin::generator(e), u128::from(auditor_id) + 1) + } +} + +fn point(e: &Env, n: u128) -> Point { + Grumpkin::mul(e, &Grumpkin::generator(e), n) +} +fn field(e: &Env, n: u8) -> BytesN<32> { + let mut bytes = [0; 32]; + bytes[31] = n; + BytesN::from_array(e, &bytes) +} +fn transfer(e: &Env) -> TransferData { + TransferData { + proof: Bytes::from_array(e, &[42]), + payload: TransferPayload { + c_spend_new: point(e, 4), + c_tx: point(e, 5), + r_e: point(e, 6), + v_tilde: field(e, 7), + b_tilde: field(e, 8), + sigma: field(e, 9), + v_aud_r: field(e, 10), + r_aud_r: field(e, 11), + v_aud_s: field(e, 12), + b_aud_s: field(e, 13), + }, + } +} + +struct Fixture { + e: Env, + token: Address, + verifier: Address, + from: Address, + to: Address, + registration: RegisterData, + funding: TransferData, + payout: TransferData, +} +fn setup() -> Fixture { + let e = Env::default(); + e.mock_all_auths(); + let verifier = e.register(Verifier, ()); + let auditor = e.register(Auditor, ()); + let token = e.register( + ConfidentialTokenContract, + ( + Address::generate(&e), + verifier.clone(), + auditor, + Address::generate(&e), + ), + ); + let from = Address::generate(&e); + let to = Address::generate(&e); + let registration = RegisterData { + payload: RegisterPayload { + y: point(&e, 2), + pvk: point(&e, 3), + }, + proof: Bytes::new(&e), + }; + let funding = transfer(&e); + let mut payout = transfer(&e); + payout.payload.c_spend_new = Grumpkin::identity(&e); + e.as_contract(&token, || { + e.storage().persistent().set( + &ConfidentialTokenStorageKey::Account(from.clone()), + &ConfidentialAccount { + spending_key: registration.payload.y.clone(), + viewing_public_key: registration.payload.pvk.clone(), + spendable_balance: funding.payload.c_tx.clone(), + receiving_balance: Grumpkin::identity(&e), + auditor_id: 1, + }, + ); + e.storage().persistent().set( + &ConfidentialTokenStorageKey::Account(to.clone()), + &ConfidentialAccount { + spending_key: point(&e, 14), + viewing_public_key: point(&e, 15), + spendable_balance: Grumpkin::identity(&e), + receiving_balance: Grumpkin::identity(&e), + auditor_id: 2, + }, + ); + }); + Fixture { + e, + token, + verifier, + from, + to, + registration, + funding, + payout, + } +} + +#[test] +fn escrow_preflight_matches_real_token_transfer_public_inputs_without_moving_funds() { + let f = setup(); + let client = ConfidentialTokenContractClient::new(&f.e, &f.token); + let before = + f.e.as_contract(&f.token, || storage::get_account(&f.e, &f.from)); + assert!(client.verify_escrow_payout( + &f.registration.to_xdr(&f.e), + &1, + &f.funding.to_xdr(&f.e), + &f.to, + &f.payout.clone().to_xdr(&f.e), + &BytesN::from_array(&f.e, &[0; 32]) + )); + let expected = VerifierClient::new(&f.e, &f.verifier).inputs(); + assert_eq!( + before, + f.e.as_contract(&f.token, || storage::get_account(&f.e, &f.from)) + ); + // Exercise the actual pinned upstream transfer code, not another PI builder. + client.confidential_transfer(&f.from, &f.to, &f.payout.to_xdr(&f.e)); + assert_eq!(expected, VerifierClient::new(&f.e, &f.verifier).inputs()); +} + +#[test] +fn escrow_preflight_propagates_verifier_rejection() { + let mut f = setup(); + f.payout.proof = Bytes::from_array(&f.e, &[0]); + assert!( + !ConfidentialTokenContractClient::new(&f.e, &f.token).verify_escrow_payout( + &f.registration.to_xdr(&f.e), + &1, + &f.funding.to_xdr(&f.e), + &f.to, + &f.payout.to_xdr(&f.e), + &BytesN::from_array(&f.e, &[0; 32]) + ) + ); +} + +#[test] +fn escrow_preflight_rejects_malformed_payload() { + let f = setup(); + assert!(ConfidentialTokenContractClient::new(&f.e, &f.token) + .try_verify_escrow_payout( + &f.registration.to_xdr(&f.e), + &1, + &f.funding.to_xdr(&f.e), + &f.to, + &Bytes::new(&f.e), + &BytesN::from_array(&f.e, &[0; 32]) + ) + .is_err()); +} + +#[test] +fn escrow_preflight_rejects_noncanonical_public_inputs() { + let mut f = setup(); + f.payout.payload.sigma = BytesN::from_array(&f.e, &[255; 32]); + assert!(ConfidentialTokenContractClient::new(&f.e, &f.token) + .try_verify_escrow_payout( + &f.registration.to_xdr(&f.e), + &1, + &f.funding.to_xdr(&f.e), + &f.to, + &f.payout.to_xdr(&f.e), + &BytesN::from_array(&f.e, &[0; 32]) + ) + .is_err()); +} + +#[test] +fn escrow_preflight_rejects_partial_payout_even_when_transfer_verifier_accepts() { + let mut f = setup(); + f.payout.payload.c_spend_new = point(&f.e, 4); + assert!( + !ConfidentialTokenContractClient::new(&f.e, &f.token).verify_escrow_payout( + &f.registration.to_xdr(&f.e), + &1, + &f.funding.to_xdr(&f.e), + &f.to, + &f.payout.to_xdr(&f.e), + &BytesN::from_array(&f.e, &[0; 32]), + ) + ); +} diff --git a/contracts/token/test_snapshots/test/escrow_preflight_matches_real_token_transfer_public_inputs_without_moving_funds.1.json b/contracts/token/test_snapshots/test/escrow_preflight_matches_real_token_transfer_public_inputs_without_moving_funds.1.json new file mode 100644 index 0000000..931f3c4 --- /dev/null +++ b/contracts/token/test_snapshots/test/escrow_preflight_matches_real_token_transfer_public_inputs_without_moving_funds.1.json @@ -0,0 +1,365 @@ +{ + "generators": { + "address": 7, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [], + [], + [], + [], + [], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "function_name": "confidential_transfer", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "bytes": "0000001100000001000000020000000f000000077061796c6f61640000000011000000010000000a0000000f00000007625f6175645f73000000000d00000020000000000000000000000000000000000000000000000000000000000000000d0000000f00000007625f74696c6465000000000d0000002000000000000000000000000000000000000000000000000000000000000000080000000f0000000b635f7370656e645f6e6577000000000d00000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f00000004635f74780000000d000000402d0a8556b15580b949b5104b0c0b527ad61dac372081ec532fbccd2da8e263361725e2dd632b098eba49a7e9d310aba4843a67e4f40e2b98df1ca6fe4c57c49c0000000f00000007725f6175645f72000000000d00000020000000000000000000000000000000000000000000000000000000000000000b0000000f00000003725f65000000000d000000402639fb5afa37f916f0abdd25fd442bc53a8f51ad105ef675d535afca07b7cd741ae7198c38ecf03a73a7b2d98df7241c46a8bd5ba45ec44dd57f8dd994a2b2760000000f000000057369676d610000000000000d0000002000000000000000000000000000000000000000000000000000000000000000090000000f00000007765f6175645f72000000000d00000020000000000000000000000000000000000000000000000000000000000000000a0000000f00000007765f6175645f73000000000d00000020000000000000000000000000000000000000000000000000000000000000000c0000000f00000007765f74696c6465000000000d0000002000000000000000000000000000000000000000000000000000000000000000070000000f0000000570726f6f660000000000000d000000012a000000" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "pi" + }, + "val": { + "bytes": "2d0a8556b15580b949b5104b0c0b527ad61dac372081ec532fbccd2da8e263361725e2dd632b098eba49a7e9d310aba4843a67e4f40e2b98df1ca6fe4c57c49c2eff510e43fa25f29efbfd646b7ef62f11ff77a27df704e249eb061e8b1e89291495f4d469ff1a7ac1a42fef25b7e63d19862fcaf2b7cfde3a88418ebbc02d070f704f3760742131a62723bdaf8e9e49722a7ea0e221e2065e55a826ace71b63295c5ef57658847a467fd0bdb0182040919ea3be6242aa395c1b249e9d857dd32a69fbcbb6bf5fbe3c8d5a06237f8ce6c49d26bc26aebc0a94b3df5613263e45004be015a410fcd86f09c2cdbc243b54a6e3d7bbf9990e03a2c4868ab2a11b4a19f36003498da6ca6ea600ad31e9bda3a8f7c007b2777618f064c0bf95b9cac92eff510e43fa25f29efbfd646b7ef62f11ff77a27df704e249eb061e8b1e89291495f4d469ff1a7ac1a42fef25b7e63d19862fcaf2b7cfde3a88418ebbc02d07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d0a8556b15580b949b5104b0c0b527ad61dac372081ec532fbccd2da8e263361725e2dd632b098eba49a7e9d310aba4843a67e4f40e2b98df1ca6fe4c57c49c2639fb5afa37f916f0abdd25fd442bc53a8f51ad105ef675d535afca07b7cd741ae7198c38ecf03a73a7b2d98df7241c46a8bd5ba45ec44dd57f8dd994a2b276000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Account" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_id" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "receiving_balance" + }, + "val": { + "bytes": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "spendable_balance" + }, + "val": { + "bytes": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "spending_key" + }, + "val": { + "bytes": "2eff510e43fa25f29efbfd646b7ef62f11ff77a27df704e249eb061e8b1e89291495f4d469ff1a7ac1a42fef25b7e63d19862fcaf2b7cfde3a88418ebbc02d07" + } + }, + { + "key": { + "symbol": "viewing_public_key" + }, + "val": { + "bytes": "004be015a410fcd86f09c2cdbc243b54a6e3d7bbf9990e03a2c4868ab2a11b4a19f36003498da6ca6ea600ad31e9bda3a8f7c007b2777618f064c0bf95b9cac9" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Account" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_id" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "receiving_balance" + }, + "val": { + "bytes": "2d0a8556b15580b949b5104b0c0b527ad61dac372081ec532fbccd2da8e263361725e2dd632b098eba49a7e9d310aba4843a67e4f40e2b98df1ca6fe4c57c49c" + } + }, + { + "key": { + "symbol": "spendable_balance" + }, + "val": { + "bytes": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "spending_key" + }, + "val": { + "bytes": "0228011f2cbbd22dad3b9d335a55232bc439b6150d2411fe06b31e912125b2132cd113f3d0cbc3ff264558c0e8a89341ac983ed52d359e9f6eff12723b3f2c25" + } + }, + { + "key": { + "symbol": "viewing_public_key" + }, + "val": { + "bytes": "0f704f3760742131a62723bdaf8e9e49722a7ea0e221e2065e55a826ace71b63295c5ef57658847a467fd0bdb0182040919ea3be6242aa395c1b249e9d857dd3" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "AddressAsField" + } + ] + }, + "val": { + "bytes": "2a69fbcbb6bf5fbe3c8d5a06237f8ce6c49d26bc26aebc0a94b3df5613263e45" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Auditor" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "UnderlyingAsset" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Verifier" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": "801925984706572462" + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + "live_until": 6311999 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token/test_snapshots/test/escrow_preflight_propagates_verifier_rejection.1.json b/contracts/token/test_snapshots/test/escrow_preflight_propagates_verifier_rejection.1.json new file mode 100644 index 0000000..fe2a039 --- /dev/null +++ b/contracts/token/test_snapshots/test/escrow_preflight_propagates_verifier_rejection.1.json @@ -0,0 +1,316 @@ +{ + "generators": { + "address": 7, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "symbol": "pi" + }, + "val": { + "bytes": "2d0a8556b15580b949b5104b0c0b527ad61dac372081ec532fbccd2da8e263361725e2dd632b098eba49a7e9d310aba4843a67e4f40e2b98df1ca6fe4c57c49c2eff510e43fa25f29efbfd646b7ef62f11ff77a27df704e249eb061e8b1e89291495f4d469ff1a7ac1a42fef25b7e63d19862fcaf2b7cfde3a88418ebbc02d070f704f3760742131a62723bdaf8e9e49722a7ea0e221e2065e55a826ace71b63295c5ef57658847a467fd0bdb0182040919ea3be6242aa395c1b249e9d857dd32a69fbcbb6bf5fbe3c8d5a06237f8ce6c49d26bc26aebc0a94b3df5613263e45004be015a410fcd86f09c2cdbc243b54a6e3d7bbf9990e03a2c4868ab2a11b4a19f36003498da6ca6ea600ad31e9bda3a8f7c007b2777618f064c0bf95b9cac92eff510e43fa25f29efbfd646b7ef62f11ff77a27df704e249eb061e8b1e89291495f4d469ff1a7ac1a42fef25b7e63d19862fcaf2b7cfde3a88418ebbc02d07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d0a8556b15580b949b5104b0c0b527ad61dac372081ec532fbccd2da8e263361725e2dd632b098eba49a7e9d310aba4843a67e4f40e2b98df1ca6fe4c57c49c2639fb5afa37f916f0abdd25fd442bc53a8f51ad105ef675d535afca07b7cd741ae7198c38ecf03a73a7b2d98df7241c46a8bd5ba45ec44dd57f8dd994a2b276000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Account" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_id" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "receiving_balance" + }, + "val": { + "bytes": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "spendable_balance" + }, + "val": { + "bytes": "2d0a8556b15580b949b5104b0c0b527ad61dac372081ec532fbccd2da8e263361725e2dd632b098eba49a7e9d310aba4843a67e4f40e2b98df1ca6fe4c57c49c" + } + }, + { + "key": { + "symbol": "spending_key" + }, + "val": { + "bytes": "2eff510e43fa25f29efbfd646b7ef62f11ff77a27df704e249eb061e8b1e89291495f4d469ff1a7ac1a42fef25b7e63d19862fcaf2b7cfde3a88418ebbc02d07" + } + }, + { + "key": { + "symbol": "viewing_public_key" + }, + "val": { + "bytes": "004be015a410fcd86f09c2cdbc243b54a6e3d7bbf9990e03a2c4868ab2a11b4a19f36003498da6ca6ea600ad31e9bda3a8f7c007b2777618f064c0bf95b9cac9" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Account" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_id" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "receiving_balance" + }, + "val": { + "bytes": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "spendable_balance" + }, + "val": { + "bytes": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "spending_key" + }, + "val": { + "bytes": "0228011f2cbbd22dad3b9d335a55232bc439b6150d2411fe06b31e912125b2132cd113f3d0cbc3ff264558c0e8a89341ac983ed52d359e9f6eff12723b3f2c25" + } + }, + { + "key": { + "symbol": "viewing_public_key" + }, + "val": { + "bytes": "0f704f3760742131a62723bdaf8e9e49722a7ea0e221e2065e55a826ace71b63295c5ef57658847a467fd0bdb0182040919ea3be6242aa395c1b249e9d857dd3" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "AddressAsField" + } + ] + }, + "val": { + "bytes": "2a69fbcbb6bf5fbe3c8d5a06237f8ce6c49d26bc26aebc0a94b3df5613263e45" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Auditor" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "UnderlyingAsset" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Verifier" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token/test_snapshots/test/escrow_preflight_rejects_malformed_payload.1.json b/contracts/token/test_snapshots/test/escrow_preflight_rejects_malformed_payload.1.json new file mode 100644 index 0000000..4d53780 --- /dev/null +++ b/contracts/token/test_snapshots/test/escrow_preflight_rejects_malformed_payload.1.json @@ -0,0 +1,307 @@ +{ + "generators": { + "address": 7, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Account" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_id" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "receiving_balance" + }, + "val": { + "bytes": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "spendable_balance" + }, + "val": { + "bytes": "2d0a8556b15580b949b5104b0c0b527ad61dac372081ec532fbccd2da8e263361725e2dd632b098eba49a7e9d310aba4843a67e4f40e2b98df1ca6fe4c57c49c" + } + }, + { + "key": { + "symbol": "spending_key" + }, + "val": { + "bytes": "2eff510e43fa25f29efbfd646b7ef62f11ff77a27df704e249eb061e8b1e89291495f4d469ff1a7ac1a42fef25b7e63d19862fcaf2b7cfde3a88418ebbc02d07" + } + }, + { + "key": { + "symbol": "viewing_public_key" + }, + "val": { + "bytes": "004be015a410fcd86f09c2cdbc243b54a6e3d7bbf9990e03a2c4868ab2a11b4a19f36003498da6ca6ea600ad31e9bda3a8f7c007b2777618f064c0bf95b9cac9" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Account" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_id" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "receiving_balance" + }, + "val": { + "bytes": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "spendable_balance" + }, + "val": { + "bytes": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "spending_key" + }, + "val": { + "bytes": "0228011f2cbbd22dad3b9d335a55232bc439b6150d2411fe06b31e912125b2132cd113f3d0cbc3ff264558c0e8a89341ac983ed52d359e9f6eff12723b3f2c25" + } + }, + { + "key": { + "symbol": "viewing_public_key" + }, + "val": { + "bytes": "0f704f3760742131a62723bdaf8e9e49722a7ea0e221e2065e55a826ace71b63295c5ef57658847a467fd0bdb0182040919ea3be6242aa395c1b249e9d857dd3" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "AddressAsField" + } + ] + }, + "val": { + "bytes": "2a69fbcbb6bf5fbe3c8d5a06237f8ce6c49d26bc26aebc0a94b3df5613263e45" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Auditor" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "UnderlyingAsset" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Verifier" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token/test_snapshots/test/escrow_preflight_rejects_noncanonical_public_inputs.1.json b/contracts/token/test_snapshots/test/escrow_preflight_rejects_noncanonical_public_inputs.1.json new file mode 100644 index 0000000..4d53780 --- /dev/null +++ b/contracts/token/test_snapshots/test/escrow_preflight_rejects_noncanonical_public_inputs.1.json @@ -0,0 +1,307 @@ +{ + "generators": { + "address": 7, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Account" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_id" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "receiving_balance" + }, + "val": { + "bytes": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "spendable_balance" + }, + "val": { + "bytes": "2d0a8556b15580b949b5104b0c0b527ad61dac372081ec532fbccd2da8e263361725e2dd632b098eba49a7e9d310aba4843a67e4f40e2b98df1ca6fe4c57c49c" + } + }, + { + "key": { + "symbol": "spending_key" + }, + "val": { + "bytes": "2eff510e43fa25f29efbfd646b7ef62f11ff77a27df704e249eb061e8b1e89291495f4d469ff1a7ac1a42fef25b7e63d19862fcaf2b7cfde3a88418ebbc02d07" + } + }, + { + "key": { + "symbol": "viewing_public_key" + }, + "val": { + "bytes": "004be015a410fcd86f09c2cdbc243b54a6e3d7bbf9990e03a2c4868ab2a11b4a19f36003498da6ca6ea600ad31e9bda3a8f7c007b2777618f064c0bf95b9cac9" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Account" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_id" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "receiving_balance" + }, + "val": { + "bytes": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "spendable_balance" + }, + "val": { + "bytes": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "spending_key" + }, + "val": { + "bytes": "0228011f2cbbd22dad3b9d335a55232bc439b6150d2411fe06b31e912125b2132cd113f3d0cbc3ff264558c0e8a89341ac983ed52d359e9f6eff12723b3f2c25" + } + }, + { + "key": { + "symbol": "viewing_public_key" + }, + "val": { + "bytes": "0f704f3760742131a62723bdaf8e9e49722a7ea0e221e2065e55a826ace71b63295c5ef57658847a467fd0bdb0182040919ea3be6242aa395c1b249e9d857dd3" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "AddressAsField" + } + ] + }, + "val": { + "bytes": "2a69fbcbb6bf5fbe3c8d5a06237f8ce6c49d26bc26aebc0a94b3df5613263e45" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Auditor" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "UnderlyingAsset" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Verifier" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/contracts/token/test_snapshots/test/escrow_preflight_rejects_partial_payout_even_when_transfer_verifier_accepts.1.json b/contracts/token/test_snapshots/test/escrow_preflight_rejects_partial_payout_even_when_transfer_verifier_accepts.1.json new file mode 100644 index 0000000..ca5572d --- /dev/null +++ b/contracts/token/test_snapshots/test/escrow_preflight_rejects_partial_payout_even_when_transfer_verifier_accepts.1.json @@ -0,0 +1,307 @@ +{ + "generators": { + "address": 7, + "nonce": 0, + "mux_id": 0 + }, + "auth": [ + [], + [], + [], + [], + [] + ], + "ledger": { + "protocol_version": 26, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": null + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Account" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_id" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "receiving_balance" + }, + "val": { + "bytes": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "spendable_balance" + }, + "val": { + "bytes": "2d0a8556b15580b949b5104b0c0b527ad61dac372081ec532fbccd2da8e263361725e2dd632b098eba49a7e9d310aba4843a67e4f40e2b98df1ca6fe4c57c49c" + } + }, + { + "key": { + "symbol": "spending_key" + }, + "val": { + "bytes": "2eff510e43fa25f29efbfd646b7ef62f11ff77a27df704e249eb061e8b1e89291495f4d469ff1a7ac1a42fef25b7e63d19862fcaf2b7cfde3a88418ebbc02d07" + } + }, + { + "key": { + "symbol": "viewing_public_key" + }, + "val": { + "bytes": "004be015a410fcd86f09c2cdbc243b54a6e3d7bbf9990e03a2c4868ab2a11b4a19f36003498da6ca6ea600ad31e9bda3a8f7c007b2777618f064c0bf95b9cac9" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "vec": [ + { + "symbol": "Account" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "auditor_id" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "receiving_balance" + }, + "val": { + "bytes": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "spendable_balance" + }, + "val": { + "bytes": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "key": { + "symbol": "spending_key" + }, + "val": { + "bytes": "0228011f2cbbd22dad3b9d335a55232bc439b6150d2411fe06b31e912125b2132cd113f3d0cbc3ff264558c0e8a89341ac983ed52d359e9f6eff12723b3f2c25" + } + }, + { + "key": { + "symbol": "viewing_public_key" + }, + "val": { + "bytes": "0f704f3760742131a62723bdaf8e9e49722a7ea0e221e2065e55a826ace71b63295c5ef57658847a467fd0bdb0182040919ea3be6242aa395c1b249e9d857dd3" + } + } + ] + } + } + }, + "ext": "v0" + }, + "live_until": 518400 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "AddressAsField" + } + ] + }, + "val": { + "bytes": "2a69fbcbb6bf5fbe3c8d5a06237f8ce6c49d26bc26aebc0a94b3df5613263e45" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Auditor" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4" + } + }, + { + "key": { + "vec": [ + { + "symbol": "UnderlyingAsset" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M" + } + }, + { + "key": { + "vec": [ + { + "symbol": "Verifier" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + "live_until": 4095 + }, + { + "entry": { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + "live_until": 4095 + } + ] + }, + "events": [] +} \ No newline at end of file diff --git a/packages/app/app/docs/page.tsx b/packages/app/app/docs/page.tsx index 7f05a35..646173d 100644 --- a/packages/app/app/docs/page.tsx +++ b/packages/app/app/docs/page.tsx @@ -384,27 +384,31 @@ No delivery -> depositor waits for timeout -> reclaims (REFUNDED)`} (Timeout Refund / Claim / Dispute) until it actually opens, so there's no guessing at when a call will succeed.

-

Funding: two calls, not one

+

Funding and payout validation

Funding is the expensive step, proof-wise — the depositor derives a one-time Grumpkin identity for the instance itself and builds four proofs: a register proof for that identity, a transfer-in proof (depositor → instance), and — because the instance can never generate a proof on its own later — both possible payout proofs up front, instance → recipient and instance → depositor. At roughly 14KB each, all four together exceed what fits in one - Soroban transaction, so funding is two calls (two wallet confirmations, back to back): + Soroban transaction. Four wallet confirmations prepare the inputs, verify each payout, and fund:

-
{`store_payout_proofs(release_proof, refund_proof)   // stored first
-fund(register_data, auditor_id, transfer_in)       // then this moves the money`}
+
{`prepare_funding(register_data, auditor_id, transfer_in)
+store_payout_proof(true, release_proof)    // verifies recipient payout
+store_payout_proof(false, refund_proof)    // verifies depositor refund
+fund()                                   // atomically registers, transfers and merges`}

- fund checks the payout proofs are already stored before it will run, so the - escrow can never end up Funded without a working settlement path already in - place. Once funding completes, the depositor discards the instance's one-time secret — + fund requires both payout proofs to have passed verification against the exact + prepared funding commitment. Replacing the funding inputs clears both approvals. Funds + move only in the last call; a rejected proof leaves the escrow unfunded. Once funding completes, the depositor discards the instance's one-time secret — see the trust caveat below.

Settlement

Every payout proof was generated once, at funding time, against a fixed opening. That's - what lets the instance submit one of them unattended, whenever the state machine says so: no + what lets the instance submit one of them unattended, whenever the state machine says so. + Funding merges once, atomically; settlement never merges later deposits, so unsolicited + credits cannot change that fixed opening. No one needs to be online or hold a key at settlement time. On the happy path the recipient marks delivery, a 10-minute release window opens, and the depositor releases. If the depositor stalls, the recipient either self-serves after the window (no arbiter) or escalates diff --git a/packages/app/app/escrow/page.tsx b/packages/app/app/escrow/page.tsx index 4620a9d..279f558 100644 --- a/packages/app/app/escrow/page.tsx +++ b/packages/app/app/escrow/page.tsx @@ -278,8 +278,8 @@ export default function EscrowPage() { />

Funding generates a register proof for the escrow's confidential account, plus the - transfer-in and two payout proofs — all in your browser. This needs two wallet - confirmations, submitted one after the other. + transfer-in and two payout proofs — all in your browser. Four wallet confirmations + prepare funding, verify both payouts, and finally move the funds.

+ + + ); + } + if (!registered) { return ( diff --git a/packages/app/app/send/page.tsx b/packages/app/app/send/page.tsx index 7c5c36f..e6c81d3 100644 --- a/packages/app/app/send/page.tsx +++ b/packages/app/app/send/page.tsx @@ -2,6 +2,7 @@ import { useEffect, useState } from "react"; import { motion } from "framer-motion"; +import { StrKey } from "@stellar/stellar-sdk"; import { CheckCircle, ExternalLink, Lock } from "lucide-react"; import { AppShell } from "@/components/layout/AppShell"; import { PageHeader } from "@/components/layout/PageHeader"; @@ -20,30 +21,53 @@ import { ConnectPrompt } from "@/components/ui/ConnectPrompt"; import { ErrorBanner } from "@/components/ui/ErrorBanner"; import { useAction } from "@/lib/use-action"; import { toBaseUnits, formatAmount, DECIMALS } from "@/lib/amount"; -import { errMsg } from "@/lib/err"; type Step = "recipient" | "amount" | "confirm"; +type RecipientCheck = { + address: string; + wallet: object; + status: "checking" | "registered" | "unregistered" | "error"; +}; export default function SendPage() { const wallet = useRequireWallet(); const { view, error, setError } = useWallet(); const { run, busy, phase } = useAction(); const [step, setStep] = useState("recipient"); - const [recipients, setRecipients] = useState(null); const [to, setTo] = useState(""); + const [recipientCheck, setRecipientCheck] = useState(null); + const [checkAttempt, setCheckAttempt] = useState(0); const [amount, setAmount] = useState(""); const [txHash, setTxHash] = useState(null); useEffect(() => { - if (!wallet) return; - wallet - .registeredRecipients() - .then(setRecipients) - .catch((e) => { - setError(errMsg(e)); - setRecipients([]); - }); - }, [wallet, setError]); + const address = to.trim(); + if (!wallet || !StrKey.isValidEd25519PublicKey(address)) return; + let cancelled = false; + setRecipientCheck({ address, wallet, status: "checking" }); + const timer = setTimeout(async () => { + try { + const registered = await wallet.isRecipientRegistered(address); + if (!cancelled) setRecipientCheck({ address, wallet, status: registered ? "registered" : "unregistered" }); + } catch { + if (!cancelled) setRecipientCheck({ address, wallet, status: "error" }); + } + }, 350); + return () => { cancelled = true; clearTimeout(timer); }; + }, [wallet, to, checkAttempt]); + + const recipientAddress = to.trim(); + const validAddress = StrKey.isValidEd25519PublicKey(recipientAddress); + const recipientStatus = recipientCheck?.wallet === wallet && recipientCheck.address === recipientAddress + ? recipientCheck.status : null; + const recipientReady = validAddress && recipientStatus === "registered"; + const recipientError = recipientAddress && !validAddress + ? "Enter a valid Stellar public address beginning with G." + : recipientStatus === "unregistered" + ? "This address is not registered with Lucent on Testnet. Ask the recipient to connect and register first." + : recipientStatus === "error" + ? "Could not check registration. Retry to continue." + : undefined; if (!wallet) { return ( @@ -55,6 +79,7 @@ export default function SendPage() { } async function submit() { + if (!recipientReady) { setStep("recipient"); return; } setTxHash(null); await run("send", async (sp) => { const r = await wallet!.transfer(to.trim(), toBaseUnits(amount || "0"), sp); @@ -138,26 +163,22 @@ export default function SendPage() { placeholder="G…" value={to} onChange={(e) => setTo(e.target.value)} - className="font-mono" + className={`font-mono ${recipientError ? "border-error/50" : ""}`} + autoComplete="off" + spellCheck={false} + aria-invalid={!!recipientError} + aria-describedby="recipient-status" /> +
+ {recipientError ?

{recipientError}

: + recipientReady ?

Registered with Lucent on Testnet.

: + validAddress ?

Checking registration…

: +

Paste the recipient’s Stellar public address. We’ll check their Lucent registration before you continue.

} + {recipientStatus === "error" && } +
- {recipients && recipients.length > 0 && ( - <> - Registered accounts -
- {recipients.map((a) => ( - - ))} -
- - )} - - @@ -186,7 +207,7 @@ export default function SendPage() { - @@ -224,7 +245,7 @@ export default function SendPage() { - diff --git a/packages/app/lib/wallet-context.tsx b/packages/app/lib/wallet-context.tsx index 8205e23..3e46227 100644 --- a/packages/app/lib/wallet-context.tsx +++ b/packages/app/lib/wallet-context.tsx @@ -82,6 +82,8 @@ export function WalletProvider({ children }: { children: ReactNode }) { setConnecting(true); try { const w = await ConfidentialWallet.connect(log); + setView(null); + setLastSync(null); setWallet(w); const v = await w.refresh(); setView(v); @@ -111,15 +113,15 @@ export function WalletProvider({ children }: { children: ReactNode }) { if (localStorage.getItem(MANUALLY_DISCONNECTED_KEY)) return; freighterIsAllowed().then(async (allowed) => { if (!allowed) return; - const w = await connect(); - // Unprompted attempt — if it failed, clear the error connect() set - // rather than surfacing it for something the user didn't initiate. - if (!w) setError(null); + await connect(); + // Preserve account-read/recovery errors so a connected wallet never + // silently falls into the registration screen after a failed refresh. }); }, [connect]); const refresh = useCallback(async () => { if (!wallet) return; + setError(null); try { const v = await wallet.refresh(); setView(v); diff --git a/packages/app/lib/wallet.ts b/packages/app/lib/wallet.ts index 8aeba71..58b24ab 100644 --- a/packages/app/lib/wallet.ts +++ b/packages/app/lib/wallet.ts @@ -52,7 +52,8 @@ import { // escrow submitCreateEscrow, parseCreatedEscrow, - submitStorePayoutProofs, + submitPrepareFunding, + submitStorePayoutProof, submitFund, submitMarkCompleted, submitRelease, @@ -185,15 +186,34 @@ export class ConfidentialWallet { // indexer (if present), so a stale deployment no longer makes sync throw. const fromLedger: number = DEPLOYMENT.deployedAtLedger; + const store = new LocalStorageStore(`lucent:state:${DEPLOYMENT.networkPassphrase}:${DEPLOYMENT.contracts.token}:`); const engine = new StateEngine({ client, - store: new LocalStorageStore(), + store, keys, address: signer.publicKey, fromLedger, indexer, }); + // Preserve a legacy cache only when its openings and this deployment's + // registered keys match the chain. Never reuse its deployment-less cursor: + // capture a fresh chain cursor, then recheck before committing the migration. + if (!(await store.load(signer.publicKey))) { + const legacy = await new LocalStorageStore().load(signer.publicKey); + const acct = legacy ? await client.confidentialBalance(signer.publicKey) : null; + if (legacy && acct && acct.spendingKey.equals(keys.Y) && acct.viewingPublicKey.equals(keys.PVK)) { + const candidate = new StateEngine({ client, store: new LocalStorageStore(), keys, + address: signer.publicKey, fromLedger, indexer }); + if ((await candidate.verifyAgainstChain()).ok) { + const tip = await hybridFetchEvents(client, undefined, { fromLedger: (await client.server.getHealth()).latestLedger }); + if ((await candidate.verifyAgainstChain()).ok && tip.cursor) { + await store.save({ ...legacy, cursor: tip.cursor, syncedLedger: tip.latestLedger }); + } + } + } + } + return new ConfidentialWallet(signer.publicKey, signer, keys, client, engine, indexer, log); } @@ -211,7 +231,20 @@ export class ConfidentialWallet { return this.client.confidentialBalance(this.address); } + /** Direct lookup, independent of event-history retention or local caches. */ + async isRecipientRegistered(address: string): Promise { + return this.client.isRegistered(address); + } + async register(onPhase?: (p: TxPhase) => void): Promise { + const existing = await this.account(); + if (existing) { + if (!existing.spendingKey.equals(this.keys.Y) || !existing.viewingPublicKey.equals(this.keys.PVK)) { + throw new Error("This account is already registered, but its confidential keys do not match this wallet. Restore the original confidential keys before transacting."); + } + this.log("already registered on-chain; refreshing account state"); + return; + } const w = buildRegisterWitness(this.keys); onPhase?.("proving"); this.log("proving register…"); @@ -546,19 +579,20 @@ export class ConfidentialWallet { const refundProof = new Uint8Array(encodeTransferData(ref, refProof).bytes()); onPhase?.("submitting"); - // Two transactions, not one: all four proofs together exceed Soroban's - // per-transaction size ceiling (see the contract's `fund` doc comment). - this.log("submitting payout proofs…"); - await submitStorePayoutProofs(this.client, this.signer, instance, { - releaseProof, - refundProof, - }); - this.log("submitting fund…"); - const r = await submitFund(this.client, this.signer, instance, { + // Validate both branches before moving funds. Separate proof transactions + // stay below Soroban's transaction size limit. + this.log("preparing escrow funding…"); + await submitPrepareFunding(this.client, this.signer, instance, { registerData, auditorId: DEPLOYMENT.auditorId, transferIn, }); + this.log("validating recipient payout…"); + await submitStorePayoutProof(this.client, this.signer, instance, true, releaseProof, rel.next.r); + this.log("validating refund payout…"); + await submitStorePayoutProof(this.client, this.signer, instance, false, refundProof, ref.next.r); + this.log("submitting fund…"); + const r = await submitFund(this.client, this.signer, instance); await this.engine.setSpendable(tin.next); this.log(`escrow funded (tx ${r.hash.slice(0, 10)}…)`); } @@ -810,8 +844,11 @@ export class ConfidentialWallet { /** Sync from RPC events, verify against chain, and return a UI view. */ async refresh(): Promise { - const state: AccountState = await this.engine.sync(); const onchain = await this.account(); + if (onchain && (!onchain.spendingKey.equals(this.keys.Y) || !onchain.viewingPublicKey.equals(this.keys.PVK))) { + throw new Error("This account is already registered, but its confidential keys do not match this wallet. Restore the original confidential keys before transacting."); + } + const state: AccountState = await this.engine.sync(); let matchesChain: boolean | null = null; if (onchain) { matchesChain = (await this.engine.verifyAgainstChain()).ok; diff --git a/packages/sdk/contracts/confidential_token.wasm b/packages/sdk/contracts/confidential_token.wasm index 6520f48..f6a0a26 100644 Binary files a/packages/sdk/contracts/confidential_token.wasm and b/packages/sdk/contracts/confidential_token.wasm differ diff --git a/packages/sdk/contracts/private_escrow_instance.wasm b/packages/sdk/contracts/private_escrow_instance.wasm index 7278934..0bbcc7b 100644 Binary files a/packages/sdk/contracts/private_escrow_instance.wasm and b/packages/sdk/contracts/private_escrow_instance.wasm differ diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 7770b9e..527ec31 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -24,8 +24,8 @@ "scripts": { "build": "tsc -p tsconfig.json", "typecheck": "tsc -p tsconfig.json --noEmit", - "test": "tsx test/smoke.mjs && tsx test/parity.mjs && tsx test/payload.mjs && tsx test/auditor.mjs && tsx test/ephemeral.mjs && tsx test/dedup.mjs && tsx test/indexer-parity.mjs && tsx test/prove.mjs && tsx test/disclosure.mjs", - "test:fast": "tsx test/smoke.mjs && tsx test/parity.mjs && tsx test/payload.mjs && tsx test/auditor.mjs && tsx test/ephemeral.mjs && tsx test/dedup.mjs && tsx test/indexer-parity.mjs" + "test": "tsx test/restore.mjs && tsx test/account-status.mjs && tsx test/smoke.mjs && tsx test/parity.mjs && tsx test/payload.mjs && tsx test/auditor.mjs && tsx test/ephemeral.mjs && tsx test/dedup.mjs && tsx test/event-pagination.mjs && tsx test/state-recovery.mjs && tsx test/state-namespace.mjs && tsx test/indexer-parity.mjs && tsx test/prove.mjs && tsx test/disclosure.mjs", + "test:fast": "tsx test/restore.mjs && tsx test/account-status.mjs && tsx test/smoke.mjs && tsx test/parity.mjs && tsx test/payload.mjs && tsx test/auditor.mjs && tsx test/ephemeral.mjs && tsx test/dedup.mjs && tsx test/event-pagination.mjs && tsx test/state-recovery.mjs && tsx test/state-namespace.mjs && tsx test/indexer-parity.mjs" }, "dependencies": { "@aztec/bb.js": "0.87.0", diff --git a/packages/sdk/src/chain/client.ts b/packages/sdk/src/chain/client.ts index 1c5a64e..c332c68 100644 --- a/packages/sdk/src/chain/client.ts +++ b/packages/sdk/src/chain/client.ts @@ -16,6 +16,10 @@ import { TransactionBuilder, BASE_FEE, rpc, + scValToNative, + Operation, + SorobanDataBuilder, + type Transaction, } from "@stellar/stellar-sdk"; import { pointFromBytes, type Point } from "../crypto/grumpkin.js"; @@ -123,8 +127,14 @@ export class ChainClient { new Address(address).toScVal(), ]); return parseAccount(retval); - } catch { - return null; + } catch (error) { + // Only the token's explicit AccountNotRegistered error means absence. + // RPC outages, archived entries and malformed responses must stay errors. + if (error instanceof Error && + /^simulate confidential_balance failed: HostError: Error\(Contract, #3501\)/.test(error.message)) { + return null; + } + throw error; } } @@ -156,6 +166,7 @@ export class ChainClient { method: string, args: xdr.ScVal[], signer: Signer, + restored = false, ): Promise { const source = await this.server.getAccount(signer.publicKey); const tx = new TransactionBuilder(source, { @@ -170,14 +181,56 @@ export class ChainClient { if (rpc.Api.isSimulationError(sim)) { throw new Error(`simulate ${method} failed: ${sim.error}`); } + const data = sim.transactionData.build(); + const archived = data.ext().switch() === 1 + ? data.ext().resourceExt().archivedSorobanEntries() + : []; + if (archived.length) { + if (restored) throw new Error(`${method}: ledger entries are still archived after restoration; retry the account operation`); + // Auto-restoration plus the invocation can exceed the network write + // limit even when each operation fits separately. Restore first, then + // rebuild from a fresh sequence number and fresh simulation. + const footprint = data.resources().footprint().readWrite(); + const restoreTx = new TransactionBuilder(await this.server.getAccount(signer.publicKey), { + fee: BASE_FEE, + networkPassphrase: this.cfg.networkPassphrase, + }) + .setSorobanData(new SorobanDataBuilder().setReadWrite(archived.map(index => { + const key = footprint[index]; + if (!key) throw new Error("Simulation returned an invalid archived entry index"); + return key; + })).build()) + .addOperation(Operation.restoreFootprint({})) + .setTimeout(180) + .build(); + const restoreSim = await this.server.simulateTransaction(restoreTx); + if (rpc.Api.isSimulationError(restoreSim)) { + throw new Error(`simulate restore for ${method} failed: ${restoreSim.error}`); + } + await this.submit(rpc.assembleTransaction(restoreTx, restoreSim).build(), signer, `restore for ${method}`); + return this.invoke(contractId, method, args, signer, true); + } const assembled = rpc.assembleTransaction(tx, sim).build(); + return this.submit(assembled, signer, method); + } + private async submit(assembled: Transaction, signer: Signer, method: string): Promise { const signedXdr = await signer.sign(assembled.toXDR()); const signedTx = TransactionBuilder.fromXDR(signedXdr, this.cfg.networkPassphrase); const send = await this.server.sendTransaction(signedTx); if (send.status === "ERROR") { - throw new Error(`send ${method} rejected: ${JSON.stringify(send.errorResult)}`); + const diagnostics = (send.diagnosticEvents ?? []).map((diagnostic) => { + const event = diagnostic.event().body().v0(); + return JSON.stringify({ + topics: event.topics().map((topic) => scValToNative(topic)), + data: scValToNative(event.data()), + }, (_, value) => typeof value === "bigint" ? value.toString() : value); + }); + throw new Error( + `send ${method} rejected (${send.errorResult?.result().switch().name ?? "unknown"}, tx ${send.hash})` + + (diagnostics.length ? `: ${diagnostics.join("; ")}` : `: ${JSON.stringify(send.errorResult)}`), + ); } for (let i = 0; i < MAX_POLL_ATTEMPTS; i++) { diff --git a/packages/sdk/src/chain/escrow.ts b/packages/sdk/src/chain/escrow.ts index aa4615d..bd4b774 100644 --- a/packages/sdk/src/chain/escrow.ts +++ b/packages/sdk/src/chain/escrow.ts @@ -1,21 +1,15 @@ /** - * Submitters for the PrivateEscrow factory and the per-escrow instance it - * deploys. - * - * `create_escrow` (factory) deploys a fresh instance contract — its own - * confidential account. Funding an instance is two calls, not one: - * `store_payout_proofs` stores the two pre-generated payout proofs (instance -> - * recipient and instance -> depositor) the state machine later selects between, - * then `fund` carries the register proof for the instance's Grumpkin identity - * plus the depositor's transfer-in. They're split because all four ~14KB - * UltraHonk proofs together exceed Soroban's per-transaction size ceiling. All - * blobs are built in the browser; this module only submits them. + * Private escrow submitters. Funding takes four transactions: prepare the + * registration/funding inputs, validate each payout proof, then fund. No value + * moves until both settlement branches have been verified on-chain. */ import { xdr, Address, nativeToScVal, scValToNative } from "@stellar/stellar-sdk"; import type { ChainClient, Signer, InvokeResult } from "./client.js"; +import { toBytes32BE } from "../crypto/field.js"; + const addr = (a: string): xdr.ScVal => new Address(a).toScVal(); const u64 = (v: bigint): xdr.ScVal => nativeToScVal(v, { type: "u64" }); const u32 = (v: number): xdr.ScVal => xdr.ScVal.scvU32(v); @@ -67,41 +61,33 @@ export async function readEscrowAddress( // ---- instance -------------------------------------------------------------- -/** - * `store_payout_proofs(release_proof, refund_proof)`. Must be submitted before - * `submitFund` — see the module doc comment for why this is a separate call. - */ -export function submitStorePayoutProofs( +/** Store the exact registration and transfer inputs to validate and later execute. */ +export function submitPrepareFunding( client: ChainClient, signer: Signer, instance: string, - args: { releaseProof: Uint8Array; refundProof: Uint8Array }, + args: { registerData: Uint8Array; auditorId: number; transferIn: Uint8Array }, ): Promise { - return client.invoke( - instance, - "store_payout_proofs", - [bytes(args.releaseProof), bytes(args.refundProof)], - signer, - ); + return client.invoke(instance, "prepare_funding", + [bytes(args.registerData), u32(args.auditorId), bytes(args.transferIn)], signer); } -/** `fund(register_data, auditor_id, transfer_in)`. Call `submitStorePayoutProofs` first. */ -export function submitFund( +/** Validate a payout and its zero remaining-balance opening against the prepared funding commitment. */ +export function submitStorePayoutProof( client: ChainClient, signer: Signer, instance: string, - args: { - registerData: Uint8Array; - auditorId: number; - transferIn: Uint8Array; - }, + release: boolean, + proof: Uint8Array, + remainingBlinding: bigint, ): Promise { - return client.invoke( - instance, - "fund", - [bytes(args.registerData), u32(args.auditorId), bytes(args.transferIn)], - signer, - ); + return client.invoke(instance, "store_payout_proof", + [xdr.ScVal.scvBool(release), bytes(proof), bytes(toBytes32BE(remainingBlinding))], signer); +} + +/** Atomically register, fund, and merge the prepared transfer after validation. */ +export function submitFund(client: ChainClient, signer: Signer, instance: string): Promise { + return client.invoke(instance, "fund", [], signer); } /** `mark_completed(proof_uri)` — recipient. */ diff --git a/packages/sdk/src/chain/event-source.ts b/packages/sdk/src/chain/event-source.ts index b60f2d8..aeee89a 100644 --- a/packages/sdk/src/chain/event-source.ts +++ b/packages/sdk/src/chain/event-source.ts @@ -16,8 +16,10 @@ * belt-and-suspenders guard for the boundary ledger (and because * `StateEngine.apply` is not idempotent, a stray duplicate would double-count). * - * The indexer is OPTIONAL: when `indexer` is `undefined` or a call throws, this - * degrades to today's RPC-only behavior (pre-window history simply unavailable). + * The indexer is OPTIONAL: when `indexer` is `undefined`, this + * degrades to RPC-only behavior (pre-window history simply unavailable). A + * configured indexer failing or lagging behind the seam must fail the sync, + * preserving the stored cursor so the missing history can be retried. */ import { @@ -82,8 +84,8 @@ export async function hybridFetchEvents( // `next` is the first ledger we still need. Using cursorLedger+1 assumes the // previous sync consumed the cursor's ledger in full — true here because // fetchEvents pages all the way to the chain head, so a stored cursor only - // ever sits at a ledger boundary unless a single ledger emits more than - // pageLimit (100) token events, which this demo never produces. + // ever sits at a ledger boundary: full pages at the head are drained before + // fetchEvents accepts the final resume cursor. const next = opts.startCursor ? cursorLedger(opts.startCursor) + 1 : opts.fromLedger; // The retention floor is only needed to decide the indexer seam or to clamp a @@ -102,19 +104,17 @@ export async function hybridFetchEvents( // [seam, head], disjoint by construction. The stale cursor (if any) is // discarded — it points before the window and the RPC would reject it. const seam = rpcOldest + RPC_SEAM_MARGIN; - try { - const res = await indexer.fetchEvents({ - contractId: tokenId, - startLedger: next, - endLedger: seam - 1, - }); - old = res.events; - } catch (e) { - console.warn( - `[ctd] indexer backfill failed (${String((e as Error)?.message ?? e)}); ` + - `pre-window history before ledger ${seam} is unavailable this sync`, - ); + // Do not advance the durable cursor past missing history (upstream + // stellar-confidential-token-demo deadce9). Also reject incomplete backfill. + const res = await indexer.fetchEvents({ + contractId: tokenId, + startLedger: next, + endLedger: seam - 1, + }); + if (res.latestLedger < seam - 1) { + throw new Error(`indexer backfill incomplete: synced ${res.latestLedger}, need ${seam - 1}`); } + old = res.events; recent = await fetchEvents(client, { startLedger: seam }); } else if (opts.startCursor) { // Warm path: resume RPC from the stored cursor. Indexer untouched. diff --git a/packages/sdk/src/chain/events.ts b/packages/sdk/src/chain/events.ts index 14f4ef1..ba4e1a7 100644 --- a/packages/sdk/src/chain/events.ts +++ b/packages/sdk/src/chain/events.ts @@ -263,8 +263,11 @@ export async function fetchEvents( // there, returning a cursor at the end of the SCANNED range. Page until // that cursor catches up with the RPC's latest ledger. if (!resp.cursor) break; - if (cursorLedger(resp.cursor) >= resp.latestLedger) break; - if (resp.cursor === prevCursor) break; // defensive: no forward progress + if (cursorLedger(resp.cursor) >= resp.latestLedger && resp.events.length < limit) break; + if (resp.cursor === prevCursor) { + if (resp.events.length >= limit) throw new Error("event pagination made no forward progress"); + break; + } } return { events: out, cursor: resumeCursor, latestLedger }; @@ -302,21 +305,25 @@ export async function resolveEventRef( client: ChainClient, ref: EventRef, ): Promise { - const resp = await client.server.getEvents({ - filters: [{ type: "contract", contractIds: [client.cfg.contracts.token] }], - startLedger: ref.ledger, - endLedger: ref.ledger + 1, - limit: 200, - }); - // Match on the normalized id (parseEvent sets cursor = naturalEventId), so a - // ref pinned from either source resolves here. - const matches = resp.events - .map(parseEvent) - .filter((ev): ev is ConfidentialEvent => ev !== null && ev.cursor === ref.id); - if (matches.length !== 1) return null; - const ev = matches[0]!; - if (ev.txHash !== ref.txHash) return null; - return ev; + let cursor: string | undefined; + for (;;) { + const resp = await client.server.getEvents({ + filters: [{ type: "contract", contractIds: [client.cfg.contracts.token] }], + ...(cursor ? { cursor } : { startLedger: ref.ledger, endLedger: ref.ledger + 1 }), + limit: 200, + }); + const matches = resp.events.map(parseEvent).filter( + (ev): ev is ConfidentialEvent => ev !== null && ev.cursor === ref.id, + ); + if (matches.length > 1) return null; + if (matches.length === 1) { + const ev = matches[0]!; + return ev.ledger === ref.ledger && ev.txHash === ref.txHash ? ev : null; + } + if (!resp.cursor || resp.events.length < 200 || resp.events.some((ev) => ev.ledger > ref.ledger)) return null; + if (resp.cursor === cursor) throw new Error("event resolution pagination made no forward progress"); + cursor = resp.cursor; + } } /** diff --git a/packages/sdk/src/crypto/field.ts b/packages/sdk/src/crypto/field.ts index 5c2a678..ac7bdb3 100644 --- a/packages/sdk/src/crypto/field.ts +++ b/packages/sdk/src/crypto/field.ts @@ -4,7 +4,7 @@ * representative" lives here. */ -import { FR_MODULUS } from "./constants.js"; +import { FR_MODULUS, FP_MODULUS } from "./constants.js"; /** Reduce into `[0, r)`. */ export function frMod(x: bigint): bigint { @@ -22,6 +22,12 @@ export function frSub(a: bigint, b: bigint): bigint { return frMod(a - b); } +/** Add commitment blindings modulo the Grumpkin group order (not its base field). */ +export function fpAdd(a: bigint, b: bigint): bigint { + const sum = (a + b) % FP_MODULUS; + return sum < 0n ? sum + FP_MODULUS : sum; +} + /** True iff `x` is a canonical representative (`0 <= x < r`). */ export function isCanonicalFr(x: bigint): boolean { return x >= 0n && x < FR_MODULUS; diff --git a/packages/sdk/src/state/engine.ts b/packages/sdk/src/state/engine.ts index f331671..92558aa 100644 --- a/packages/sdk/src/state/engine.ts +++ b/packages/sdk/src/state/engine.ts @@ -26,7 +26,7 @@ */ import { commit, ecdh, type Point } from "../crypto/grumpkin.js"; -import { frAdd, frMod } from "../crypto/field.js"; +import { fpAdd, frMod } from "../crypto/field.js"; import { DOMAIN } from "../crypto/constants.js"; import { deriveSpendR, deriveTxBlind, poseidonWithDomain } from "../crypto/poseidon2.js"; import type { KeyPair } from "../crypto/keys.js"; @@ -90,7 +90,7 @@ export class StateEngine { if (ev.account === me) { state.spendable = { v: state.spendable.v + state.receiving.v, - r: frAdd(state.spendable.r, state.receiving.r), + r: fpAdd(state.spendable.r, state.receiving.r), }; state.receiving = { v: 0n, r: 0n }; } @@ -106,7 +106,7 @@ export class StateEngine { const { vTx, rTx } = this.decryptIncoming(ev.rE, ev.vTilde, ev.sigma); state.receiving = { v: state.receiving.v + vTx, - r: frAdd(state.receiving.r, rTx), + r: fpAdd(state.receiving.r, rTx), }; } break; @@ -165,7 +165,7 @@ export class StateEngine { const state = await this.current(); state.spendable = { v: state.spendable.v + state.receiving.v, - r: frAdd(state.spendable.r, state.receiving.r), + r: fpAdd(state.spendable.r, state.receiving.r), }; state.receiving = { v: 0n, r: 0n }; await this.cfg.store.save(state); diff --git a/packages/sdk/test/account-status.mjs b/packages/sdk/test/account-status.mjs new file mode 100644 index 0000000..e437ea8 --- /dev/null +++ b/packages/sdk/test/account-status.mjs @@ -0,0 +1,27 @@ +import assert from "node:assert/strict"; +import { ChainClient } from "../src/chain/client.ts"; +import { G, pointToBytes } from "../src/crypto/grumpkin.ts"; +import { xdr, nativeToScVal } from "@stellar/stellar-sdk"; + +const client = new ChainClient({ rpcUrl: "https://example.com", networkPassphrase: "test", contracts: { token: "token" } }); +const address = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"; +const absent = new Error("simulate confidential_balance failed: HostError: Error(Contract, #3501)\nEvent log"); +client.simulate = async () => { throw absent; }; +assert.equal(await client.confidentialBalance(address), null); +assert.equal(await client.isRegistered(address), false); + +for (const error of [new Error("network unavailable"), new Error("simulate confidential_balance failed: HostError: Error(Storage, MissingValue)"), { code: -32603, message: "RPC unavailable" }]) { + client.simulate = async () => { throw error; }; + await assert.rejects(client.confidentialBalance(address), e => e === error); +} +client.simulate = async () => xdr.ScVal.scvVoid(); +await assert.rejects(client.confidentialBalance(address)); + +const point = () => nativeToScVal(Buffer.from(pointToBytes(G)), { type: "bytes" }); +client.simulate = async () => xdr.ScVal.scvMap([ + ...["spending_key", "viewing_public_key", "spendable_balance", "receiving_balance"].map(key => new xdr.ScMapEntry({ key: xdr.ScVal.scvSymbol(key), val: point() })), + new xdr.ScMapEntry({ key: xdr.ScVal.scvSymbol("auditor_id"), val: xdr.ScVal.scvU32(0) }), +]); +assert.equal(await client.isRegistered(address), true); +assert((await client.confidentialBalance(address)).spendingKey.equals(G)); +console.log("account-status: registered, absent, RPC failure, archived data, and malformed response passed"); diff --git a/packages/sdk/test/event-pagination.mjs b/packages/sdk/test/event-pagination.mjs new file mode 100644 index 0000000..24bbcce --- /dev/null +++ b/packages/sdk/test/event-pagination.mjs @@ -0,0 +1,29 @@ +import assert from "node:assert/strict"; +import { xdr, Address, Keypair, nativeToScVal } from "@stellar/stellar-sdk"; +import { fetchEvents, resolveEventRef, naturalEventId } from "../src/chain/events.ts"; +const ledger = 100; +const cursor = (i) => `${BigInt(ledger) << 32n}-${i}`; +const address = Keypair.random().publicKey(); +const event = (i) => ({ + id: cursor(i), ledger, txHash: "tx", topic: [xdr.ScVal.scvSymbol("deposit"), + new Address(address).toScVal(), new Address(address).toScVal()], + value: xdr.ScVal.scvMap([new xdr.ScMapEntry({ key: xdr.ScVal.scvSymbol("amount"), + val: nativeToScVal(1n, { type: "i128" }) })]), +}); +let calls = 0; +const client = { cfg: { contracts: { token: "token" } }, server: { + getEvents: async (req) => { + calls++; + return req.cursor ? { events: [event(201)], cursor: cursor(202), latestLedger: ledger } + : { events: Array.from({ length: req.limit }, (_, i) => event(i)), cursor: cursor(200), latestLedger: ledger }; + }, +}}; +const result = await fetchEvents(client, { startLedger: ledger, pageLimit: 200 }); +assert.equal(result.events.length, 201); +assert.equal(calls, 2); +calls = 0; +const resolved = await resolveEventRef(client, { ledger, txHash: "tx", + id: naturalEventId({ ledger, txHash: "tx", opIndex: 0, eventIndex: 201 }) }); +assert.equal(resolved?.amount, 1n); +assert.equal(calls, 2); +console.log("event-pagination: full head-ledger pages and disclosure lookup passed"); diff --git a/packages/sdk/test/restore.mjs b/packages/sdk/test/restore.mjs new file mode 100644 index 0000000..ce91bb9 --- /dev/null +++ b/packages/sdk/test/restore.mjs @@ -0,0 +1,29 @@ +import assert from 'node:assert/strict'; +import {Account, Contract, SorobanDataBuilder, xdr} from '@stellar/stellar-sdk'; +import {ChainClient} from '../src/chain/client.ts'; +const address='GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF'; +const contract='CACKEFUKVPBGDJM6Z4NOTY3H44MUMJDYIRNBLH6MDFN3QUSFWENXAABF'; +const key=new Contract(contract).getFootprint(); +const client=new ChainClient({rpcUrl:'https://example.com',networkPassphrase:'test',contracts:{token:contract}}); +let simulations=0, accounts=0; +const submissions=[]; +client.server.getAccount=async()=>new Account(address,String(++accounts)); +client.server.simulateTransaction=async tx=>{ + simulations++; + const data=new SorobanDataBuilder().setReadWrite([key]).build(); + if(simulations===1) data.ext(new xdr.SorobanTransactionDataExt(1,new xdr.SorobanResourcesExtV0({archivedSorobanEntries:[0]}))); + if(simulations===2) { + assert.equal(tx.operations[0].type,'restoreFootprint'); + assert.equal(tx.toEnvelope().v1().tx().ext().value().resources().footprint().readWrite().length,1); + } + return {_parsed:true, latestLedger:1,events:[],transactionData:new SorobanDataBuilder(data),minResourceFee:'0',result:{auth:[],retval:xdr.ScVal.scvVoid()}}; +}; +client.submit=async(tx,signer,method)=>{ + submissions.push({method,sequence:tx.sequence}); + return {hash:'test',status:'SUCCESS'}; +}; +await client.invoke(contract,'register',[],{publicKey:address}); +assert.equal(simulations,3); +assert.deepEqual(submissions.map(x=>x.method),['restore for register','register']); +assert.notEqual(submissions[0].sequence,submissions[1].sequence); +console.log('restore: separate restoration, fresh simulation, fresh sequence, then invocation passed'); diff --git a/packages/sdk/test/state-namespace.mjs b/packages/sdk/test/state-namespace.mjs new file mode 100644 index 0000000..8bfe6c8 --- /dev/null +++ b/packages/sdk/test/state-namespace.mjs @@ -0,0 +1,17 @@ +import assert from "node:assert/strict"; +import { LocalStorageStore } from "../src/state/browser-store.ts"; +import { freshState } from "../src/state/types.ts"; +const values = new Map(); +globalThis.localStorage = { getItem: (key) => values.get(key) ?? null, + setItem: (key, value) => values.set(key, value) }; +const a = new LocalStorageStore("lucent:state:network-a:token-a:"); +const b = new LocalStorageStore("lucent:state:network-a:token-b:"); +const c = new LocalStorageStore("lucent:state:network-b:token-a:"); +const state = freshState("owner"); +state.spendable.v = 123n; +state.cursor = "old-deployment-cursor"; +await a.save(state); +assert.deepEqual(await a.load("owner"), state); +assert.equal(await b.load("owner"), null); +assert.equal(await c.load("owner"), null); +console.log("state-namespace: network and token caches stay isolated"); diff --git a/packages/sdk/test/state-recovery.mjs b/packages/sdk/test/state-recovery.mjs new file mode 100644 index 0000000..58851b4 --- /dev/null +++ b/packages/sdk/test/state-recovery.mjs @@ -0,0 +1,77 @@ +import assert from "node:assert/strict"; +import { StateEngine } from "../src/state/engine.ts"; +import { MemoryStore } from "../src/state/store.ts"; +import { freshState } from "../src/state/types.ts"; +import { commit, G, scalarMul } from "../src/crypto/grumpkin.ts"; +import { FR_MODULUS } from "../src/crypto/constants.ts"; +import { fpAdd, frAdd } from "../src/crypto/field.ts"; +import { deriveKeys } from "../src/crypto/keys.ts"; +import { buildTransferWitness } from "../src/witness/transfer.ts"; + +const cursor = (ledger) => `${BigInt(ledger) << 32n}-0`; +const store = new MemoryStore(); +const initial = freshState("owner"); +initial.cursor = cursor(50); +initial.receiving.v = 3n; +await store.save(initial); +let rpcCalls = 0; +let indexerCalls = 0; +let mode = "fail"; +let backfill = [{ type: "deposit", to: "owner", amount: 5n, ledger: 60, cursor: "deposit-60" }]; +const keys = deriveKeys(1n, 2n); +const client = { + cfg: { contracts: { token: "token" } }, + server: { + getHealth: async () => ({ oldestLedger: 100 }), + getEvents: async () => { + rpcCalls++; + return { events: [], cursor: cursor(200), latestLedger: 200 }; + }, + }, +}; +const indexer = { + fetchEvents: async (opts) => { + indexerCalls++; + assert.equal(opts.startLedger, 51); + assert.equal(opts.endLedger, 159); + if (mode === "fail") throw new Error("temporary outage"); + return { events: backfill, latestLedger: mode === "lag" ? 158 : 200 }; + }, +}; +const engine = new StateEngine({ client, indexer, store, keys, address: "owner", fromLedger: 1 }); +await assert.rejects(engine.sync(), /temporary outage/); +assert.deepEqual(await store.load("owner"), initial); +assert.equal(rpcCalls, 0); +mode = "lag"; +await assert.rejects(engine.sync(), /backfill incomplete/); +assert.deepEqual(await store.load("owner"), initial); +assert.equal(rpcCalls, 0); +mode = "ok"; +assert.equal((await engine.sync()).receiving.v, 8n); +assert.equal((await engine.sync()).receiving.v, 8n); +assert.equal(indexerCalls, 3, "retry backfill until successful, then resume RPC without replay"); + +// Real curve arithmetic: a field-modulus sum must not replace the group-order sum. +const r1 = FR_MODULUS - 1n, r2 = FR_MODULUS - 2n; +const mergedPoint = commit(5n, r1).add(commit(7n, r2)); +assert(mergedPoint.equals(commit(12n, fpAdd(r1, r2)))); +assert(!mergedPoint.equals(commit(12n, frAdd(r1, r2)))); +const beforeMerge = { ...initial, spendable: { v: 5n, r: r1 }, receiving: { v: 7n, r: r2 } }; +await store.save(beforeMerge); +const optimistic = await engine.applyMerge(); +assert(mergedPoint.equals(commit(optimistic.spendable.v, optimistic.spendable.r))); +await store.save(beforeMerge); +backfill = [{ type: "merge", account: "owner", ledger: 60, cursor: "merge-60" }]; +const replayed = await engine.sync(); +assert.deepEqual(replayed.spendable, optimistic.spendable); + +// Receiving credits also use scalar addition, before an eventual merge. +const incoming = buildTransferWitness({ keys: deriveKeys(3n, 2n), v: 5n, r: 0n, + amount: 2n, pvkB: keys.PVK, kAudR: G, kAudS: G, sigma: 1n, rE: 2n }); +await store.save({ ...initial, receiving: { v: 7n, r: r1 } }); +backfill = [{ type: "transfer", from: "other", to: "owner", ledger: 60, + cursor: "transfer-60", ...incoming.payload }]; +const credited = await engine.sync(); +assert(commit(7n, r1).add(incoming.recipientView.cTx) + .equals(commit(credited.receiving.v, credited.receiving.r))); +console.log("state-recovery: outage retry, incomplete backfill, no replay, and blinding accumulation passed"); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7d04033..bc13ee7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -118,6 +118,28 @@ importers: specifier: ^5.7.0 version: 5.9.3 + packages/video: + dependencies: + '@remotion/cli': + specifier: 4.0.502 + version: 4.0.502(@swc/helpers@0.5.15)(postcss@8.5.15)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + react: + specifier: 19.2.7 + version: 19.2.7 + react-dom: + specifier: 19.2.7 + version: 19.2.7(react@19.2.7) + remotion: + specifier: 4.0.502 + version: 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + devDependencies: + '@types/react': + specifier: ^19.2.0 + version: 19.2.17 + typescript: + specifier: ^5.7.0 + version: 5.9.3 + packages: '@alloc/quick-lru@5.2.0': @@ -372,6 +394,82 @@ packages: resolution: {integrity: sha512-1tGxrJc/or9p4zwP7yvSLHU0z0N/DQGLfIeTYRdlQQPBMcnKX51rMI0PJ07/zZj0XxwHVFlqtV+PqvFBszIPwA==} hasBin: true + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.10': + resolution: {integrity: sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.1': + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.29.9': + resolution: {integrity: sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.10': + resolution: {integrity: sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.0': + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + '@cloudflare/kv-asset-handler@0.5.0': resolution: {integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==} engines: {node: '>=22.0.0'} @@ -432,9 +530,15 @@ packages: peerDependencies: '@noble/ciphers': ^1.0.0 + '@emnapi/core@1.11.3': + resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} + '@emnapi/runtime@1.11.0': resolution: {integrity: sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==} + '@emnapi/wasi-threads@1.2.3': + resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} + '@esbuild/aix-ppc64@0.25.4': resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} engines: {node: '>=18'} @@ -453,6 +557,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.25.4': resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} engines: {node: '>=18'} @@ -471,6 +581,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.25.4': resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} engines: {node: '>=18'} @@ -489,6 +605,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.25.4': resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} engines: {node: '>=18'} @@ -507,6 +629,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.25.4': resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} engines: {node: '>=18'} @@ -525,6 +653,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.25.4': resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} engines: {node: '>=18'} @@ -543,6 +677,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.25.4': resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} engines: {node: '>=18'} @@ -561,6 +701,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.4': resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} engines: {node: '>=18'} @@ -579,6 +725,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.25.4': resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} engines: {node: '>=18'} @@ -597,6 +749,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.25.4': resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} engines: {node: '>=18'} @@ -615,6 +773,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.25.4': resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} engines: {node: '>=18'} @@ -633,6 +797,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.25.4': resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} engines: {node: '>=18'} @@ -651,6 +821,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.25.4': resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} engines: {node: '>=18'} @@ -669,6 +845,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.25.4': resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} engines: {node: '>=18'} @@ -687,6 +869,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.25.4': resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} engines: {node: '>=18'} @@ -705,6 +893,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.25.4': resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} engines: {node: '>=18'} @@ -723,6 +917,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.25.4': resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} engines: {node: '>=18'} @@ -741,6 +941,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.4': resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} engines: {node: '>=18'} @@ -759,6 +965,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.4': resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} engines: {node: '>=18'} @@ -777,6 +989,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.4': resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} engines: {node: '>=18'} @@ -795,6 +1013,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.4': resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} engines: {node: '>=18'} @@ -813,6 +1037,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.27.3': resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} engines: {node: '>=18'} @@ -825,6 +1055,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.25.4': resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} engines: {node: '>=18'} @@ -843,6 +1079,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.25.4': resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} engines: {node: '>=18'} @@ -861,6 +1103,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.25.4': resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} engines: {node: '>=18'} @@ -879,6 +1127,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.25.4': resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} engines: {node: '>=18'} @@ -897,6 +1151,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} @@ -1041,6 +1301,9 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1057,6 +1320,39 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@mediabunny/aac-encoder@1.50.8': + resolution: {integrity: sha512-A5Se/LZd6RmYq/h36lBMSEsHvsyW8d0toR7FrAwpsFYbK+DVQYf90KiBT1Aw/mzLXx8/ypIOORJnd1sVZqOvJQ==} + peerDependencies: + mediabunny: ^1.0.0 + + '@mediabunny/flac-encoder@1.50.8': + resolution: {integrity: sha512-4cfN03SbEoQaG+eBeYFUAb1R1ALaAHzf43dXFzQTr/oO5ueqzTgBoG3coKrIvBaAMU7Vv36mrBKLX8bvTppdAQ==} + peerDependencies: + mediabunny: ^1.0.0 + + '@mediabunny/mp3-encoder@1.50.8': + resolution: {integrity: sha512-eBT/H30tTu8AmZXqZ5RTpJ9VmwVlwednajuOrrWp0GS6cbGXsGMQ60Qvr3ZMIE0QDiadlEzb8/ozR+doP+MC1g==} + peerDependencies: + mediabunny: ^1.0.0 + + '@module-federation/error-codes@0.22.0': + resolution: {integrity: sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==} + + '@module-federation/runtime-core@0.22.0': + resolution: {integrity: sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==} + + '@module-federation/runtime-tools@0.22.0': + resolution: {integrity: sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==} + + '@module-federation/runtime@0.22.0': + resolution: {integrity: sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==} + + '@module-federation/sdk@0.22.0': + resolution: {integrity: sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==} + + '@module-federation/webpack-bundler-runtime@0.22.0': + resolution: {integrity: sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==} + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': resolution: {integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==} cpu: [arm64] @@ -1087,6 +1383,9 @@ packages: cpu: [x64] os: [win32] + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + '@next/env@16.2.9': resolution: {integrity: sha512-ki5VxxXfzD/9TDe13wyeTKIjQTAwBVpnr8KhRDUr8ltMUq1/NBpWNT5tiPoxiGl+PHM4X2ahSOiPk6iAimIzPg==} @@ -1211,6 +1510,193 @@ packages: '@poppinss/exception@1.2.3': resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} + '@remotion/bundler@4.0.502': + resolution: {integrity: sha512-i7n4w1yATpfzAfWD1Rd4414L45vTgqW221CEXBvy0jU0K9wW2EaHTOiRcmv9uNTL0wvBQ4qHgTem115rt1bDYg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/canvas-capture@4.0.502': + resolution: {integrity: sha512-2Rc+9nKLc3v89QSq5wha64NXccybw1+g+vzspMQfgeX8D4dYXlPV+CSfy1sZobjSHD2NFPxC1lYX58thJUiRtw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/captions@4.0.502': + resolution: {integrity: sha512-TR8uUHT7RqpvX2xdzDxD4e/zHP+gzrLTe2xX6TcK7fl2Kf434N4k6U5u6aCrTokESrRzdv4/guJDKzH9M5fHxw==} + + '@remotion/cli@4.0.502': + resolution: {integrity: sha512-22ocr7eVgWeLVEUyutY33S/OZjW9KOuPPDMd9fGg2wFAct96u1VAajbstjAk/Kjo6wE4vXDE0GGg9wHY9MRbGw==} + hasBin: true + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/compositor-darwin-arm64@4.0.502': + resolution: {integrity: sha512-i0p+NZopaOz02e8aEfSkgYoAZFQX3dUCrkeOCu6iltbyA0hIv0Dtn8kzupkLwcp5Nu7k36UvxaiDDEB+oY6/qg==} + cpu: [arm64] + os: [darwin] + + '@remotion/compositor-darwin-x64@4.0.502': + resolution: {integrity: sha512-vEgA2gUl/rGaoUPPrwtb+4MgH+kn/YFNMDdRxuh8nWRELc8uG7GkIEg0quVrELXVCRQ9XtygmE2BioDzVq6jwQ==} + cpu: [x64] + os: [darwin] + + '@remotion/compositor-linux-arm64-gnu@4.0.502': + resolution: {integrity: sha512-6LTjSwbsuc79eLPLjPQ9X22aKifJJUdTb3p3wZbQvE89ZGFd6ugMuKFKILgf7kgt3ZWhccIGmX97n2GPmq95iw==} + cpu: [arm64] + os: [linux] + + '@remotion/compositor-linux-arm64-musl@4.0.502': + resolution: {integrity: sha512-rG32IsA3WmvCVBNwl0k3dYR78BiuuvRWfYgwfxyyBZb6Qc9E1pmNlsAb8fWk59aj1uF0uIxuyuISEOlgD51Nog==} + cpu: [arm64] + os: [linux] + + '@remotion/compositor-linux-x64-gnu@4.0.502': + resolution: {integrity: sha512-5plH/9dNyzkjpu3R3xkpUKsj/Lq/gvMm79AJgGyK+GcU09/SVydKcmQRSoXI7l4NpxG33Ts4PHm+EYheF8duQw==} + cpu: [x64] + os: [linux] + + '@remotion/compositor-linux-x64-musl@4.0.502': + resolution: {integrity: sha512-v9pZcmGssjRx9jTfIe34NazuQ5wEMkh8nx0YB9Q+oxraeh+uxZYg27tWhXeiq3YXQ7pFpXNShEoOVh53UKqHUg==} + cpu: [x64] + os: [linux] + + '@remotion/compositor-win32-x64-msvc@4.0.502': + resolution: {integrity: sha512-EkjffLigHmJJS7Zo1ychvq/GOeIhEg1gejiWdiZK2nnYnTJrcbnyYy7dOT8nR4us6vJOH82ikbxaClkYdUfnZw==} + cpu: [x64] + os: [win32] + + '@remotion/licensing@4.0.502': + resolution: {integrity: sha512-BaeD7ZkFfp2TAltg+cSW6HpY7urNojZTlkxISSgETrSw4HcrlqTFIjsa2bw6ZI9nDINahHS0S7/5uT5VOUM9dA==} + + '@remotion/media-parser@4.0.502': + resolution: {integrity: sha512-b/7E2SzENAdF+j5EOLecZm9r7segPLPGwSwbnAFK9aq50lyftb2r3wtVJimX/7mRp1Ce2zDdjIFLt8zj7PfHhQ==} + + '@remotion/media-utils@4.0.502': + resolution: {integrity: sha512-nSFEa/ASRyw9EtFv4rVXBcpOga3uK9m0VEtkVG4LKouJiLxsKw8R2wO+CHhTLN+wIx8dro6M4XUpMIoAZpZRqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/player@4.0.502': + resolution: {integrity: sha512-deuxNV/e5tyaBZ7PH+68Vs4rgjpifZe4+Ryzj4feICKDpDsrgVFQIIYgiKt3DEAs60daY+ExqlcH/86abjX1GQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/renderer@4.0.502': + resolution: {integrity: sha512-nrmITwcUJJFjVhM2XCytEnvvPQcRe5Y7mXEAODfXHC7OGZii/cIQs9b0M8Bv1UY6K1SO0NGyxyvy3glS6fhbTA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/streaming@4.0.502': + resolution: {integrity: sha512-VCh59T6tOfeuVwP1D5KB/KlQUSpXHfqh2V1AhonczhfLvtuvtbeEjg4cUJrGJS5qtkT+K4nnUdvW9sn1xS8wBA==} + + '@remotion/studio-codemods@4.0.502': + resolution: {integrity: sha512-f588okuILPkv9Y75RduuQXQnODG43eHAzR4v2qnkqqPZk9/eygCu3MiEJUSznZYnVWC0LAJkz206bEUQ03EYsw==} + + '@remotion/studio-protocol@4.0.502': + resolution: {integrity: sha512-mGO3Iswp+6WSHFSw0ZvpRj8HE7JZMhEO0IDeoGtZHbpFRd7PQk1UYE2Kme/WHi9JeBTIHhAETOvC7mnGzJBBCQ==} + + '@remotion/studio-server@4.0.502': + resolution: {integrity: sha512-F3vDzxvDv++e2IKY0nO+jN3LTKzLNGg598a9o+TGGMa5DnKPVrbmb/k5Uwt602TJjzuzSVb9+YN5y71T08a75w==} + + '@remotion/studio-shared@4.0.502': + resolution: {integrity: sha512-kh7gqvlMOBDoJIYuJhRVXtynosm+a3Yw3f60FIT9Oni463BG7LuF0OIaE97cTB24vphklq96vd6B/6708TjygA==} + + '@remotion/studio@4.0.502': + resolution: {integrity: sha512-2GhPXaPwdIKahpKP7t1bnejADzJpQU9A8qqc3+6e0GD2JM9Me8OZO/K73Z5mVFML+FKLymU/GHcodUVczlzyNw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@remotion/timeline-utils@4.0.502': + resolution: {integrity: sha512-FKeS/Dg+yHadf/PqY2aYMVSHN/BQ0yMu0ma/gG2NF1xH3n8SE//2/1GkJZ5uNBoeaj9XVbU/axFyPLb8XEYZ3w==} + + '@remotion/web-renderer@4.0.502': + resolution: {integrity: sha512-VnUz7vP/YnaoC01NFRkc/DAPluGNMF42aA7Nv4yH7oHfzepUS7WY3KOyIv3XSWE1xrp8GkEfqOmUugIS4jvvAA==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@remotion/zod-types@4.0.502': + resolution: {integrity: sha512-EQTvFP1/CDwGti8gvCVoCoUczHr/grnwY7vzMCD2o4tyQ4AR8IEOjpDGzgQpUFfGOrwc6uGfELPFlu41ifhd4Q==} + + '@rspack/binding-darwin-arm64@1.7.11': + resolution: {integrity: sha512-oduECiZVqbO5zlVw+q7Vy65sJFth99fWPTyucwvLJJtJkPL5n17Uiql2cYP6Ijn0pkqtf1SXgK8WjiKLG5bIig==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.7.11': + resolution: {integrity: sha512-a1+TtTE9ap6RalgFi7FGIgkJP6O4Vy6ctv+9WGJy53E4kuqHR0RygzaiVxCI/GMc/vBT9vY23hyrpWb3d1vtXA==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.7.11': + resolution: {integrity: sha512-P0QrGRPbTWu6RKWfN0bDtbnEps3rXH0MWIMreZABoUrVmNQKtXR6e73J3ub6a+di5s2+K0M2LJ9Bh2/H4UsDUA==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-arm64-musl@1.7.11': + resolution: {integrity: sha512-6ky7R43VMjWwmx3Yx7Jl7faLBBMAgMDt+/bN35RgwjiPgsIByz65EwytUVuW9rikB43BGHvA/eqlnjLrUzNBqw==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-x64-gnu@1.7.11': + resolution: {integrity: sha512-cuOJMfCOvb2Wgsry5enXJ3iT1FGUjdPqtGUBVupQlEG4ntSYsQ2PtF4wIDVasR3wdxC5nQbipOrDiN/u6fYsdQ==} + cpu: [x64] + os: [linux] + + '@rspack/binding-linux-x64-musl@1.7.11': + resolution: {integrity: sha512-CoK37hva4AmHGh3VCsQXmGr40L36m1/AdnN5LEjUX6kx5rEH7/1nEBN6Ii72pejqDVvk9anEROmPDiPw10tpFg==} + cpu: [x64] + os: [linux] + + '@rspack/binding-wasm32-wasi@1.7.11': + resolution: {integrity: sha512-OtrmnPUVJMxjNa3eDMfHyPdtlLRmmp/aIm0fQHlAOATbZvlGm12q7rhPW5BXTu1yh+1rQ1/uqvz+SzKEZXuJaQ==} + cpu: [wasm32] + + '@rspack/binding-win32-arm64-msvc@1.7.11': + resolution: {integrity: sha512-lObFW6e5lCWNgTBNwT//yiEDbsxm9QG4BYUojqeXxothuzJ/L6ibXz6+gLMvbOvLGV3nKgkXmx8GvT9WDKR0mA==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.7.11': + resolution: {integrity: sha512-0pYGnZd8PPqNR68zQ8skamqNAXEA1sUfXuAdYcknIIRq2wsbiwFzIc0Pov1cIfHYab37G7sSIPBiOUdOWF5Ivw==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.7.11': + resolution: {integrity: sha512-EeQXayoQk/uBkI3pdoXfQBXNIUrADq56L3s/DFyM2pJeUDrWmhfIw2UFIGkYPTMSCo8F2JcdcGM32FGJrSnU0Q==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.7.11': + resolution: {integrity: sha512-2MGdy2s2HimsDT444Bp5XnALzNRxuBNc7y0JzyuqKbHBywd4x2NeXyhWXXoxufaCFu5PBc9Qq9jyfjW2Aeh06Q==} + + '@rspack/core@1.7.11': + resolution: {integrity: sha512-rsD9b+Khmot5DwCMiB3cqTQo53ioPG3M/A7BySu8+0+RS7GCxKm+Z+mtsjtG/vsu4Tn2tcqCdZtA3pgLoJB+ew==} + engines: {node: '>=18.12.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@rspack/lite-tapable@1.1.0': + resolution: {integrity: sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==} + + '@rspack/plugin-react-refresh@1.6.1': + resolution: {integrity: sha512-eqqW5645VG3CzGzFgNg5HqNdHVXY+567PGjtDhhrM8t67caxmsSzRmT5qfoEIfBcGgFkH9vEg7kzXwmCYQdQDw==} + peerDependencies: + react-refresh: '>=0.10.0 <1.0.0' + webpack-hot-middleware: 2.x + peerDependenciesMeta: + webpack-hot-middleware: + optional: true + '@sindresorhus/is@7.2.0': resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} @@ -1386,14 +1872,103 @@ packages: engines: {node: '>=20.0.0'} hasBin: true - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - - '@tsconfig/node18@1.0.3': - resolution: {integrity: sha512-RbwvSJQsuN9TB04AQbGULYfOGE/RnSFk/FLQ5b0NmDf5Kx2q/lABZbHQPKCO1vZ6Fiwkplu+yb9pGdLy1iGseQ==} + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@types/node-fetch@2.6.13': - resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0': + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0': + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0': + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0': + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-preset@8.1.0': + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/core@8.1.0': + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + + '@svgr/hast-util-to-babel-ast@8.0.0': + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} + + '@svgr/plugin-jsx@8.1.0': + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@tsconfig/node18@1.0.3': + resolution: {integrity: sha512-RbwvSJQsuN9TB04AQbGULYfOGE/RnSFk/FLQ5b0NmDf5Kx2q/lABZbHQPKCO1vZ6Fiwkplu+yb9pGdLy1iGseQ==} + + '@tybys/wasm-util@0.10.4': + resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} + + '@types/dom-mediacapture-transform@0.1.12': + resolution: {integrity: sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==} + + '@types/dom-webcodecs@0.1.13': + resolution: {integrity: sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node-fetch@2.6.13': + resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} @@ -1409,6 +1984,57 @@ packages: '@types/react@19.2.17': resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@zkpassport/poseidon2@0.6.2': resolution: {integrity: sha512-6sFHX9kAcrmDmBEEndvjZ8DA9FomunirQ5oCV6oD7bqr/lP0n0OBSRn86SZgQBXwRR+vq7sk16y31OgRBIOJ5Q==} @@ -1420,6 +2046,12 @@ packages: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + acorn@8.17.0: resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} @@ -1433,6 +2065,22 @@ packages: resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -1462,9 +2110,20 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + array-timsort@1.0.3: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + ast-types@0.16.3: + resolution: {integrity: sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==} + engines: {node: '>=4'} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1559,10 +2218,18 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + caniuse-lite@1.0.30001797: resolution: {integrity: sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==} @@ -1574,6 +2241,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + ci-info@4.4.0: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} @@ -1630,6 +2301,9 @@ packages: resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} engines: {node: '>=18'} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} @@ -1642,10 +2316,31 @@ packages: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + css-loader@7.1.4: + resolution: {integrity: sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || ^1.0.0 || ^2.0.0-0 + webpack: ^5.27.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -1667,6 +2362,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1685,10 +2384,17 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + dotenv@17.3.1: + resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1713,13 +2419,27 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + enhanced-resolve@5.26.0: + resolution: {integrity: sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==} + engines: {node: '>=10.13.0'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -1728,6 +2448,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} + es-object-atoms@1.1.2: resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} engines: {node: '>= 0.4'} @@ -1751,6 +2474,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1758,11 +2486,27 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -1771,6 +2515,10 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + eventsource@2.0.2: resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} engines: {node: '>=12.0.0'} @@ -1783,10 +2531,16 @@ packages: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} + fast-xml-builder@1.2.0: resolution: {integrity: sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==} @@ -1873,6 +2627,9 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} + fs-monkey@1.0.3: + resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1884,6 +2641,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -1912,6 +2673,9 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@12.0.0: resolution: {integrity: sha512-5Qcll1z7IKgHr5g485ePDdHcNQY0k2dtv/bjYy0iuyGxQw2qSOiiXUXJ+AYQpg3HNoUMHqAruX478Jeev7UULw==} engines: {node: 20 || >=22} @@ -1926,10 +2690,17 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -1949,6 +2720,9 @@ packages: resolution: {integrity: sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==} engines: {node: '>=16.9.0'} + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -1968,6 +2742,12 @@ packages: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -1975,6 +2755,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -1982,6 +2766,9 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1994,6 +2781,11 @@ packages: resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2021,6 +2813,10 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -2035,10 +2831,45 @@ packages: resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + jiti@1.21.7: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + kiwi-schema@0.5.0: + resolution: {integrity: sha512-X+FpfU0yTEtc6aTHS7VwbOpvQwRt70+pXXWRI5fd6CvWhe7pSVC854TVo4Zo0x5/wwcWj+/9KUlXpdcP0dY9AA==} + hasBin: true + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -2050,6 +2881,13 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + loader-runner@4.3.2: + resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} + engines: {node: '>=6.11.5'} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -2057,6 +2895,13 @@ packages: resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} engines: {node: 20 || >=22} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + lucide-react@1.23.0: resolution: {integrity: sha512-38BpJcD0JhFosxHApP/BYsBetLpQFRoTRzEzstM/XCc3jsAG7wqaY1lgVwxiUe3xqYE+lNxo2PkCmYwXWrwwIw==} peerDependencies: @@ -2070,6 +2915,13 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} + mediabunny@1.50.8: + resolution: {integrity: sha512-LgykLyQzhdpo0V2yw3UXmOpj+b4JAGdpHBwsPE6kjSt8Za0d1VllD+FV7EGHBcdV4+oHUAo+yrqbVAWxNSDCPQ==} + + memfs@3.4.3: + resolution: {integrity: sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg==} + engines: {node: '>= 4.0.0'} + merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} @@ -2118,6 +2970,9 @@ packages: resolution: {integrity: sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + minipass@4.2.8: resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} engines: {node: '>=8'} @@ -2162,6 +3017,9 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + next@16.2.9: resolution: {integrity: sha512-MEOJiq/UvuezAdqVSceHbqDgZt1kDw2tpGVOlsdIoJsQdbN2JY2hpVG4xnXGkbdJUOEWhnRfiu/O4Hpc9Juwww==} engines: {node: '>=20.9.0'} @@ -2183,6 +3041,9 @@ packages: sass: optional: true + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -2243,12 +3104,24 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} pako@2.1.0: resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -2278,6 +3151,10 @@ packages: path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -2334,6 +3211,30 @@ packages: yaml: optional: true + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} @@ -2344,6 +3245,10 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} + postcss-selector-parser@7.1.6: + resolution: {integrity: sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==} + engines: {node: '>=4'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -2359,6 +3264,15 @@ packages: resolution: {integrity: sha512-GD3qdB0x1z9xgFI6cdRD6xu2Sp2WCOEoe3mtnyB5Ee0XrrL5Pe+e4CCnJrRMnL1zYtRDZmQQVbvOttLnKDLnaw==} engines: {node: '>=12'} + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -2390,6 +3304,10 @@ packages: peerDependencies: react: ^19.2.7 + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} + react@19.2.7: resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} engines: {node: '>=0.10.0'} @@ -2401,6 +3319,24 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + + remotion@4.0.502: + resolution: {integrity: sha512-6pIVS9HAsCKbbXFa3+1RFZJHCZl65C15+p4pFlqFPkvxqCkeZCjOwBpxLa5TtCsShlh309YghL0JCmXS/87urw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + resolve@1.22.12: resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} @@ -2426,6 +3362,19 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + schema-utils@4.5.0: + resolution: {integrity: sha512-zJlMCZ0cAR5p/Y4oVpRoqioDMJcGxaXRrQ/4rP4WyR84vc5z/DolXdbvXeDpTwbtocDFr2rhPqHPErDCUtz2kA==} + engines: {node: '>= 10.13.0'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + semver@7.8.4: resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} engines: {node: '>=10'} @@ -2486,6 +3435,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2497,6 +3452,13 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.8.0: + resolution: {integrity: sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==} + engines: {node: '>= 12'} + + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} @@ -2520,6 +3482,12 @@ packages: strnum@2.4.0: resolution: {integrity: sha512-sHrVyWWdq28RbhjuJdZsA1SnGRJV6NiXbk6AXBxDOsgAcA+lmpUZCYjOdLBxkXMwis6RRe7dlZt4VlIWFVzkmg==} + style-loader@4.0.0: + resolution: {integrity: sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.27.0 + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -2542,20 +3510,80 @@ packages: resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} engines: {node: '>=18'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svg-parser@2.1.0: + resolution: {integrity: sha512-bwLf38YmY+TDYHJw1Ex0Co8c4yeXuJAo8YnXGZrscxrvYoVVIvLeniEkV1Ks/54VteMnL4FtyN1+P+TZJdUPmQ==} + engines: {node: '>=8'} + tailwindcss@3.4.19: resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} engines: {node: '>=14.0.0'} hasBin: true + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.6.1: + resolution: {integrity: sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@minify-html/node': '*' + '@swc/core': '*' + '@swc/css': '*' + '@swc/html': '*' + clean-css: '*' + cssnano: '*' + csso: '*' + esbuild: '*' + html-minifier-terser: '*' + lightningcss: '*' + postcss: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@minify-html/node': + optional: true + '@swc/core': + optional: true + '@swc/css': + optional: true + '@swc/html': + optional: true + clean-css: + optional: true + cssnano: + optional: true + csso: + optional: true + esbuild: + optional: true + html-minifier-terser: + optional: true + lightningcss: + optional: true + postcss: + optional: true + uglify-js: + optional: true + terser@5.16.9: resolution: {integrity: sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==} engines: {node: '>=10'} hasBin: true + terser@5.51.2: + resolution: {integrity: sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==} + engines: {node: '>=10'} + hasBin: true + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -2563,6 +3591,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -2571,6 +3602,10 @@ packages: resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} engines: {node: '>= 0.4'} + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2648,6 +3683,10 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + watchpack@2.5.2: + resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==} + engines: {node: '>=10.13.0'} + web-streams-polyfill@4.0.0-beta.3: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} @@ -2655,6 +3694,20 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webpack-sources@3.6.0: + resolution: {integrity: sha512-EIMmPVvNI0CYXyRPp34F2Qk7W37/BZVZIofS6LAUnrNjCVahS+hO4mxwFJDjQjODTGZDtVzLYoN2+1dYkhk9qA==} + engines: {node: '>=10.13.0'} + + webpack@5.105.0: + resolution: {integrity: sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -2706,6 +3759,18 @@ packages: utf-8-validate: optional: true + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-naming@0.1.0: resolution: {integrity: sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==} engines: {node: '>=16.0.0'} @@ -2714,6 +3779,12 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@2.9.0: resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} @@ -2733,6 +3804,9 @@ packages: youch@4.1.0-beta.10: resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + snapshots: '@alloc/quick-lru@5.2.0': {} @@ -3338,6 +4412,116 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.10 + '@babel/parser': 7.29.9 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.10 + '@babel/types': 7.29.8 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.8': + dependencies: + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.10 + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.10': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + + '@babel/parser@7.24.1': + dependencies: + '@babel/types': 7.24.0 + + '@babel/parser@7.29.9': + dependencies: + '@babel/types': 7.29.8 + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 + + '@babel/traverse@7.29.10': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.0': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + to-fast-properties: 2.0.0 + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@cloudflare/kv-asset-handler@0.5.0': {} '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260611.1)': @@ -3383,11 +4567,22 @@ snapshots: dependencies: '@noble/ciphers': 1.3.0 + '@emnapi/core@1.11.3': + dependencies: + '@emnapi/wasi-threads': 1.2.3 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.11.0': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.3': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.25.4': optional: true @@ -3397,6 +4592,9 @@ snapshots: '@esbuild/aix-ppc64@0.28.0': optional: true + '@esbuild/aix-ppc64@0.28.1': + optional: true + '@esbuild/android-arm64@0.25.4': optional: true @@ -3406,6 +4604,9 @@ snapshots: '@esbuild/android-arm64@0.28.0': optional: true + '@esbuild/android-arm64@0.28.1': + optional: true + '@esbuild/android-arm@0.25.4': optional: true @@ -3415,6 +4616,9 @@ snapshots: '@esbuild/android-arm@0.28.0': optional: true + '@esbuild/android-arm@0.28.1': + optional: true + '@esbuild/android-x64@0.25.4': optional: true @@ -3424,6 +4628,9 @@ snapshots: '@esbuild/android-x64@0.28.0': optional: true + '@esbuild/android-x64@0.28.1': + optional: true + '@esbuild/darwin-arm64@0.25.4': optional: true @@ -3433,6 +4640,9 @@ snapshots: '@esbuild/darwin-arm64@0.28.0': optional: true + '@esbuild/darwin-arm64@0.28.1': + optional: true + '@esbuild/darwin-x64@0.25.4': optional: true @@ -3442,6 +4652,9 @@ snapshots: '@esbuild/darwin-x64@0.28.0': optional: true + '@esbuild/darwin-x64@0.28.1': + optional: true + '@esbuild/freebsd-arm64@0.25.4': optional: true @@ -3451,6 +4664,9 @@ snapshots: '@esbuild/freebsd-arm64@0.28.0': optional: true + '@esbuild/freebsd-arm64@0.28.1': + optional: true + '@esbuild/freebsd-x64@0.25.4': optional: true @@ -3460,6 +4676,9 @@ snapshots: '@esbuild/freebsd-x64@0.28.0': optional: true + '@esbuild/freebsd-x64@0.28.1': + optional: true + '@esbuild/linux-arm64@0.25.4': optional: true @@ -3469,6 +4688,9 @@ snapshots: '@esbuild/linux-arm64@0.28.0': optional: true + '@esbuild/linux-arm64@0.28.1': + optional: true + '@esbuild/linux-arm@0.25.4': optional: true @@ -3478,6 +4700,9 @@ snapshots: '@esbuild/linux-arm@0.28.0': optional: true + '@esbuild/linux-arm@0.28.1': + optional: true + '@esbuild/linux-ia32@0.25.4': optional: true @@ -3487,6 +4712,9 @@ snapshots: '@esbuild/linux-ia32@0.28.0': optional: true + '@esbuild/linux-ia32@0.28.1': + optional: true + '@esbuild/linux-loong64@0.25.4': optional: true @@ -3496,6 +4724,9 @@ snapshots: '@esbuild/linux-loong64@0.28.0': optional: true + '@esbuild/linux-loong64@0.28.1': + optional: true + '@esbuild/linux-mips64el@0.25.4': optional: true @@ -3505,6 +4736,9 @@ snapshots: '@esbuild/linux-mips64el@0.28.0': optional: true + '@esbuild/linux-mips64el@0.28.1': + optional: true + '@esbuild/linux-ppc64@0.25.4': optional: true @@ -3514,6 +4748,9 @@ snapshots: '@esbuild/linux-ppc64@0.28.0': optional: true + '@esbuild/linux-ppc64@0.28.1': + optional: true + '@esbuild/linux-riscv64@0.25.4': optional: true @@ -3523,6 +4760,9 @@ snapshots: '@esbuild/linux-riscv64@0.28.0': optional: true + '@esbuild/linux-riscv64@0.28.1': + optional: true + '@esbuild/linux-s390x@0.25.4': optional: true @@ -3532,6 +4772,9 @@ snapshots: '@esbuild/linux-s390x@0.28.0': optional: true + '@esbuild/linux-s390x@0.28.1': + optional: true + '@esbuild/linux-x64@0.25.4': optional: true @@ -3541,6 +4784,9 @@ snapshots: '@esbuild/linux-x64@0.28.0': optional: true + '@esbuild/linux-x64@0.28.1': + optional: true + '@esbuild/netbsd-arm64@0.25.4': optional: true @@ -3550,6 +4796,9 @@ snapshots: '@esbuild/netbsd-arm64@0.28.0': optional: true + '@esbuild/netbsd-arm64@0.28.1': + optional: true + '@esbuild/netbsd-x64@0.25.4': optional: true @@ -3559,6 +4808,9 @@ snapshots: '@esbuild/netbsd-x64@0.28.0': optional: true + '@esbuild/netbsd-x64@0.28.1': + optional: true + '@esbuild/openbsd-arm64@0.25.4': optional: true @@ -3568,6 +4820,9 @@ snapshots: '@esbuild/openbsd-arm64@0.28.0': optional: true + '@esbuild/openbsd-arm64@0.28.1': + optional: true + '@esbuild/openbsd-x64@0.25.4': optional: true @@ -3577,12 +4832,18 @@ snapshots: '@esbuild/openbsd-x64@0.28.0': optional: true + '@esbuild/openbsd-x64@0.28.1': + optional: true + '@esbuild/openharmony-arm64@0.27.3': optional: true '@esbuild/openharmony-arm64@0.28.0': optional: true + '@esbuild/openharmony-arm64@0.28.1': + optional: true + '@esbuild/sunos-x64@0.25.4': optional: true @@ -3592,6 +4853,9 @@ snapshots: '@esbuild/sunos-x64@0.28.0': optional: true + '@esbuild/sunos-x64@0.28.1': + optional: true + '@esbuild/win32-arm64@0.25.4': optional: true @@ -3601,6 +4865,9 @@ snapshots: '@esbuild/win32-arm64@0.28.0': optional: true + '@esbuild/win32-arm64@0.28.1': + optional: true + '@esbuild/win32-ia32@0.25.4': optional: true @@ -3610,6 +4877,9 @@ snapshots: '@esbuild/win32-ia32@0.28.0': optional: true + '@esbuild/win32-ia32@0.28.1': + optional: true + '@esbuild/win32-x64@0.25.4': optional: true @@ -3619,6 +4889,9 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true + '@esbuild/win32-x64@0.28.1': + optional: true + '@img/colour@1.1.0': {} '@img/sharp-darwin-arm64@0.34.5': @@ -3722,6 +4995,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/source-map@0.3.11': @@ -3741,6 +5019,43 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@mediabunny/aac-encoder@1.50.8(mediabunny@1.50.8)': + dependencies: + mediabunny: 1.50.8 + + '@mediabunny/flac-encoder@1.50.8(mediabunny@1.50.8)': + dependencies: + mediabunny: 1.50.8 + + '@mediabunny/mp3-encoder@1.50.8(mediabunny@1.50.8)': + dependencies: + mediabunny: 1.50.8 + + '@module-federation/error-codes@0.22.0': {} + + '@module-federation/runtime-core@0.22.0': + dependencies: + '@module-federation/error-codes': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@module-federation/runtime-tools@0.22.0': + dependencies: + '@module-federation/runtime': 0.22.0 + '@module-federation/webpack-bundler-runtime': 0.22.0 + + '@module-federation/runtime@0.22.0': + dependencies: + '@module-federation/error-codes': 0.22.0 + '@module-federation/runtime-core': 0.22.0 + '@module-federation/sdk': 0.22.0 + + '@module-federation/sdk@0.22.0': {} + + '@module-federation/webpack-bundler-runtime@0.22.0': + dependencies: + '@module-federation/runtime': 0.22.0 + '@module-federation/sdk': 0.22.0 + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': optional: true @@ -3759,6 +5074,13 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': optional: true + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.0 + '@tybys/wasm-util': 0.10.4 + optional: true + '@next/env@16.2.9': {} '@next/swc-darwin-arm64@16.2.9': @@ -3882,13 +5204,324 @@ snapshots: dependencies: kleur: 4.1.5 - '@poppinss/dumper@0.6.5': - dependencies: - '@poppinss/colors': 4.1.6 - '@sindresorhus/is': 7.2.0 - supports-color: 10.2.2 + '@poppinss/dumper@0.6.5': + dependencies: + '@poppinss/colors': 4.1.6 + '@sindresorhus/is': 7.2.0 + supports-color: 10.2.2 + + '@poppinss/exception@1.2.3': {} + + '@remotion/bundler@4.0.502(@swc/helpers@0.5.15)(postcss@8.5.15)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@remotion/media-parser': 4.0.502 + '@remotion/studio': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/studio-shared': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/timeline-utils': 4.0.502 + '@rspack/core': 1.7.11(@swc/helpers@0.5.15) + '@rspack/plugin-react-refresh': 1.6.1(react-refresh@0.18.0) + css-loader: 7.1.4(@rspack/core@1.7.11(@swc/helpers@0.5.15))(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.15)) + esbuild: 0.28.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-refresh: 0.18.0 + remotion: 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + style-loader: 4.0.0(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.15)) + webpack: 5.105.0(esbuild@0.28.1)(postcss@8.5.15) + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/helpers' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - html-minifier-terser + - lightningcss + - postcss + - uglify-js + - utf-8-validate + - webpack-cli + - webpack-hot-middleware + + '@remotion/canvas-capture@4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + mediabunny: 1.50.8 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + remotion: 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + + '@remotion/captions@4.0.502': {} + + '@remotion/cli@4.0.502(@swc/helpers@0.5.15)(postcss@8.5.15)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@remotion/bundler': 4.0.502(@swc/helpers@0.5.15)(postcss@8.5.15)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/media-utils': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/player': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/renderer': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/studio': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/studio-server': 4.0.502(@swc/helpers@0.5.15)(postcss@8.5.15)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) + '@remotion/studio-shared': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + dotenv: 17.3.1 + minimist: 1.2.6 + prompts: 2.4.2 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + remotion: 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/helpers' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - html-minifier-terser + - lightningcss + - postcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + - webpack-hot-middleware + + '@remotion/compositor-darwin-arm64@4.0.502': + optional: true + + '@remotion/compositor-darwin-x64@4.0.502': + optional: true + + '@remotion/compositor-linux-arm64-gnu@4.0.502': + optional: true + + '@remotion/compositor-linux-arm64-musl@4.0.502': + optional: true + + '@remotion/compositor-linux-x64-gnu@4.0.502': + optional: true + + '@remotion/compositor-linux-x64-musl@4.0.502': + optional: true + + '@remotion/compositor-win32-x64-msvc@4.0.502': + optional: true + + '@remotion/licensing@4.0.502': {} + + '@remotion/media-parser@4.0.502': {} + + '@remotion/media-utils@4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + mediabunny: 1.50.8 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + remotion: 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + + '@remotion/player@4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + remotion: 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + + '@remotion/renderer@4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@remotion/licensing': 4.0.502 + '@remotion/streaming': 4.0.502 + execa: 5.1.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + remotion: 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + source-map: 0.8.0 + ws: 8.21.0 + optionalDependencies: + '@remotion/compositor-darwin-arm64': 4.0.502 + '@remotion/compositor-darwin-x64': 4.0.502 + '@remotion/compositor-linux-arm64-gnu': 4.0.502 + '@remotion/compositor-linux-arm64-musl': 4.0.502 + '@remotion/compositor-linux-x64-gnu': 4.0.502 + '@remotion/compositor-linux-x64-musl': 4.0.502 + '@remotion/compositor-win32-x64-msvc': 4.0.502 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@remotion/streaming@4.0.502': {} + + '@remotion/studio-codemods@4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + '@remotion/studio-shared': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + ast-types: 0.16.1 + recast: 0.23.11 + remotion: 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + transitivePeerDependencies: + - react + - react-dom + + '@remotion/studio-protocol@4.0.502': {} + + '@remotion/studio-server@4.0.502(@swc/helpers@0.5.15)(postcss@8.5.15)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)': + dependencies: + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + '@remotion/bundler': 4.0.502(@swc/helpers@0.5.15)(postcss@8.5.15)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/renderer': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/studio-codemods': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/studio-protocol': 4.0.502 + '@remotion/studio-shared': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@svgr/core': 8.1.0(typescript@5.9.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3)) + kiwi-schema: 0.5.0 + memfs: 3.4.3 + open: 8.4.2 + prettier: 3.8.1 + recast: 0.23.11 + remotion: 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + semver: 7.5.3 + zod: 4.4.3 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/helpers' + - '@swc/html' + - bufferutil + - clean-css + - cssnano + - csso + - html-minifier-terser + - lightningcss + - postcss + - react + - react-dom + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + - webpack-hot-middleware + + '@remotion/studio-shared@4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@remotion/studio-protocol': 4.0.502 + remotion: 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + transitivePeerDependencies: + - react + - react-dom + + '@remotion/studio@4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@remotion/canvas-capture': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/captions': 4.0.502 + '@remotion/media-utils': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/player': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/renderer': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/studio-protocol': 4.0.502 + '@remotion/studio-shared': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/timeline-utils': 4.0.502 + '@remotion/web-renderer': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@remotion/zod-types': 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + mediabunny: 1.50.8 + memfs: 3.4.3 + open: 8.4.2 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + remotion: 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + semver: 7.5.3 + zod: 4.4.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@remotion/timeline-utils@4.0.502': + dependencies: + mediabunny: 1.50.8 + + '@remotion/web-renderer@4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@mediabunny/aac-encoder': 1.50.8(mediabunny@1.50.8) + '@mediabunny/flac-encoder': 1.50.8(mediabunny@1.50.8) + '@mediabunny/mp3-encoder': 1.50.8(mediabunny@1.50.8) + '@remotion/licensing': 4.0.502 + mediabunny: 1.50.8 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + remotion: 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + + '@remotion/zod-types@4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + remotion: 4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + transitivePeerDependencies: + - react + - react-dom + + '@rspack/binding-darwin-arm64@1.7.11': + optional: true + + '@rspack/binding-darwin-x64@1.7.11': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.7.11': + optional: true + + '@rspack/binding-linux-arm64-musl@1.7.11': + optional: true + + '@rspack/binding-linux-x64-gnu@1.7.11': + optional: true + + '@rspack/binding-linux-x64-musl@1.7.11': + optional: true + + '@rspack/binding-wasm32-wasi@1.7.11': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@rspack/binding-win32-arm64-msvc@1.7.11': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.7.11': + optional: true + + '@rspack/binding-win32-x64-msvc@1.7.11': + optional: true + + '@rspack/binding@1.7.11': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.7.11 + '@rspack/binding-darwin-x64': 1.7.11 + '@rspack/binding-linux-arm64-gnu': 1.7.11 + '@rspack/binding-linux-arm64-musl': 1.7.11 + '@rspack/binding-linux-x64-gnu': 1.7.11 + '@rspack/binding-linux-x64-musl': 1.7.11 + '@rspack/binding-wasm32-wasi': 1.7.11 + '@rspack/binding-win32-arm64-msvc': 1.7.11 + '@rspack/binding-win32-ia32-msvc': 1.7.11 + '@rspack/binding-win32-x64-msvc': 1.7.11 + + '@rspack/core@1.7.11(@swc/helpers@0.5.15)': + dependencies: + '@module-federation/runtime-tools': 0.22.0 + '@rspack/binding': 1.7.11 + '@rspack/lite-tapable': 1.1.0 + optionalDependencies: + '@swc/helpers': 0.5.15 + + '@rspack/lite-tapable@1.1.0': {} - '@poppinss/exception@1.2.3': {} + '@rspack/plugin-react-refresh@1.6.1(react-refresh@0.18.0)': + dependencies: + error-stack-parser: 2.1.4 + html-entities: 2.6.0 + react-refresh: 0.18.0 '@sindresorhus/is@7.2.0': {} @@ -4119,12 +5752,107 @@ snapshots: - debug - supports-color + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + + '@svgr/babel-preset@8.1.0(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.29.7) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.29.7) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.29.7) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.29.7) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.29.7) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.29.7) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.29.7) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.29.7) + + '@svgr/core@8.1.0(typescript@5.9.3)': + dependencies: + '@babel/core': 7.29.7 + '@svgr/babel-preset': 8.1.0(@babel/core@7.29.7) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@5.9.3) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + + '@svgr/hast-util-to-babel-ast@8.0.0': + dependencies: + '@babel/types': 7.24.0 + entities: 4.5.0 + + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))': + dependencies: + '@babel/core': 7.29.7 + '@svgr/babel-preset': 8.1.0(@babel/core@7.29.7) + '@svgr/core': 8.1.0(typescript@5.9.3) + '@svgr/hast-util-to-babel-ast': 8.0.0 + svg-parser: 2.1.0 + transitivePeerDependencies: + - supports-color + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 '@tsconfig/node18@1.0.3': {} + '@tybys/wasm-util@0.10.4': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/dom-mediacapture-transform@0.1.12': + dependencies: + '@types/dom-webcodecs': 0.1.13 + + '@types/dom-webcodecs@0.1.13': {} + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.9 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.9 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.9': {} + + '@types/json-schema@7.0.15': {} + '@types/node-fetch@2.6.13': dependencies: '@types/node': 22.19.20 @@ -4146,6 +5874,86 @@ snapshots: dependencies: csstype: 3.2.3 + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + '@zkpassport/poseidon2@0.6.2': {} abort-controller@3.0.0: @@ -4157,6 +5965,10 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 + acorn-import-phases@1.0.4(acorn@8.17.0): + dependencies: + acorn: 8.17.0 + acorn@8.17.0: {} agent-base@6.0.2: @@ -4169,6 +5981,22 @@ snapshots: dependencies: humanize-ms: 1.2.1 + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv-keywords@5.1.0(ajv@8.20.0): + dependencies: + ajv: 8.20.0 + fast-deep-equal: 3.1.3 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.8 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -4188,8 +6016,18 @@ snapshots: arg@5.0.2: {} + argparse@2.0.1: {} + array-timsort@1.0.3: {} + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + + ast-types@0.16.3: + dependencies: + tslib: 2.8.1 + asynckit@0.4.0: {} autoprefixer@10.5.0(postcss@8.5.15): @@ -4295,8 +6133,12 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 + callsites@3.1.0: {} + camelcase-css@2.0.1: {} + camelcase@6.3.0: {} + caniuse-lite@1.0.30001797: {} chalk@5.6.2: {} @@ -4313,6 +6155,8 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chrome-trace-event@1.0.4: {} + ci-info@4.4.0: {} client-only@0.0.1: {} @@ -4362,18 +6206,43 @@ snapshots: content-type@2.0.0: {} + convert-source-map@2.0.0: {} + cookie-signature@1.2.2: {} cookie@0.7.2: {} cookie@1.1.1: {} + cosmiconfig@8.3.6(typescript@5.9.3): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.3.2 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.9.3 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + css-loader@7.1.4(@rspack/core@1.7.11(@swc/helpers@0.5.15))(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.15)): + dependencies: + icss-utils: 5.1.0(postcss@8.5.15) + postcss: 8.5.15 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.15) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.15) + postcss-modules-scope: 3.2.1(postcss@8.5.15) + postcss-modules-values: 4.0.0(postcss@8.5.15) + postcss-value-parser: 4.2.0 + semver: 7.8.4 + optionalDependencies: + '@rspack/core': 1.7.11(@swc/helpers@0.5.15) + webpack: 5.105.0(esbuild@0.28.1)(postcss@8.5.15) + cssesc@3.0.0: {} csstype@3.2.3: {} @@ -4388,6 +6257,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + define-lazy-prop@2.0.0: {} + delayed-stream@1.0.0: {} depd@2.0.0: {} @@ -4398,8 +6269,15 @@ snapshots: dlv@1.1.3: {} + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + dotenv@16.6.1: {} + dotenv@17.3.1: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -4423,17 +6301,34 @@ snapshots: encodeurl@2.0.0: {} + enhanced-resolve@5.26.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + entities@4.5.0: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + error-stack-parser-es@1.0.5: {} + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + es-define-property@1.0.1: {} es-errors@1.3.0: {} + es-module-lexer@2.3.2: {} + es-object-atoms@1.1.2: dependencies: es-errors: 1.3.0 @@ -4531,16 +6426,60 @@ snapshots: '@esbuild/win32-ia32': 0.28.0 '@esbuild/win32-x64': 0.28.0 + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + escalade@3.2.0: {} escape-html@1.0.3: {} + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + esprima@4.0.1: {} + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + etag@1.8.1: {} event-target-shim@5.0.1: {} + events@3.3.0: {} + eventsource@2.0.2: {} execa@5.1.1: @@ -4588,6 +6527,8 @@ snapshots: transitivePeerDependencies: - supports-color + fast-deep-equal@3.1.3: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4596,6 +6537,8 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-uri@3.1.8: {} + fast-xml-builder@1.2.0: dependencies: path-expression-matcher: 1.5.0 @@ -4678,6 +6621,8 @@ snapshots: fresh@2.0.0: {} + fs-monkey@1.0.3: {} + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -4685,6 +6630,8 @@ snapshots: function-bind@1.1.2: {} + gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} get-east-asian-width@1.6.0: {} @@ -4717,6 +6664,8 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regexp@0.4.1: {} + glob@12.0.0: dependencies: foreground-child: 3.3.1 @@ -4735,10 +6684,14 @@ snapshots: gopd@1.2.0: {} + graceful-fs@4.2.11: {} + gzip-size@6.0.0: dependencies: duplexer: 0.1.2 + has-flag@4.0.0: {} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 @@ -4755,6 +6708,8 @@ snapshots: hono@4.12.27: {} + html-entities@2.6.0: {} + http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -4780,14 +6735,25 @@ snapshots: dependencies: safer-buffer: 2.1.2 + icss-utils@5.1.0(postcss@8.5.15): + dependencies: + postcss: 8.5.15 + ieee754@1.2.1: {} ignore@5.3.2: {} + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + inherits@2.0.4: {} ipaddr.js@1.9.1: {} + is-arrayish@0.2.1: {} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -4798,6 +6764,8 @@ snapshots: dependencies: hasown: 2.0.4 + is-docker@2.2.1: {} + is-extglob@2.1.1: {} is-glob@4.0.3: @@ -4816,6 +6784,10 @@ snapshots: dependencies: which-typed-array: 1.1.22 + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + isarray@2.0.5: {} isexe@2.0.0: {} @@ -4826,18 +6798,56 @@ snapshots: dependencies: '@isaacs/cliui': 9.0.0 + jest-worker@27.5.1: + dependencies: + '@types/node': 22.19.20 + merge-stream: 2.0.0 + supports-color: 8.1.1 + jiti@1.21.7: {} + js-tokens@4.0.0: {} + + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + kiwi-schema@0.5.0: {} + + kleur@3.0.3: {} + kleur@4.1.5: {} lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} + loader-runner@4.3.2: {} + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + lru-cache@10.4.3: {} lru-cache@11.5.1: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + lucide-react@1.23.0(react@19.2.7): dependencies: react: 19.2.7 @@ -4846,6 +6856,15 @@ snapshots: media-typer@1.1.0: {} + mediabunny@1.50.8: + dependencies: + '@types/dom-mediacapture-transform': 0.1.12 + '@types/dom-webcodecs': 0.1.13 + + memfs@3.4.3: + dependencies: + fs-monkey: 1.0.3 + merge-descriptors@2.0.0: {} merge-stream@2.0.0: {} @@ -4891,6 +6910,8 @@ snapshots: dependencies: brace-expansion: 2.1.1 + minimist@1.2.6: {} + minipass@4.2.8: {} minipass@7.1.3: {} @@ -4935,6 +6956,8 @@ snapshots: negotiator@1.0.0: {} + neo-async@2.6.2: {} + next@16.2.9(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: '@next/env': 16.2.9 @@ -4959,6 +6982,11 @@ snapshots: - '@babel/core' - babel-plugin-macros + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + node-domexception@1.0.0: {} node-fetch@2.7.0: @@ -5000,10 +7028,27 @@ snapshots: dependencies: mimic-fn: 2.1.0 + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + package-json-from-dist@1.0.1: {} pako@2.1.0: {} + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + parseurl@1.3.3: {} path-expression-matcher@1.5.0: {} @@ -5026,6 +7071,8 @@ snapshots: path-to-regexp@8.4.2: {} + path-type@4.0.0: {} + pathe@2.0.3: {} picocolors@1.1.1: {} @@ -5061,6 +7108,27 @@ snapshots: tsx: 4.22.4 yaml: 2.9.0 + postcss-modules-extract-imports@3.1.0(postcss@8.5.15): + dependencies: + postcss: 8.5.15 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.15): + dependencies: + icss-utils: 5.1.0(postcss@8.5.15) + postcss: 8.5.15 + postcss-selector-parser: 7.1.6 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.15): + dependencies: + postcss: 8.5.15 + postcss-selector-parser: 7.1.6 + + postcss-modules-values@4.0.0(postcss@8.5.15): + dependencies: + icss-utils: 5.1.0(postcss@8.5.15) + postcss: 8.5.15 + postcss-nested@6.2.0(postcss@8.5.15): dependencies: postcss: 8.5.15 @@ -5071,6 +7139,11 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-selector-parser@7.1.6: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} postcss@8.4.31: @@ -5087,6 +7160,13 @@ snapshots: postgres@3.4.9: {} + prettier@3.8.1: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -5118,6 +7198,8 @@ snapshots: react: 19.2.7 scheduler: 0.27.0 + react-refresh@0.18.0: {} + react@19.2.7: {} read-cache@1.0.0: @@ -5128,6 +7210,23 @@ snapshots: dependencies: picomatch: 2.3.2 + recast@0.23.11: + dependencies: + ast-types: 0.16.3 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + remotion@4.0.502(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + resolve@1.22.12: dependencies: es-errors: 1.3.0 @@ -5157,6 +7256,19 @@ snapshots: scheduler@0.27.0: {} + schema-utils@4.5.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + ajv-keywords: 5.1.0(ajv@8.20.0) + + semver@6.3.1: {} + + semver@7.5.3: + dependencies: + lru-cache: 6.0.0 + semver@7.8.4: {} send@1.2.1: @@ -5270,6 +7382,13 @@ snapshots: signal-exit@4.1.0: {} + sisteransi@1.0.5: {} + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + source-map-js@1.2.1: {} source-map-support@0.5.21: @@ -5279,6 +7398,10 @@ snapshots: source-map@0.6.1: {} + source-map@0.8.0: {} + + stackframe@1.3.4: {} + statuses@2.0.2: {} string-width@7.2.0: @@ -5301,6 +7424,10 @@ snapshots: dependencies: anynum: 1.0.0 + style-loader@4.0.0(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.15)): + dependencies: + webpack: 5.105.0(esbuild@0.28.1)(postcss@8.5.15) + styled-jsx@5.1.6(react@19.2.7): dependencies: client-only: 0.0.1 @@ -5318,8 +7445,14 @@ snapshots: supports-color@10.2.2: {} + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} + svg-parser@2.1.0: {} + tailwindcss@3.4.19(tsx@4.22.4)(yaml@2.9.0): dependencies: '@alloc/quick-lru': 5.2.0 @@ -5348,6 +7481,19 @@ snapshots: - tsx - yaml + tapable@2.3.3: {} + + terser-webpack-plugin@5.6.1(esbuild@0.28.1)(postcss@8.5.15)(webpack@5.105.0(postcss@8.5.15)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.5.0 + terser: 5.51.2 + webpack: 5.105.0(esbuild@0.28.1)(postcss@8.5.15) + optionalDependencies: + esbuild: 0.28.1 + postcss: 8.5.15 + terser@5.16.9: dependencies: '@jridgewell/source-map': 0.3.11 @@ -5355,6 +7501,13 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + terser@5.51.2: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.17.0 + commander: 2.20.3 + source-map-support: 0.5.21 + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -5363,6 +7516,8 @@ snapshots: dependencies: any-promise: 1.3.0 + tiny-invariant@1.3.3: {} + tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.4) @@ -5374,6 +7529,8 @@ snapshots: safe-buffer: 5.2.1 typed-array-buffer: 1.0.3 + to-fast-properties@2.0.0: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -5436,10 +7593,57 @@ snapshots: vary@1.1.2: {} + watchpack@2.5.2: + dependencies: + graceful-fs: 4.2.11 + web-streams-polyfill@4.0.0-beta.3: {} webidl-conversions@3.0.1: {} + webpack-sources@3.6.0: {} + + webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.15): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.9 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.17.0 + acorn-import-phases: 1.0.4(acorn@8.17.0) + browserslist: 4.28.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.26.0 + es-module-lexer: 2.3.2 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.2 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.5.0 + tapable: 2.3.3 + terser-webpack-plugin: 5.6.1(esbuild@0.28.1)(postcss@8.5.15)(webpack@5.105.0(postcss@8.5.15)) + watchpack: 2.5.2 + webpack-sources: 3.6.0 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - uglify-js + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -5498,10 +7702,16 @@ snapshots: ws@8.20.1: {} + ws@8.21.0: {} + xml-naming@0.1.0: {} y18n@5.0.8: {} + yallist@3.1.1: {} + + yallist@4.0.0: {} + yaml@2.9.0: {} yargs-parser@22.0.0: {} @@ -5527,3 +7737,5 @@ snapshots: '@speed-highlight/core': 1.2.16 cookie: 1.1.1 youch-core: 0.3.3 + + zod@4.4.3: {} diff --git a/scripts/build-contracts.sh b/scripts/build-contracts.sh index b52add7..e7e5233 100644 --- a/scripts/build-contracts.sh +++ b/scripts/build-contracts.sh @@ -1,11 +1,10 @@ #!/usr/bin/env bash -# Builds the three demo contracts to wasm and copies the artifacts into +# Builds the Lucent contracts to wasm and copies the artifacts into # packages/sdk/contracts/ so the SDK/deploy script can load them. # # Requires the pinned stable Rust toolchain with the wasm32v1-none target # (see contracts/rust-toolchain.toml) and a local checkout of -# OpenZeppelin/stellar-contracts @ feat/confidential-verifier-ultrahonk at the -# path declared in contracts/Cargo.toml. +# OpenZeppelin dependencies pinned by contracts/Cargo.lock. set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" @@ -41,4 +40,7 @@ for pair in "${WASMS[@]}"; do echo " wrote $OUT_DIR/${dst}.wasm ($(wc -c < "$OUT_DIR/${dst}.wasm") bytes)" done +# Keep the factory integration test on the same instance bytecode we ship. +cp "$OUT_DIR/private_escrow_instance.wasm" "$ROOT/contracts/escrow-factory/testdata/private_escrow_instance.wasm" + echo "Done."