メインコンテンツへスキップ

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": [
  ]
}
denomevm_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を参照してください。