Resources
Develop a resource
module Swap {
use 0x1::Dfinance;
use 0x1::Account;
use 0x1::Signer;
// The resource of module which contains swap parameters.
resource struct T<Offered, Expected>{
offered: Dfinance::T<Offered>,
price: u128,
}
// 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>>(
sender,
T<Offered, Expected> {
offered: offered,
price
}
);
}
// 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);
offer.price
}
// 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));
offer.price = new_price;
}
// 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)
}
}move_to<T>(&signer, T)
exists<T>(address)
borrow_global_mut<T>(address)
acquires
move_from<T>(address)
Summary
Publish
Scripts
More about resources
Last updated