Injectiveのpermissionsモジュール
permissionsモジュールはInjectiveにネイティブで、Denomのカスタム管理(例:ロール)を可能にします。
この機能はMultiVM Token Standard (MTS) トークンに拡張されており、
EVMスマートコントラクトコード内でカスタム管理ルールを実装できます。
なぜMTSトークンにpermissionsを使用するのか?
InjectiveでMTSを使用して現実世界の資産 (RWA) をトークン化しており、
その基盤となる資産が本質的にpermissionsを必要とする場合、
それはInjectiveのpermissionsモジュールを活用する優れたユースケースです。
MTSトークンのEVMスマートコントラクトは、permissionsモジュールの機能を活用するために
追加のSolidityインターフェースを実装するだけで済みます。
スマートコントラクトの実装
スマートコントラクトで、PermissionsHook.solからIPermissionsHookをインポートして拡張します。
interface IPermissionsHook
これには、以下のシグネチャを持つisTransferRestricted関数の実装が含まれます:
function isTransferRestricted(
address from,
address to,
Cosmos.Coin calldata amount
)
完全なファイルはGithubで確認できます:
PermissionsHook.sol
スマートコントラクトの例
PermissionsHookを拡張するスマートコントラクトを作成します:
import { Cosmos } from "../src/CosmosTypes.sol";
import { PermissionsHook } from "../src/PermissionsHook.sol";
contract RestrictedAddressTransferHook is PermissionsHook {
/*
...
*/
}
isTransferRestricted関数のカスタム実装を追加します。
例えば、この関数は特定のアドレスに関連する転送を除き、すべての転送を許可します:
function isTransferRestricted(
address from,
address to,
Cosmos.Coin calldata amount
) external pure override returns (bool) {
address restrictedAddress = "0x...";
if (from == restrictedAddress || to == restrictedAddress) {
// this particular address is not allowed to transfer
return true;
}
// All other transfers are allowed
return false;
}
より詳細な例はGithubで確認できます:
PermissionsHookExamples.sol
Hookの登録
permissions用のhookを登録するには、以下が必要です:
- MTSトークンをデプロイしたのと同じアカウントの制御権。
- MTSトークンのデプロイ済みアドレス
- Permissions Hookのデプロイ済みアドレス
上記を使用して、
このようなJSONファイルを作成できます。
次に、MTSトークンをデプロイしたのと同じアカウントを使用してinjectivedを実行し登録します。
injectived tx permissions create-namespace ...
MTSトークンとPermissions Hookは同じアドレスを持つことができます。
これはあなた次第のアーキテクチャ上の決定です。
Hookの登録例
以下の内容でregister-hooks.jsonという名前のファイルを作成します:
{
"denom": "erc20:0x...", // <-- MTSトークンのEVMアドレス
"evm_hook": "0x...", // <-- permissions hookのEVMアドレス
"role_permissions": [
{
"name": "EVERYONE",
"role_id": 0,
"permissions": 10
}
],
"actor_roles": [
]
}
denomとevm_hookフィールドの値を適切な値に置き換えてください。
ファイルが有効なJSONになるよう、すべてのコメントも削除してください。
次に、以下のコマンドを実行します:
injectived tx permissions create-namespace register-hooks.json [flags]
これは、MTSトークンにpermissions hookを定義する1つの特定の方法に過ぎません。
複数のバリエーションがあります。
このステップの追加詳細(他のバリエーションを含む)については、
Permissioned Assetsのローンチ方法を参照してください。
リファレンス実装
permissioned MTSトークンの使用を示す、より完全なステーブルコインの例も利用可能です。
この例には、トークンが一時停止されている場合に転送を防止し、
アドレスのブラックリストも管理するpermissions hookが含まれています。
function isTransferRestricted(
address _from,
address _to,
Cosmos.Coin calldata /* _amount */
) external view returns (bool) {
if (fiatToken.paused()) {
return true;
} else if (fiatToken.isBlacklisted(_from) || fiatToken.isBlacklisted(_to)) {
return true;
}
return false;
}
PermissionsHook_Inj.solを参照してください。