address 0x2 { module S { struct Storage has key { x: X, y: Y, v: u8, } // F1: public fun publish_u64_bool(account: signer, x: u64, y: bool) { move_to(&account, Storage { x, y, v: 0 }) } // F2: public fun publish_u64_y(account: signer, x: u64, y: Y) { move_to(&account, Storage { x, y, v: 1 }) } // F3: public fun publish_x_bool(account: signer, x: X, y: bool) { move_to(&account, Storage { x, y, v: 2 }) } // F4: public fun publish_x_y(account: signer, x: X, y: Y) { move_to(&account, Storage { x, y, v: 3 }) } } module A { use 0x2::S; // I1: invariant exists>(@0x22) ==> global>(@0x22).x == 1; // I2: invariant exists>(@0x23) ==> global>(@0x23).x > 0; // I3: invariant exists>(@0x24) ==> global>(@0x24).y; // I4: invariant (exists>(@0x25) && exists>(@0x26)) ==> global>(@0x25) == global>(@0x26); public fun good(account1: signer, account2: signer) { S::publish_x_y(account1, 1, true); S::publish_x_y(account2, 1, true); } // all invariants (I1-I4) should be disproved in all functions (F1-F4) } }