Skip to content

Commit

Permalink
Merge pull request #1 from 0xStabby/feature/generic-on-chain-metadata
Browse files Browse the repository at this point in the history
Feature/generic on chain metadata
  • Loading branch information
0xStabby authored Dec 30, 2023
2 parents 577c0da + b715096 commit da9fa2a
Show file tree
Hide file tree
Showing 13 changed files with 1,022 additions and 871 deletions.
46 changes: 30 additions & 16 deletions contracts/extensions/ERC5725svg.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,43 @@ pragma solidity ^0.8.17;

import {ERC5725} from "../ERC5725.sol";
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {AssetBuilder} from "../libs/AssetBuilder.sol";
import {MetadataBuilder} from "../libs/MetadataBuilder.sol";
import {Base64Encoder} from "../libs/Base64Encoder.sol";
import {VestData} from "../libs/VestData.sol";
import {AssetBuilder} from "@bitbytebin/onchain/contracts/libs/AssetBuilder.sol";
import {MetadataBuilder} from "@bitbytebin/onchain/contracts/libs/MetadataBuilder.sol";
import {Base64Encoder} from "@bitbytebin/onchain/contracts/libs/Base64Encoder.sol";
import {OnChainDataStructs} from "@bitbytebin/onchain/contracts/libs/OnChainDataStructs.sol";

