メインコンテンツまでスキップ

レピュテーション統合ガイド

KarmaはStatus Networkのソウルバウンドレピュテーショントークンです。すべてのアドレスは、SNTステーキング、アセットのブリッジ、流動性提供、アプリの使用、プレミアムガス手数料の支払いなど、ネットワークへの真正な参加を通じてKarmaを獲得します。Karmaは購入、売却、転送することができません。

このガイドでは、Karmaデータの読み取り方法と、ユーザーのレピュテーションティアに応じたアプリの構築方法を説明します。

オンチェーンでのKarma読み取り

Karmaの状態は2つのコントラクトに分かれています:

  • Karma — ソウルバウンドERC-20トークン。balanceOfはスラッシング後の純残高を返します。転送と承認は常にリバートします。
  • KarmaTiers — 残高をティアにマッピングします。getTierIdByKarmaBalance(balance)を呼び出してからgetTierById(tierId)を呼び出し、ユーザーのティアとそのtxPerEpochクォータを解決します。
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;

/// @notice Minimal interface for the Karma soulbound token.
interface IKarma {
/// @notice Net Karma balance of `account` after slashing.
function balanceOf(address account) external view returns (uint256);

/// @notice Total amount slashed from `account` across all distributors.
function slashedAmountOf(address account) external view returns (uint256);
}

/// @notice Minimal interface for the KarmaTiers registry.
interface IKarmaTiers {
struct Tier {
uint256 minKarma;
uint256 maxKarma;
string name;
uint32 txPerEpoch; // gasless transactions allowed per epoch
}

/// @notice Returns the highest tier ID the given karma balance qualifies for.
function getTierIdByKarmaBalance(uint256 karmaBalance) external view returns (uint8);

/// @notice Returns the full Tier struct for a given tier ID.
function getTierById(uint8 tierId) external view returns (Tier memory);

/// @notice Returns the total number of configured tiers.
function getTierCount() external view returns (uint256);
}

contract KarmaGated {
IKarma public karma;
IKarmaTiers public karmaTiers;

constructor(address _karmaContract, address _karmaTiersContract) {
karma = IKarma(_karmaContract);
karmaTiers = IKarmaTiers(_karmaTiersContract);
}

/// @notice Resolves the tier ID for `user` from their current Karma balance.
function tierIdOf(address user) public view returns (uint8) {
return karmaTiers.getTierIdByKarmaBalance(karma.balanceOf(user));
}

modifier onlyTier(uint8 minTier) {
require(tierIdOf(msg.sender) >= minTier, "Karma tier too low");
_;
}

function premiumAction() external onlyTier(3) {
// Only users at tier 3 or above can call this
}

function getDiscount(address user) external view returns (uint256) {
uint8 tierId = tierIdOf(user);
// Higher tiers get bigger discounts
return uint256(tierId) * 5; // 0%, 5%, 10%, ...
}
}
コントラクトアドレス

KarmaとKarmaTiersのテストネットコントラクトアドレスはコントラクトアドレスページに掲載されています。

考えられる統合パターン

機能ゲーティング

Karmaティアに基づいて機能をアンロックします。オンチェーンでのKarma読み取りセクションのonlyTierモディファイアがコントラクトレベルでアクセスを制御します:

function accessPremiumContent() external onlyTier(3) {
// Only users at tier 3 or above can call this
}

ダイナミックプライシング

高Karmaユーザーに割引やより良いレートを提供します:

function calculateFee(address user, uint256 baseAmount) public view returns (uint256) {
uint8 tierId = karmaTiers.getTierIdByKarmaBalance(karma.balanceOf(user));
// Each tier gives 5% discount
uint256 discount = uint256(tierId) * 5;
return baseAmount * (100 - discount) / 100;
}

レピュテーション表示

KarmaTiersコントラクトから直接名前を読み取って、UIにKarmaティアを信頼シグナルとして表示します:

// オンチェーンでティア名を取得 — ハードコードされた配列は不要
const balance = await karma.balanceOf(userAddress);
const tierId = await karmaTiers.getTierIdByKarmaBalance(balance);
const tier = await karmaTiers.getTierById(tierId);

function KarmaBadge({ tierName }) {
return <span className="karma-badge">{tierName}</span>;
}

// 使用方法
<KarmaBadge tierName={tier.name} />

加重ガバナンス

アプリのガバナンスでKarmaを投票の重み付けに使用します:

function vote(uint256 proposalId, bool support) external {
uint256 weight = karma.balanceOf(msg.sender);
proposals[proposalId].votes += support ? int256(weight) : -int256(weight);
}

次のステップ