Skip to content

Commit 835b61b

Browse files
authored
[first FA] moon coin tutorial (aptos-labs#8830)
1 parent 265c8cb commit 835b61b

File tree

12 files changed

+517
-29
lines changed

12 files changed

+517
-29
lines changed

aptos-move/move-examples/fungible_asset/README.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
* Managed fungible asset: A full-fledged fungible asset with customizable management capabilities and associated functions, based on which a light example is provided to show how to issue coin.
44
- Coin example: a light example showing how to issue coin based on managed fungible asset.
55
* Managed fungible token: A fungible token example that adds token resource to the metadata object.
6-
* Managed fungible asset: a full-fledged fungible asset with customizable management capabilities and associated functions.
7-
* Simple managed coin: an all-in-one module implementing managed coin using fungible asset with limited functionalities (only deal with primary fungible stores).
86
* Pre-minted managed coin: an example issuing pre-minting coin based on managed fungible asset.
9-
* Multisig managed coin: how to use multisig account to manage fungible assets.
7+
* Multisig managed coin: how to use multisig account to manage fungible assets.
8+
* FA coin: an all-in-one module coin example using manged fungible asset with limited functionalities (only deal with primary fungible stores).
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
[package]
2-
name = "SimpleManagedCoin"
2+
name = "Examples"
33
version = "0.0.0"
44

55
[addresses]
66
aptos_framework = "0x1"
7-
example_addr = "_"
7+
FACoin = "_"
88

99
[dependencies]
1010
AptosFramework = { local = "../../../framework/aptos-framework" }
Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/// A 2-in-1 module that combines managed_fungible_asset and coin_example into one module that when deployed, the
22
/// deployer will be creating a new managed fungible asset with the hardcoded supply config, name, symbol, and decimals.
33
/// The address of the asset can be obtained via get_metadata(). As a simple version, it only deal with primary stores.
4-
module example_addr::simple_managed_coin {
4+
module FACoin::fa_coin {
55
use aptos_framework::fungible_asset::{Self, MintRef, TransferRef, BurnRef, Metadata, FungibleAsset};
66
use aptos_framework::object::{Self, Object};
77
use aptos_framework::primary_fungible_store;
@@ -13,7 +13,7 @@ module example_addr::simple_managed_coin {
1313
/// Only fungible asset metadata owner can make changes.
1414
const ENOT_OWNER: u64 = 1;
1515

16-
const ASSET_SYMBOL: vector<u8> = b"LBR";
16+
const ASSET_SYMBOL: vector<u8> = b"FA";
1717

1818
#[resource_group_member(group = aptos_framework::object::ObjectGroup)]
1919
/// Hold refs to control the minting, transfer and burning of fungible assets.
@@ -24,12 +24,13 @@ module example_addr::simple_managed_coin {
2424
}
2525

2626
/// Initialize metadata object and store the refs.
27+
// :!:>initialize
2728
fun init_module(admin: &signer) {
2829
let constructor_ref = &object::create_named_object(admin, ASSET_SYMBOL);
2930
primary_fungible_store::create_primary_store_enabled_fungible_asset(
3031
constructor_ref,
3132
option::none(),
32-
utf8(b"Libra Coin"), /* name */
33+
utf8(b"FA Coin"), /* name */
3334
utf8(ASSET_SYMBOL), /* symbol */
3435
8, /* decimals */
3536
utf8(b"http://example.com/favicon.ico"), /* icon */
@@ -44,24 +45,25 @@ module example_addr::simple_managed_coin {
4445
move_to(
4546
&metadata_object_signer,
4647
ManagedFungibleAsset { mint_ref, transfer_ref, burn_ref }
47-
)
48+
)// <:!:initialize
4849
}
4950

5051
#[view]
5152
/// Return the address of the managed fungible asset that's created when this module is deployed.
5253
public fun get_metadata(): Object<Metadata> {
53-
let asset_address = object::create_object_address(&@example_addr, ASSET_SYMBOL);
54+
let asset_address = object::create_object_address(&@FACoin, ASSET_SYMBOL);
5455
object::address_to_object<Metadata>(asset_address)
5556
}
5657

58+
// :!:>mint
5759
/// Mint as the owner of metadata object.
58-
public entry fun mint(admin: &signer, amount: u64, to: address) acquires ManagedFungibleAsset {
60+
public entry fun mint(admin: &signer, to: address, amount: u64) acquires ManagedFungibleAsset {
5961
let asset = get_metadata();
6062
let managed_fungible_asset = authorized_borrow_refs(admin, asset);
6163
let to_wallet = primary_fungible_store::ensure_primary_store_exists(to, asset);
6264
let fa = fungible_asset::mint(&managed_fungible_asset.mint_ref, amount);
6365
fungible_asset::deposit_with_ref(&managed_fungible_asset.transfer_ref, to_wallet, fa);
64-
}
66+
}// <:!:mint
6567

6668
/// Transfer as the owner of metadata object ignoring `frozen` field.
6769
public entry fun transfer(admin: &signer, from: address, to: address, amount: u64) acquires ManagedFungibleAsset {
@@ -88,7 +90,7 @@ module example_addr::simple_managed_coin {
8890
fungible_asset::set_frozen_flag(transfer_ref, wallet, true);
8991
}
9092

91-
/// Unfreeze an account so it can transfer or receive fungible assets.
93+
/// Freeze an account so it cannot transfer or receive fungible assets.
9294
public entry fun unfreeze_account(admin: &signer, account: address) acquires ManagedFungibleAsset {
9395
let asset = get_metadata();
9496
let transfer_ref = &authorized_borrow_refs(admin, asset).transfer_ref;
@@ -122,15 +124,15 @@ module example_addr::simple_managed_coin {
122124
borrow_global<ManagedFungibleAsset>(object::object_address(&asset))
123125
}
124126

125-
#[test(creator = @example_addr)]
127+
#[test(creator = @FACoin)]
126128
fun test_basic_flow(
127129
creator: &signer,
128130
) acquires ManagedFungibleAsset {
129131
init_module(creator);
130132
let creator_address = signer::address_of(creator);
131133
let aaron_address = @0xface;
132134

133-
mint(creator, 100, creator_address);
135+
mint(creator, creator_address, 100);
134136
let asset = get_metadata();
135137
assert!(primary_fungible_store::balance(creator_address, asset) == 100, 4);
136138
freeze_account(creator, creator_address);
@@ -143,14 +145,14 @@ module example_addr::simple_managed_coin {
143145
burn(creator, creator_address, 90);
144146
}
145147

146-
#[test(creator = @example_addr, aaron = @0xface)]
148+
#[test(creator = @FACoin, aaron = @0xface)]
147149
#[expected_failure(abort_code = 0x50001, location = Self)]
148150
fun test_permission_denied(
149151
creator: &signer,
150152
aaron: &signer
151153
) acquires ManagedFungibleAsset {
152154
init_module(creator);
153155
let creator_address = signer::address_of(creator);
154-
mint(aaron, 100, creator_address);
156+
mint(aaron, creator_address, 100);
155157
}
156158
}

aptos-move/move-examples/tests/move_unit_tests.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,16 @@ fn test_message_board() {
112112

113113
#[test]
114114
fn test_fungible_asset() {
115-
let named_address = BTreeMap::from([(
116-
String::from("example_addr"),
117-
AccountAddress::from_hex_literal("0xcafe").unwrap(),
118-
)]);
115+
let named_address = BTreeMap::from([
116+
(
117+
String::from("example_addr"),
118+
AccountAddress::from_hex_literal("0xcafe").unwrap(),
119+
),
120+
(
121+
String::from("FACoin"),
122+
AccountAddress::from_hex_literal("0xcafe").unwrap(),
123+
),
124+
]);
119125
run_tests_for_pkg(
120126
"fungible_asset/managed_fungible_asset",
121127
named_address.clone(),
@@ -128,7 +134,7 @@ fn test_fungible_asset() {
128134
"fungible_asset/preminted_managed_coin",
129135
named_address.clone(),
130136
);
131-
run_tests_for_pkg("fungible_asset/simple_managed_coin", named_address);
137+
run_tests_for_pkg("fungible_asset/fa_coin", named_address);
132138
}
133139

134140
#[test]

0 commit comments

Comments
 (0)