Injective の Permissions モジュール
permissions モジュール
は Injective にネイティブであり、Denom に対するカスタム管理(例:ロール)を可能にします。
この機能は MultiVM Token Standard (MTS) トークンにも拡張されており、
EVM smart contract コード内でこれらのカスタム管理ルールを実装できます。
MTS トークンで Permissions を使用する理由
Injective 上で MTS を使用して現実世界の資産(RWA)をトークン化しており、
その基礎資産が本質的にパーミッションを必要とする場合、
それは Injective の permissions モジュールを活用する最適なユースケースです。
MTS トークンの EVM smart contract は、permissions モジュールの機能を利用するために、
追加の Solidity インターフェースを実装するだけです。
Smart Contract の実装
smart contract 内で、PermissionsHook.sol から IPermissionsHook をインポートして拡張します。
interface IPermissionsHook
これには、以下のシグネチャを持つ isTransferRestricted 関数の実装が含まれます:
function isTransferRestricted(
address from,
address to,
Cosmos.Coin calldata amount
)
完全なファイルは Github で確認できます:
PermissionsHook.sol
Smart Contract の例
PermissionsHook を拡張する smart contract を作成します:
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...", // <-- EVM address of the MTS token
"evm_hook": "0x...", // <-- EVM address of the permissions hook
"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 つにすぎません。
複数のバリエーションがあります。
この手順の詳細や他のバリエーションについては、
権限付き資産の発行方法を参照してください。
リファレンス実装
ステーブルコインにおける権限付き 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 を参照してください。