// dep: ../../move-stdlib/sources/signer.move // dep: ../../move-stdlib/sources/vector.move // Regression test for a bug in handling generic mutual borrow, as well as parameter types of native functions. address 0x1 { module Diem { use std::signer; use std::vector; // A resource representing a fungible token struct T has key, store { // The value of the token. May be zero value: u64, } struct Info has key { total_value: u128, preburn_value: u64, } struct Preburn has key { requests: vector>, is_approved: bool, } spec Preburn { invariant !is_approved ==> len(requests) == 0; } public fun preburn( preburn_ref: &mut Preburn, coin: T ) acquires Info { let coin_value = value(&coin); vector::push_back( &mut preburn_ref.requests, coin ); let market_cap = borrow_global_mut>(@0xA550C18); market_cap.preburn_value = market_cap.preburn_value + coin_value } public fun preburn_to(account: &signer, coin: T) acquires Info, Preburn { preburn(borrow_global_mut>(signer::address_of(account)), coin) } public fun market_cap(): u128 acquires Info { borrow_global>(@0xA550C18).total_value } public fun preburn_value(): u64 acquires Info { borrow_global>(@0xA550C18).preburn_value } public fun value(coin_ref: &T): u64 { coin_ref.value } } }