PILicenseTemplate(프로그래머블 IP 라이선스 템플릿)은 Story에서 IP 자산에 대한 라이선스 조건을 정의하고 관리하는 스마트 계약입니다. IP 소유자가 IP 자산에 첨부할 수 있는 맞춤형 라이선스 조건을 만들 수 있게 하여 IP를 상업적으로 사용하고 파생 작품을 만드는 방법을 제어할 수 있게 합니다.

상태 변수

LICENSE_REGISTRY

ILicenseRegistry public immutable LICENSE_REGISTRY

라이선스 조건과 토큰을 추적하는 라이선스 레지스트리 계약의 주소입니다.

ROYALTY_MODULE

IRoyaltyModule public immutable ROYALTY_MODULE

로열티 지불과 정책을 처리하는 로열티 모듈 계약의 주소입니다.

licenseTerms

mapping(uint256 licenseTermsId => PILTerms) licenseTerms

라이선스 조건 ID를 해당하는 PILTerms 구조체에 매핑합니다.

hashedLicenseTerms

mapping(bytes32 licenseTermsHash => uint256 licenseTermsId) hashedLicenseTerms

라이선스 조건의 해시를 해당하는 라이선스 조건 ID에 매핑합니다.

licenseTermsCounter

uint256 licenseTermsCounter

등록된 라이선스 조건의 수를 세는 카운터입니다.

함수

initialize

function initialize(address accessManager, string memory name, string memory metadataURI) external initializer

이 구현 계약의 초기화 함수입니다.

Parameters:

  • accessManager: 프로토콜 관리자 역할 계약의 주소입니다.
  • name: 라이선스 템플릿의 이름입니다.
  • metadataURI: 오프체인 메타데이터의 URL입니다.

registerLicenseTerms

function registerLicenseTerms(PILTerms calldata terms) external nonReentrant returns (uint256 id)

새로운 라이선스 조건을 등록하고 새로 등록된 라이선스 조건의 ID를 반환합니다. 라이선스 조건은 해시되며 이 해시를 사용하여 조건이 이미 등록되었는지 확인합니다. 조건이 이미 등록되어 있다면 기존 ID를 반환합니다.

Parameters:

  • terms: 등록할 PILTerms입니다.

Returns:

  • id: 새로 등록된 라이선스 조건의 ID입니다.

exists

function exists(uint256 licenseTermsId) external view override returns (bool)

라이선스 조건이 존재하는지 확인합니다.

Parameters:

  • licenseTermsId: 라이선스 조건의 ID입니다.

Returns:

  • 라이선스 조건이 존재하면 true를, 그렇지 않으면 false를 반환합니다.

verifyMintLicenseToken

function verifyMintLicenseToken(
    uint256 licenseTermsId,
    address licensee,
    address licensorIpId,
    uint256
) external override nonReentrant returns (bool)

라이선스 토큰의 발행을 확인합니다. 이 함수는 LicensingModule에서 라이선스 토큰을 발행할 때 호출되어 라이선스 조건에 따라 발행이 허용되는지 확인합니다.

Parameters:

  • licenseTermsId: 라이선스 조건의 ID입니다.
  • licensee: 라이선스 토큰을 받을 라이선스 사용자의 주소입니다.
  • licensorIpId: 라이선스 조건을 첨부하고 라이선스 토큰을 발행하는 라이선스 제공자의 IP ID입니다.

Returns:

  • 발행이 확인되면 true를, 그렇지 않으면 false를 반환합니다.

verifyRegisterDerivative

function verifyRegisterDerivative(
    address childIpId,
    address parentIpId,
    uint256 licenseTermsId,
    address licensee
) external override returns (bool)

파생 작품의 등록을 확인합니다. 이 함수는 LicensingModule에서 파생 작품을 등록할 때 호출되어 부모 IP의 라이선스 조건을 준수하는지 확인합니다.

Parameters:

  • childIpId: 파생 작품의 IP ID입니다.
  • parentIpId: 부모 IP의 IP ID입니다.
  • licenseTermsId: 라이선스 조건의 ID입니다.
  • licensee: 라이선스 사용자의 주소입니다.

