,
+ 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.
s.map((x) => ({ ...x, status: "done" })));
await refresh();
- } catch {
+ } catch (e) {
+ setError(errMsg(e));
setRegisterSteps((s) => s.map((x) => ({ ...x, status: "error" })));
} finally {
setRegistering(false);
@@ -408,6 +411,19 @@ export function HomeClient() {
const hour = new Date().getHours();
const greeting = hour < 12 ? "Good morning" : hour < 17 ? "Good afternoon" : "Good evening";
+ if (!view) {
+ return (
+
+
+
+
setError(null)} />
+ {connecting ? "Checking your on-chain account…" : "Account status is unavailable. Retry before registering or transacting."}
+ Retry account check
+
+
+ );
+ }
+
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" &&
setCheckAttempt(n => n + 1)}>Retry registration check }
+
- {recipients && recipients.length > 0 && (
- <>
- Registered accounts
-
- {recipients.map((a) => (
-
setTo(a)} className="w-full text-left">
-
-
-
-
- ))}
-
- >
- )}
-
- setStep("amount")}>
+ setStep("amount")}>
Continue
>
@@ -186,7 +207,7 @@ export default function SendPage() {
- setStep("confirm")}>
+ setStep("confirm")}>
Preview Send
>
@@ -224,7 +245,7 @@ export default function SendPage() {
-
+
Send
>
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."