abstract contract ERC5725svg is ERC5725 {
function tokenURI(uint id) public view override returns (string memory) {
return metadata(id);
return getMetadata(id);
}

function metadata(uint id) public view virtual returns (string memory) {
VestData.Vdata memory vestdata;
vestdata.payout = Strings.toString(_payout(id));
vestdata.payoutToken = string.concat("0x", toAsciiString(_payoutToken(id)));
vestdata.startTime = Strings.toString(_startTime(id));
vestdata.endTime = Strings.toString(_endTime(id));
function getTraits(uint id) public view returns (OnChainDataStructs.Trait[] memory) {
OnChainDataStructs.Trait[] memory result = new OnChainDataStructs.Trait[](3);
result[0] = OnChainDataStructs.Trait("payoutToken", string.concat("0x", toAsciiString(_payoutToken(id))));
result[1] = OnChainDataStructs.Trait("startTime", Strings.toString(_startTime(id)));
result[2] = OnChainDataStructs.Trait("endTime", Strings.toString(_endTime(id)));
return result;
}

string memory image = AssetBuilder.buildSvg(vestdata);
image = Base64Encoder.encodeSvg(image);
string memory dataURI = MetadataBuilder.buildMetadata(id, "some description", image, vestdata);
dataURI = Base64Encoder.encodeMetadata(dataURI);
function getMetadata(uint id) public view virtual returns (string memory) {
return Base64Encoder.encodeMetadata(
MetadataBuilder.buildMetadata(
id, getImage(id),
OnChainDataStructs.Metadata(
"name",
"description",
getTraits(id)
)));
}

return dataURI;
function getImage(uint id) public view virtual returns (string memory) {
return Base64Encoder.encodeSvg(
AssetBuilder.buildSvg(
OnChainDataStructs.Metadata(
"name",
"description",
getTraits(id)
)));
}

function toAsciiString(address x) internal pure returns (string memory) {

Check failure on line 45 in contracts/extensions/ERC5725svg.sol

View workflow job for this annotation

GitHub Actions / test (16.x, ubuntu-latest)

'toAsciiString' should start with _
Expand Down
59 changes: 0 additions & 59 deletions contracts/libs/AssetBuilder.sol

This file was deleted.

26 changes: 0 additions & 26 deletions contracts/libs/Base64Encoder.sol

This file was deleted.

11 changes: 0 additions & 11 deletions contracts/libs/Constants.sol

This file was deleted.

36 changes: 0 additions & 36 deletions contracts/libs/MetadataBuilder.sol

This file was deleted.

11 changes: 0 additions & 11 deletions contracts/libs/VestData.sol

This file was deleted.

116 changes: 115 additions & 1 deletion docs/ERC5725.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,22 @@ mapping(uint256 => uint256) _payoutClaimed

_mapping for claimed payouts_

### _tokenIdApprovals

```solidity
mapping(uint256 => address) _tokenIdApprovals
```

_Mapping from token ID to approved tokenId operator_

### _operatorApprovals

```solidity
mapping(address => mapping(address => bool)) _operatorApprovals
```

_Mapping from owner to operator approvals_

### validToken

```solidity
Expand All @@ -30,6 +46,22 @@ function claim(uint256 tokenId) external

_See {IERC5725}._

### setClaimApprovalForAll

```solidity
function setClaimApprovalForAll(address operator, bool approved) external
```

_See {IERC5725}._

### setClaimApproval

```solidity
function setClaimApproval(address operator, bool approved, uint256 tokenId) external
```

_See {IERC5725}._

### vestedPayout

```solidity
Expand Down Expand Up @@ -93,7 +125,89 @@ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool
```

_See {IERC165-supportsInterface}.
IERC5725 interfaceId = 0x7c89676d_
IERC5725 interfaceId = 0xbd3a202b_

### getClaimApproved

```solidity
function getClaimApproved(uint256 tokenId) public view returns (address operator)
```

_See {IERC5725}._

### isClaimApprovedForAll

```solidity
function isClaimApprovedForAll(address owner, address operator) public view returns (bool isClaimApproved)
```

_Returns true if `owner` has set `operator` to manage all `tokenId`s._

| Name | Type | Description |
| ---- | ---- | ----------- |
| owner | address | The owner allowing `operator` to manage all `tokenId`s. |
| operator | address | The address who is given permission to spend tokens on behalf of the `owner`. |

### isApprovedClaimOrOwner

```solidity
function isApprovedClaimOrOwner(address operator, uint256 tokenId) public view virtual returns (bool)
```

To remove permissions, set operator to zero address.

_Public view which returns true if the operator has permission to claim for `tokenId`_

| Name | Type | Description |
| ---- | ---- | ----------- |
| operator | address | The address that has permission for a `tokenId`. |
| tokenId | uint256 | The NFT `tokenId`. |

### _setClaimApprovalForAll

```solidity
function _setClaimApprovalForAll(address operator, bool approved) internal virtual
```

To remove permissions, set approved to false.

_Internal function to set the operator status for a given owner to manage all `tokenId`s._

| Name | Type | Description |
| ---- | ---- | ----------- |
| operator | address | The address who is given permission to spend vested tokens. |
| approved | bool | The approved status. |

### _setClaimApproval

```solidity
function _setClaimApproval(address operator, uint256 tokenId) internal virtual
```

To remove permissions, set operator to zero address.

_Internal function to set the operator status for a given tokenId._

| Name | Type | Description |
| ---- | ---- | ----------- |
| operator | address | The address who is given permission to spend vested tokens. |
| tokenId | uint256 | The NFT `tokenId`. |

### _beforeTokenTransfer

```solidity
function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal
```

_Internal function to hook into {IERC721-_afterTokenTransfer}, when a token is being transferred.
Removes permissions to _tokenIdApprovals[tokenId] when the tokenId is transferred, burnt, but not on mint._

| Name | Type | Description |
| ---- | ---- | ----------- |
| from | address | The address from which the tokens are being transferred. |
| to | address | The address to which the tokens are being transferred. |
| firstTokenId | uint256 | The first tokenId in the batch that is being transferred. |
| batchSize | uint256 | The number of tokens being transferred in this batch. |

### _payoutToken

Expand Down
40 changes: 40 additions & 0 deletions docs/ERC5725svg.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Solidity API

## ERC5725svg

### tokenURI

```solidity
function tokenURI(uint256 id) public view returns (string)
```

### getTraits

```solidity
function getTraits(uint256 id) public view returns (struct OnChainDataStructs.Trait[])
```

### getMetadata

```solidity
function getMetadata(uint256 id) public view virtual returns (string)
```

### getImage

```solidity
function getImage(uint256 id) public view virtual returns (string)
```

### toAsciiString

```solidity
function toAsciiString(address x) internal pure returns (string)
```

### char

```solidity
function char(bytes1 b) internal pure returns (bytes1 c)
```

Loading

0 comments on commit da9fa2a

Please sign in to comment.