Returns:

  • 등록이 확인되면 true를, 그렇지 않으면 false를 반환합니다.

verifyCompatibleLicenses

function verifyCompatibleLicenses(uint256[] calldata licenseTermsIds) external view override returns (bool)

라이선스들이 호환되는지 확인합니다. 이 함수는 LicensingModule에서 여러 부모 IP에 대한 파생 IP를 등록할 때 라이선스 호환성을 확인하기 위해 호출됩니다.

Parameters:

  • licenseTermsIds: 라이선스 조건들의 ID입니다.

Returns:

  • 라이선스들이 호환되면 true를, 그렇지 않으면 false를 반환합니다.

verifyRegisterDerivativeForAllParents

function verifyRegisterDerivativeForAllParents(
    address childIpId,
    address[] calldata parentIpIds,
    uint256[] calldata licenseTermsIds,
    address childIpOwner
) external override returns (bool)

모든 부모 IP에 대한 파생 작품의 등록을 확인합니다. 이 함수는 LicensingModule에서 여러 부모 IP에 대한 파생 IP를 등록할 때 라이선스를 확인하기 위해 호출됩니다.

Parameters:

  • childIpId: 파생 작품의 IP ID입니다.
  • parentIpIds: 부모 IP들의 IP ID입니다.
  • licenseTermsIds: 라이선스 조건들의 ID입니다.
  • childIpOwner: 파생 IP 소유자의 주소입니다.

Returns:

  • 등록이 확인되면 true를, 그렇지 않으면 false를 반환합니다.

getRoyaltyPolicy

function getRoyaltyPolicy(
    uint256 licenseTermsId
) external view returns (address royaltyPolicy, bytes memory royaltyData, uint256 mintingFee, address currency)

라이선스 조건의 로열티 정책을 반환합니다.

Parameters:

  • licenseTermsId: 라이선스 조건의 ID입니다.

Returns:

  • royaltyPolicy: 라이선스 조건에 지정된 로열티 정책의 주소입니다.
  • royaltyData: 로열티 정책의 데이터입니다.
  • mintingFee: 라이선스 발행 수수료입니다.
  • currency: 라이선스 발행 수수료와 로열티에 사용되는 ERC20 토큰의 주소입니다.

isLicenseTransferable

function isLicenseTransferable(uint256 licenseTermsId) external view override returns (bool)

라이선스 조건이 양도 가능한지 확인합니다.

Parameters:

  • licenseTermsId: 라이선스 조건의 ID.

Returns:

  • 라이선스 조건이 양도 가능하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

getEarlierExpireTime

function getEarlierExpireTime(
    uint256[] calldata licenseTermsIds,
    uint256 start
) external view override returns (uint256)

주어진 라이선스 조건들 중 가장 빠른 만료 시간을 반환합니다.

Parameters:

  • licenseTermsIds: 라이선스 조건들의 ID.
  • start: 시작 시간.

Returns:

  • 가장 빠른 만료 시간을 반환합니다.

getExpireTime

function getExpireTime(uint256 licenseTermsId, uint256 start) external view returns (uint256)

라이선스 조건의 만료 시간을 반환합니다.

Parameters:

  • licenseTermsId: 라이선스 조건의 ID.
  • start: 시작 시간.

Returns:

  • 만료 시간을 반환합니다.

getLicenseTermsId

function getLicenseTermsId(PILTerms calldata terms) external view returns (uint256 selectedLicenseTermsId)

주어진 라이선스 조건의 ID를 가져옵니다.

Parameters:

  • terms: ID를 가져올 PILTerms.

Returns:

  • selectedLicenseTermsId: 주어진 라이선스 조건의 ID.

getLicenseTerms

function getLicenseTerms(uint256 selectedLicenseTermsId) external view returns (PILTerms memory terms)

주어진 ID의 라이선스 조건을 가져옵니다.

Parameters:

  • selectedLicenseTermsId: 라이선스 조건의 ID.

Returns:

  • terms: 주어진 ID와 연관된 PILTerms.

getLicenseTermsURI

