본문으로 건너뛰기

평판 적용 가이드

카르마는 Status Network의 소울바운드 평판 토큰입니다. 인간과 봇을 포함한 모든 이의 계정은 SNT 스테이킹, 자산 브릿징, 유동성 제공, 앱 사용, 프리미엄 가스비 지불 등 실제 네트워크 참여를 통해 카르마를 획득합니다. 카르마는 구매, 판매 또는 전송할 수 없습니다.

본 가이드는 카르마 정보를 읽고 사용자의 평판 티어에 따라 다르게 반응하는 앱을 구축하는 방법을 다룹니다.

온체인에서 카르마 읽기

카르마 상태는 두 개의 컨트랙트에 분산되어 있습니다:

  • Karma — 소울바운드 ERC-20 토큰. balanceOf는 해당 계정의 슬래싱량이 제외된 순 잔액을 반환합니다. transferapprove 함수 호출은 모두 거절됩니다.
  • 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의 테스트넷 컨트랙트 주소는 컨트랙트 주소 페이지에 게시되어 있습니다.

가능한 적용 패턴

기능 제한

앱 내 기능을 카르마 티어에 따라 잠금 해제합니다. 온체인에서 카르마 읽기 섹션에서 확인할 수 있는 onlyTier modifier가 컨트랙트 레벨에서 접근을 제어합니다. 혹은 코드 내에서 tierId흫 활용하여 제어할 수도 있습니다:

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

동적 가격 책정

높은 카르마 사용자에게 할인 요금을 제공합니다:

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에 카르마 티어를 표시, 신뢰 지표로 활용합니다:

// 온체인에서 티어 이름을 가져옴 — 하드코딩된 배열 불필요
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} />

가중 거버넌스

앱의 거버넌스에서 카르마를 투표 가중치로 사용합니다:

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

다음 단계