From cb609df3c7beba6ae44cee719e380ccb862041f0 Mon Sep 17 00:00:00 2001 From: zimpha Date: Mon, 9 Sep 2024 13:24:28 +0800 Subject: [PATCH 1/2] feat: add ScrollEmployeeBadge --- src/badge/examples/ScrollEmployeeBadge.sol | 83 ++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/badge/examples/ScrollEmployeeBadge.sol diff --git a/src/badge/examples/ScrollEmployeeBadge.sol b/src/badge/examples/ScrollEmployeeBadge.sol new file mode 100644 index 0000000..c2e5fa8 --- /dev/null +++ b/src/badge/examples/ScrollEmployeeBadge.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.19; + +import {Attestation} from "@eas/contracts/IEAS.sol"; + +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; + +import {ScrollBadge} from "../ScrollBadge.sol"; +import {ScrollBadgeAccessControl} from "../extensions/ScrollBadgeAccessControl.sol"; +import {ScrollBadgeCustomPayload} from "../extensions/ScrollBadgeCustomPayload.sol"; +import {ScrollBadgeNoExpiry} from "../extensions/ScrollBadgeNoExpiry.sol"; +import {ScrollBadgeNonRevocable} from "../extensions/ScrollBadgeNonRevocable.sol"; +import {ScrollBadgeSingleton} from "../extensions/ScrollBadgeSingleton.sol"; + +string constant SCROLL_EMPLOYEE_BADGE_SCHEMA = "uint256 employeeId,uint256 year"; + +function decodePayloadData(bytes memory data) pure returns (uint256,uint256) { + return abi.decode(data, (uint256,uint256)); +} + +/// @title ScrollEmployeeBadge +contract ScrollEmployeeBadge is + ScrollBadgeAccessControl, + ScrollBadgeCustomPayload, + ScrollBadgeNoExpiry, + ScrollBadgeNonRevocable, + ScrollBadgeSingleton +{ + /// @notice The base token URI. + string public baseTokenURI; + + constructor(address resolver_, string memory baseTokenURI_) ScrollBadge(resolver_) { + baseTokenURI = baseTokenURI_; + } + + /// @notice Update the base token URI. + /// @param baseTokenURI_ The new base token URI. + function updateBaseTokenURI(string memory baseTokenURI_) external onlyOwner { + baseTokenURI = baseTokenURI_; + } + + /// @inheritdoc ScrollBadge + function onIssueBadge(Attestation calldata attestation) + internal + override ( + ScrollBadgeAccessControl, + ScrollBadgeCustomPayload, + ScrollBadgeNoExpiry, + ScrollBadgeNonRevocable, + ScrollBadgeSingleton + ) + returns (bool) + { + return super.onIssueBadge(attestation); + } + + /// @inheritdoc ScrollBadge + function onRevokeBadge(Attestation calldata attestation) + internal + override ( + ScrollBadge, ScrollBadgeAccessControl, ScrollBadgeCustomPayload, ScrollBadgeNoExpiry, ScrollBadgeSingleton + ) + returns (bool) + { + return super.onRevokeBadge(attestation); + } + + /// @inheritdoc ScrollBadge + /// @dev This function is TBD + function badgeTokenURI(bytes32 uid) public view override returns (string memory) { + Attestation memory attestation = getAndValidateBadge(uid); + bytes memory payload = getPayload(attestation); + (,uint256 year) = decodePayloadData(payload); + + return string(abi.encodePacked(baseTokenURI, Strings.toString(year), ".json")); + } + + /// @inheritdoc ScrollBadgeCustomPayload + function getSchema() public pure override returns (string memory) { + return SCROLL_EMPLOYEE_BADGE_SCHEMA; + } +} From 4383f6a1d1cf81e06c64f80c55042ba3f30cb3da Mon Sep 17 00:00:00 2001 From: zimpha Date: Tue, 15 Oct 2024 10:07:21 +0800 Subject: [PATCH 2/2] feat: fix compatibility with latest change --- src/badge/examples/ScrollEmployeeBadge.sol | 40 +++++++++++++++------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/src/badge/examples/ScrollEmployeeBadge.sol b/src/badge/examples/ScrollEmployeeBadge.sol index c2e5fa8..594d62a 100644 --- a/src/badge/examples/ScrollEmployeeBadge.sol +++ b/src/badge/examples/ScrollEmployeeBadge.sol @@ -9,20 +9,22 @@ import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {ScrollBadge} from "../ScrollBadge.sol"; import {ScrollBadgeAccessControl} from "../extensions/ScrollBadgeAccessControl.sol"; import {ScrollBadgeCustomPayload} from "../extensions/ScrollBadgeCustomPayload.sol"; +import {ScrollBadgeDefaultURI} from "../extensions/ScrollBadgeDefaultURI.sol"; import {ScrollBadgeNoExpiry} from "../extensions/ScrollBadgeNoExpiry.sol"; import {ScrollBadgeNonRevocable} from "../extensions/ScrollBadgeNonRevocable.sol"; import {ScrollBadgeSingleton} from "../extensions/ScrollBadgeSingleton.sol"; -string constant SCROLL_EMPLOYEE_BADGE_SCHEMA = "uint256 employeeId,uint256 year"; +string constant SCROLL_EMPLOYEE_BADGE_SCHEMA = "uint256 year"; -function decodePayloadData(bytes memory data) pure returns (uint256,uint256) { - return abi.decode(data, (uint256,uint256)); +function decodePayloadData(bytes memory data) pure returns (uint256) { + return abi.decode(data, (uint256)); } /// @title ScrollEmployeeBadge contract ScrollEmployeeBadge is ScrollBadgeAccessControl, ScrollBadgeCustomPayload, + ScrollBadgeDefaultURI, ScrollBadgeNoExpiry, ScrollBadgeNonRevocable, ScrollBadgeSingleton @@ -30,7 +32,11 @@ contract ScrollEmployeeBadge is /// @notice The base token URI. string public baseTokenURI; - constructor(address resolver_, string memory baseTokenURI_) ScrollBadge(resolver_) { + constructor( + address resolver_, + string memory baseTokenURI_, + string memory defaultBadgeURI_ + ) ScrollBadge(resolver_) ScrollBadgeDefaultURI(defaultBadgeURI_) { baseTokenURI = baseTokenURI_; } @@ -41,9 +47,12 @@ contract ScrollEmployeeBadge is } /// @inheritdoc ScrollBadge - function onIssueBadge(Attestation calldata attestation) + function onIssueBadge( + Attestation calldata attestation + ) internal - override ( + override( + ScrollBadge, ScrollBadgeAccessControl, ScrollBadgeCustomPayload, ScrollBadgeNoExpiry, @@ -56,22 +65,27 @@ contract ScrollEmployeeBadge is } /// @inheritdoc ScrollBadge - function onRevokeBadge(Attestation calldata attestation) + function onRevokeBadge( + Attestation calldata attestation + ) internal - override ( - ScrollBadge, ScrollBadgeAccessControl, ScrollBadgeCustomPayload, ScrollBadgeNoExpiry, ScrollBadgeSingleton + override( + ScrollBadge, + ScrollBadgeAccessControl, + ScrollBadgeCustomPayload, + ScrollBadgeNoExpiry, + ScrollBadgeSingleton ) returns (bool) { return super.onRevokeBadge(attestation); } - /// @inheritdoc ScrollBadge - /// @dev This function is TBD - function badgeTokenURI(bytes32 uid) public view override returns (string memory) { + /// @inheritdoc ScrollBadgeDefaultURI + function getBadgeTokenURI(bytes32 uid) internal view override returns (string memory) { Attestation memory attestation = getAndValidateBadge(uid); bytes memory payload = getPayload(attestation); - (,uint256 year) = decodePayloadData(payload); + uint256 year = decodePayloadData(payload); return string(abi.encodePacked(baseTokenURI, Strings.toString(year), ".json")); }