function getLicenseTermsURI(uint256 licenseTermsId) external view returns (string memory)

라이선스 조건의 URI를 반환합니다.

Parameters:

  • licenseTermsId: 라이선스 조건의 ID.

Returns:

  • 라이선스 조건의 URI를 반환합니다.

totalRegisteredLicenseTerms

function totalRegisteredLicenseTerms() external view returns (uint256)

등록된 라이선스 조건의 총 수를 반환합니다.

Returns:

  • 등록된 라이선스 조건의 총 수를 반환합니다.

supportsInterface

function supportsInterface(
    bytes4 interfaceId
) public view virtual override(BaseLicenseTemplateUpgradeable, IERC165) returns (bool)

컨트랙트가 주어진 인터페이스를 지원하는지 확인합니다.

Parameters:

  • interfaceId: 인터페이스 식별자.

Returns:

  • 컨트랙트가 인터페이스를 지원하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

toJson

function toJson(uint256 licenseTermsId) public view returns (string memory)

라이선스 조건을 라이선스 토큰의 메타데이터의 일부가 될 JSON 문자열로 변환합니다.

Parameters:

  • licenseTermsId: 라이선스 조건의 ID.

Returns:

  • OpenSea 메타데이터 표준을 따르는 라이선스 조건의 JSON 문자열을 반환합니다.

PILTerms 구조

PILTerms 구조는 프로그래머블 IP 라이선스(PIL)의 조건을 정의합니다:

struct PILTerms {
    bool transferable;
    address royaltyPolicy;
    uint256 mintingFee;
    uint256 expiration;
    bool commercialUse;
    bool commercialAttribution;
    address commercializerChecker;
    bytes commercializerCheckerData;
    uint32 commercialRevShare;
    uint256 commercialRevCelling;
    bool derivativesAllowed;
    bool derivativesAttribution;
    bool derivativesApproval;
    bool derivativesReciprocal;
    uint256 derivativeRevCelling;
    address currency;
    string uri;
}

Parameters:

  • transferable: 라이선스가 양도 가능한지 여부를 나타냅니다.
  • royaltyPolicy: StoryProtocol에서 사전에 요구하는 로열티 정책 컨트랙트의 주소입니다.
  • mintingFee: 라이선스 발행 시 지불해야 하는 수수료입니다.
  • expiration: 라이선스의 만료 기간입니다.
  • commercialUse: 작품을 상업적으로 사용할 수 있는지 여부를 나타냅니다.
  • commercialAttribution: 작품을 상업적으로 복제할 때 저작자 표시가 필요한지 여부입니다.
  • commercializerChecker: 작품을 상업적으로 이용할 수 있는 상업화 주체입니다. 제로 주소인 경우 제한이 없습니다.
  • commercializerCheckerData: 상업화 주체 확인 컨트랙트에 전달될 데이터입니다.
  • commercialRevShare: 라이선스 제공자와 공유해야 하는 수익의 비율입니다.
  • commercialRevCelling: 작품의 상업적 사용으로 생성될 수 있는 최대 수익입니다.
  • derivativesAllowed: 라이선스 사용자가 자신의 작품의 파생물을 만들 수 있는지 여부를 나타냅니다.
  • derivativesAttribution: 작품의 파생물에 대해 저작자 표시가 필요한지 여부를 나타냅니다.
  • derivativesApproval: 작품의 파생물이 라이선스 제공자 IP ID에 연결되기 전에 라이선스 제공자의 승인이 필요한지 여부를 나타냅니다.
  • derivativesReciprocal: 라이선스 사용자가 작품의 파생물을 동일한 조건으로 라이선스해야 하는지 여부를 나타냅니다.
  • derivativeRevCelling: 작품의 파생적 사용으로 생성될 수 있는 최대 수익입니다.
  • currency: 발행 수수료를 지불하는 데 사용될 ERC20 토큰입니다. 이 토큰은 Story Protocol에 등록되어 있어야 합니다.
  • uri: 오프체인 라이선스 조건을 가져오는 데 사용할 수 있는 라이선스 조건의 URI입니다.