说明
- 这是一个多资产管理模块
- 这个模块之中有两个特别的资产:StakingAssetCurrency、SpendingAssetCurrency。分别用于两种用途:staking和转账手续费等。
- 琐仓方法(set_locks)只有在StakingAssetCurrency中使用
重要数据存储
-
TotalIssuance
查询某个资产下面的总发行量 -
FreeBalance
查询某个人在某资产下面的余额 -
Permissions
查询某个资产对应的权限
重要方法
- 创建资产
- 代码:
fn create(origin, options: AssetOptions<T::GenericBalance, T::AccountId>)
- 参数:
- 代码:
/// Initial issuance of this asset. All deposit to the creator of the asset.
#[codec(compact)]
pub initial_issuance: Balance, // 创建资产总额
/// Which accounts are allowed to possess this asset.
pub permissions: PermissionLatest<AccountId>, // 资产权限
}
pub struct PermissionsV1<AccountId> {
/// Who have permission to update asset permission
pub update: Owner<AccountId>, // 谁有更新权限
/// Who have permission to mint new asset
pub mint: Owner<AccountId>, // 谁有铸币权限
/// Who have permission to burn asset
pub burn: Owner<AccountId>, // 谁又销毁权限
}
pub enum Owner<AccountId> {
/// No owner.
None,
/// Owned by an AccountId
Address(AccountId),
}
- 逻辑
- 获取下一个资产id, 创建资产
- 资产全部放在创建账户的自由余额下面
- 转账
- 代码:
pub fn transfer(origin, #[compact] asset_id: T::AssetId, to: T::AccountId, #[compact] amount: T::GenericBalance)
- 逻辑:
- 转账金额不为0
- 查询转出的账号该资产金额是否足够
- 判断该资产是否可以进行转账(不是staking_asset_id都可以转账,如果是则需要满足一定条件)
- 执行转账操作
- 代码:
- 更新权限
- 代码:
fn update_permission( origin, #[compact] asset_id: T::AssetId, new_permission: PermissionLatest<T::AccountId> )
- 逻辑
- 查看自己是否有更新权限, 有则更新
<Permissions<T>>::insert(asset_id, &permissions)
- 代码:
- 铸币
- 代码:
fn mint(origin, #[compact] asset_id: T::AssetId, to: T::AccountId, amount: T::GenericBalance)
- 参数:
-
asset_id
:资产id -
to
: 给谁铸币 -
amount
: 铸币金额
-
- 逻辑:
- 检查自己是否有铸币权限
- 更新该币种总金额
- 更新对应账户的自由余额
- 代码:
- 销毁币
- 代码:
fn burn(origin, #[compact] asset_id: T::AssetId, to: T::AccountId, amount: T::GenericBalance)
- 逻辑(与铸币刚好相反)
- 代码:
铸币和销毁币是针对于自由余额的操作
- root账户创建资产
- 代码:
fn create_reserved( origin, asset_id: T::AssetId, options: AssetOptions<T::GenericBalance, T::AccountId> )
- 逻辑:
- root权限
- 指定一个资产id
- 该资产转在default账户的自由余额下面
- 代码:
辅助方法
- 获取个人账户下某个币种的总金额(自由余额 + 保留余额)
- 代码:
pub fn total_balance(asset_id: &T::AssetId, who: &T::AccountId)
- 代码:
- 获取某个账户下某个币种的保留余额
- 代码:
pub fn reserved_balance(asset_id: &T::AssetId, who: &T::AccountId)
- 代码:
- 获取某个账户下某个币种的自由余额
- 代码:
pub fn free_balance(asset_id: &T::AssetId, who: &T::AccountId)
- 代码:
- 把某个币种的 部分自由余额转换成保留余额
- 代码:
pub fn reserve(asset_id: &T::AssetId, who: &T::AccountId, amount: T::GenericBalance)
- 逻辑:
- amount参数值不能低于自由余额
- 减少自由余额,增加保留余额
- 代码:
与balances模块不同的是:这个模块保留多少金额,自由余额必须高于它
- 解抵押保留余额
- 代码:
pub fn unreserve(asset_id: &T::AssetId, who: &T::AccountId, amount: T::GenericBalance)
- 逻辑:
- 如果amount比可解抵押的金额大,那么就用最大可解抵押金额
- 增加自由余额,减少保留余额
- 代码:
- 惩罚金额
- 代码:
pub fn slash(asset_id: &T::AssetId, who: &T::AccountId, amount: T::GenericBalance)
- 先从自由余额中扣除,如果自由余额不够,就从保留余额中扣除(保留余额再不够,就惩罚最大保留余额)
- 代码:
- 惩罚保留余额
- 代码:
pub fn slash_reserved(asset_id: &T::AssetId, who: &T::AccountId, amount: T::GenericBalance)
- 逻辑:
- 保留余额不够,就惩罚最大的
- 代码:
以上两个惩罚方法中,均没有对总发行量进行 不平衡处理,为什么?
- 惩罚自己账上的保留余额到特定的账户
- 代码:
pub fn repatriate_reserved( asset_id: &T::AssetId, who: &T::AccountId, beneficiary: &T::AccountId, amount: T::GenericBalance, status: BalanceStatus, )
- 逻辑:
- amount比保留余额大,就用保留余额最大值
- 资金有两个去处:对方的自由余额或是保留余额
- 更新自己的保留余额
- 代码:
- 检查自己是否有对应权限(相对于某种币种)
- 代码:
pub fn check_permission(asset_id: &T::AssetId, who: &T::AccountId, what: &PermissionType)
- 代码:
- 设置锁
- 代码:
fn set_lock( id: LockIdentifier, who: &T::AccountId, amount: T::GenericBalance, reasons: WithdrawReasons, )
- 逻辑:
- 循环遍历自己拥有的锁,如果之前已经有这个锁,那就结束,没有就添加
- 代码:
- 更新锁
- 代码:
fn extend_lock( id: LockIdentifier, who: &T::AccountId, amount: T::GenericBalance, reasons: WithdrawReasons, )
- 逻辑:
- 如果之前有这个锁, 那就用新锁与旧锁最大金额
- 如果之前没有这个锁,那就用这个锁
- 代码:
- 删除锁
- 代码:
fn remove_lock(id: LockIdentifier, who: &T::AccountId)
- 代码:
- 检查自己是否能够进行本次转账操作
- 代码:
pub fn ensure_can_withdraw( asset_id: &T::AssetId, who: &T::AccountId, _amount: T::GenericBalance, reasons: WithdrawReasons, new_balance: T::GenericBalance, )
- 逻辑:
- 该资产不是staking_asset_id,均可以执行本次操作
- 扣除金额后,自己的自由余额不能小余琐仓金额或者。。。。。
- 代码:
问题
- 如果创建资产时候没有指定权限,是否意味着任何人都没有铸币、销毁以及更新的权限。只有转账
- 这个default账户在那里修改,是否可以指定一个