EvenSplitGroupPool은 IGroupRewardPool 인터페이스를 구현하고 그룹 내 IP 멤버들 간의 보상 분배를 관리하는 계약입니다. 이는 모든 멤버들 사이에 보상을 공정하게 분배하기 위해 균등 분할 메커니즘을 사용합니다.

상태 변수

ROYALTY_MODULE

IRoyaltyModule public immutable ROYALTY_MODULE

프로토콜 전체의 Royalty Module 주소입니다.

GROUPING_MODULE

IGroupingModule public immutable GROUPING_MODULE

프로토콜 전체의 Grouping Module 주소입니다.

GROUP_IP_ASSET_REGISTRY

IGroupIPAssetRegistry public immutable GROUP_IP_ASSET_REGISTRY

프로토콜 전체의 Group IP Asset Registry 주소입니다.

MAX_GROUP_SIZE

uint32 public constant MAX_GROUP_SIZE = 1_000

그룹에 허용되는 최대 IP 멤버 수입니다.

GroupInfo

struct GroupInfo {
    address token;
    uint32 totalMembers;
    uint128 pendingBalance;
    uint128 accRewardPerIp;
    uint256 averageRewardShare;
}

GroupInfo에 대한 저장 구조:

  • token: 그룹 IP에 첨부된 라이선스 조건에 의해 정의된 그룹의 보상 토큰
  • totalMembers: 그룹 내 IP의 총 수
  • pendingBalance: accRewardPerIp에 추가될 대기 중인 잔액
  • accRewardPerIp: IP당 누적 보상, MAX_GROUP_SIZE를 곱한 값
  • averageRewardShare: IP당 평균 보상 지분, 더 높은 최소 지분으로 새 IP가 참여할 때만 증가

함수

initialize

function initialize(address accessManager) public initializer

EvenSplitGroupPool 계약을 초기화합니다.

Parameters:

  • accessManager: 프로토콜 관리자 역할 계약의 주소입니다.

addIp

function addIp(
    address groupId,
    address ipId,
    uint256 minimumGroupRewardShare
) external onlyGroupingModule returns (uint256 totalGroupRewardShare)

그룹 풀에 IP를 추가합니다. GroupingModule만이 이 함수를 호출할 수 있습니다.

Parameters:

  • groupId: 그룹 ID입니다.
  • ipId: IP ID입니다.
  • minimumGroupRewardShare: IP가 그룹에 추가될 것으로 예상하는 최소 그룹 보상 지분입니다.

Returns:

  • totalGroupRewardShare: IP를 추가한 후의 총 그룹 보상 지분입니다.

removeIp

function removeIp(address groupId, address ipId) external onlyGroupingModule

그룹 풀에서 IP를 제거합니다. GroupingModule만이 이 함수를 호출할 수 있습니다.

Parameters:

  • groupId: 그룹 ID입니다.
  • ipId: IP ID입니다.

depositReward

function depositReward(address groupId, address token, uint256 amount) external onlyGroupingModule

그룹 풀에 직접 보상을 예치합니다.

Parameters:

  • groupId: 그룹 ID입니다.
  • token: 보상 토큰입니다.
  • amount: 보상의 양입니다.

getAvailableReward

function getAvailableReward(
    address groupId,
    address token,
    address[] calldata ipIds
) external view returns (uint256[] memory)

그룹 내 각 IP에 대한 보상을 반환합니다.

Parameters:

  • groupId: 그룹 ID입니다.
  • token: 보상 토큰입니다.
  • ipIds: IP ID들입니다.

Returns:

  • uint256[] memory: 각 IP에 대한 보상입니다.

distributeRewards

function distributeRewards(
    address groupId,
    address token,
    address[] calldata ipIds
) external whenNotPaused onlyGroupingModule returns (uint256[] memory rewards)

풀 내의 주어진 IP 계정들에게 보상을 분배합니다.

Parameters:

  • groupId: 그룹 ID입니다.
  • token: 보상 토큰들입니다.
  • ipIds: IP ID들입니다.

Returns:

  • rewards: 각 IP에 분배된 보상 금액을 포함하는 배열입니다.

getTotalIps

function getTotalIps(address groupId) external view returns (uint256)

그룹 내 IP의 총 수를 반환합니다.

Parameters:

  • groupId: 그룹 ID입니다.

Returns:

  • uint256: 그룹 내 IP의 총 수입니다.

getIpAddedTime

function getIpAddedTime(address groupId, address ipId) external view returns (uint256)

IP가 그룹에 추가된 타임스탬프를 반환합니다.

Parameters:

  • groupId: 그룹 ID입니다.
  • ipId: IP ID입니다.

Returns:

  • uint256: IP가 그룹에 추가된 타임스탬프입니다.

getIpRewardDebt

function getIpRewardDebt(address groupId, address token, address ipId) external view returns (uint256)

그룹 내 IP의 보상 부채를 반환합니다.

Parameters:

  • groupId: 그룹 ID입니다.
  • token: 보상 토큰입니다.
  • ipId: IP ID입니다.

Returns:

  • uint256: IP의 보상 부채입니다.

isIPAdded

function isIPAdded(address groupId, address ipId) external view returns (bool)

IP가 그룹에 추가되었는지 확인합니다.

Parameters:

  • groupId: 그룹 ID입니다.
  • ipId: IP ID입니다.

Returns:

  • bool: IP가 그룹에 추가되었으면 true, 그렇지 않으면 false입니다.

getMinimumRewardShare

function getMinimumRewardShare(address groupId, address ipId) external view returns (uint256)

그룹 내 IP의 최소 보상 지분을 반환합니다.

Parameters:

  • groupId: 그룹 ID입니다.
  • ipId: IP ID입니다.

Returns:

  • uint256: IP의 최소 보상 지분입니다.

getTotalAllocatedRewardShare

function getTotalAllocatedRewardShare(address groupId) external view returns (uint256)

그룹의 총 할당된 보상 지분을 반환합니다.

Parameters:

  • groupId: 그룹 ID입니다.

Returns:

  • uint256: 그룹의 총 할당된 보상 지분입니다.