// The resource of module which contains swap parameters.
resource struct T<Offered, Expected>{
offered: Dfinance::T<Offered>,
// Create a swap deal with two coin pairs: Offered and Expected.
public fun create<Offered, Expected>(sender: &signer, offered: Dfinance::T<Offered>, price: u128) {
let sender_addr = Signer::address_of(sender);
assert(!exists_at<Offered, Expected>(sender_addr), 101);
move_to<T<Offered, Expected>>(
// Get the price of the swap deal.
public fun get_price<Offered, Expected>(seller: address): u128 acquires T {
let offer = borrow_global<T<Offered, Expected>>(seller);
// Change price before swap happens.
public fun change_price<Offered, Expected>(sender: &signer, new_price: u128) acquires T {
let offer = borrow_global_mut<T<Offered, Expected>>(Signer::address_of(sender));
// Swap coins and deposit them to accounts: both creator and buyer.
public fun swap<Offered, Expected>(sender: &signer, seller: address, exp: Dfinance::T<Expected>) acquires T {
let T<Offered, Expected> { offered, price } = move_from<T<Offered, Expected>>(seller);
let exp_value = Dfinance::value<Expected>(&exp);
assert(exp_value == price, 102);
Account::deposit(sender, seller, exp);
Account::deposit_to_sender(sender, offered);
// Check if the swap pair already exists for the account.
public fun exists_at<Offered, Expected>(addr: address): bool {
exists<T<Offered, Expected>>(addr)