// Contains tests for treatment of opaque calls module 0x42::Test { struct R has key { v: u64 } fun get_and_incr(addr: address): u64 acquires R { if (!exists(addr)) abort 33; let r = borrow_global_mut(addr); let v = r.v; r.v = r.v + 1; v } spec get_and_incr { pragma opaque; requires addr != @0x0; aborts_if !exists(addr) with 33; aborts_if global(addr).v + 1 >= 18446744073709551615; modifies global(addr); ensures global(addr).v == old(global(addr)).v + 1; ensures result == global(addr).v; } fun incr_twice() acquires R { get_and_incr(@0x1); get_and_incr(@0x1); } spec incr_twice { aborts_if !exists(@0x1) with 33; ensures global(@0x1).v == old(global(@0x1)).v + 2; } }