# Contribution Point NFT

#### CP(Contribution Point) NFT 는 판게아 스왑에 대한 유저의 기여 내역 정보를 관리하는 NFT입니다.

1 지갑 당 하나의 CP NFT만 소유 가능하며, Non-Transferable한 형태로 지갑 주소에 귀속됩니다. 최초로 기여하는 시점에 CP NFT가 발급되며, 이후에 추가적인 기여를 했을 시에는 기존에 보유하고 있는 CP NFT 에 기여 내역이 추가됩니다.

CP NFT 에 기록되는 정보는 크게 \[태그] 정보와 \[기여 이력] 정보로 나뉩니다. \[태그] 는 기여의 유형을 나타내며, \[기여 이력]은 유저(지갑 주소)별로 실제 기여한 내역을 나타냅니다.

매니저들은 \[태그] 와 \[기여 이력]을 추가/수정/삭제 할 수 있는 권한을 가지며, 실제 CP NFT 를 수령하는 유저들은 기여에 따라 받은 CP를 사용할 수 있는 권한을 가집니다.

![](https://3996449394-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo5oaAPNdOPaztDd5hPuZ%2Fuploads%2F2cGUpQmGFAmKsnHOW9FU%2Fimage.png?alt=media\&token=e14fadff-5c25-462e-8501-1338cc1c51f0)

CP NFT는 Opensea 에서 제공하는 metadata format 을 준수하여 설계되었습니다. 유저는 직접 스마트 컨트랙트를 호출하지 않아도 Opensea 의 컬렉션을 통해 자신의 기여 내역을 쉽게 확인할 수 있습니다.

유저는 이후에 `usePoint` 기능을 활용하여 본인이 소유하고 있는 CP NFT의 CP를 사용해 판게아 스왑의 다양한 혜택(e.g. 거버넌스 토큰 STONE 런칭시 리워드 수령)을 누릴 수 있습니다.

{% embed url="<https://github.com/pangea-protocol/contribution-point>" %}

## Methods

### contributionPointOf

```solidity
function contributionPointOf(address contributor) external view returns (int256)
```

### contributionRecordByIndex

```solidity
function contributionRecordByIndex(address contributor, uint256 orderId) external view returns (struct IContributionStruct.ContributionRecord)
```

### contributionRecordCounts

```solidity
function contributionRecordCounts(address contributor) external view returns (uint256)
```

### contributionRecords

```solidity
function contributionRecords(address contributor, uint256 start, uint256 nums) external view returns (struct IContributionStruct.ContributionRecord[] records)
```

### contributorIdOf

```solidity
function contributorIdOf(address contributor) external view returns (uint256)
```

### createRecord

```solidity
function createRecord(address contributor, uint32 tagId, uint32 point) external nonpayable
```

### createTag

```solidity
function createTag(string desc) external nonpayable returns (uint32 tagId)
```

### deleteRecord

```solidity
function deleteRecord(address contributor, uint256 orderId) external nonpayable returns (struct IContributionStruct.ContributionRecord record)
```

### totalTags

```solidity
function totalTags() external view returns (uint256)
```

### updateRecord

```solidity
function updateRecord(address contributor, uint256 orderId, uint32 point) external nonpayable
```

### updateTagDescription

```solidity
function updateTagDescription(uint32 tagId, string desc) external nonpayable
```

### usePoint

```solidity
function usePoint(uint32 amount, address to, bytes data) external nonpayable
```
