Abstract Testnet

Contract

0x840FA75334897776a49D183B9089429b84542279

Overview

ETH Balance

0 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Parent Transaction Hash Block From To
48776192025-01-22 13:33:1417 days ago1737552794  Contract Creation0 ETH
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x7cc29230...CF2d95682
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
UpcadePointsFacet

Compiler Version
v0.8.28+commit.7893614a

ZkSolc Version
v1.5.10

Optimization Enabled:
Yes with Mode 3

Other Settings:
paris EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 11 : UpcadePointsFacet.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

// Local imports - Interfaces
import {IUpcadePointsFacet} from "../interfaces/IUpcadePointsFacet.sol";

// Local imports - Events
import {UpcadePointsEvents} from "../events/UpcadePointsEvents.sol";

// Local imports - Services
import {UpcadePointsService} from "../libraries/services/UpcadePointsService.sol";

/// @dev UpcadePointsFacet facet
contract UpcadePointsFacet is IUpcadePointsFacet {
    /**
     * @dev This function allows to add given amount upcadePoints for given account.
     *
     * @dev Parameters :
     * @param account Address for which upcadePoints will be increased
     * @param upcadePoints Amount of Upcade Points
     *
     * @dev Validations :
     *      - Only user with manager role can perform this function
     *
     * @dev Events :
     *      - UpcadePointsAdded
     */
    function addAdditionalUpcadePoints(
        address account,
        uint256 upcadePoints
    ) external {
        // Validate request
        UpcadePointsService.validateAddAdditionalUpcadePoints();

        // Add Upcade Points in storage
        UpcadePointsService.addAdditionalUpcadePoints(account, upcadePoints);

        // Emit event
        emit UpcadePointsEvents.UpcadePointsAdded(account, upcadePoints);
    }
}

File 2 of 11 : UpcadePointsEvents.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

/// @dev UpcadePointsEvents library
library UpcadePointsEvents {
    /**
     * @dev UpcadePointsAdded event
     *
     * @dev Parameters :
     * @param account Address for which Upcade Points are increased
     * @param upcadePoints Amount of Upcade Points
     */
    event UpcadePointsAdded(address indexed account, uint256 upcadePoints);
}

File 3 of 11 : UpcadePointsService.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

// Local imports - Constants
import {RolesConstants} from "../../constants/RolesConstants.sol";

// Local imports - Sevices
import {AccessControlService} from "./AccessControlService.sol";

// Local imports - Storages
import {LibUpcadePoints} from "../storages/LibUpcadePoints.sol";

/// @dev UpcadePointsService service
library UpcadePointsService {
    /// @dev Allows to validate if message sender can add additional Upcade Points
    function validateAddAdditionalUpcadePoints() internal view {
        AccessControlService.enforceHasRole(RolesConstants.MANAGER_ROLE);
    }

    /**
     * @dev Allows to add additional Upcade Points for given user.
     *
     * @dev Parameters :
     * @param account User address
     * @param upcadePoints Amount of upcadePoints to add
     */
    function addAdditionalUpcadePoints(
        address account,
        uint256 upcadePoints
    ) internal {
        LibUpcadePoints.addAdditionalUpcadePoints(account, upcadePoints);
    }
}

File 4 of 11 : IUpcadePointsFacet.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

/// @dev IUpcadePointsFacet interface
interface IUpcadePointsFacet {
    /**
     * @dev This function allows to add given amount upcadePoints for given account.
     *
     * @dev Parameters :
     * @param account Address for which upcadePoints will be increased
     * @param upcadePoints Amount of Upcade Points
     */
    function addAdditionalUpcadePoints(
        address account,
        uint256 upcadePoints
    ) external;
}

File 5 of 11 : RolesConstants.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

/// @dev RolesConstants library
library RolesConstants {
    /// @dev Default admin role
    bytes32 internal constant ADMIN_ROLE = 0x00;
    /// @dev Manager role
    bytes32 internal constant MANAGER_ROLE = keccak256("MANAGER_ROLE");
}

File 6 of 11 : AccessControlService.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

// Local imports - Errors
import {AccessControlErrors} from "../../errors/AccessControlErrors.sol";

// Local imports - Storages
import {LibAccessControl} from "../storages/LibAccessControl.sol";

/// @dev AccessControlService service
library AccessControlService {
    /**
     * @dev This function allows to grant new role for given address.
     *
     * @dev Parameters :
     * @param role Role
     * @param account Address for which role will be granted
     *
     * @dev Returns :
     * @return Information was role granted for user
     */
    function grantRole(bytes32 role, address account) internal returns (bool) {
        enforceHasRole(LibAccessControl.getRoleAdmin(role));

        if (!LibAccessControl.hasRole(role, account)) {
            LibAccessControl.grantRole(role, account);

            return true;
        }

        return false;
    }

    /**
     * @dev This function allows to validate if message sender has given role.
     *
     * @dev Parameters :
     * @param role Role
     */
    function enforceHasRole(bytes32 role) internal view {
        if (!LibAccessControl.hasRole(role, msg.sender)) {
            revert AccessControlErrors.AccessControlUnauthorizedAccount(
                msg.sender,
                role
            );
        }
    }
}

File 7 of 11 : LibUpcadePoints.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

// Local imports - Types
import {StorageTypes} from "../../types/StorageTypes.sol";

/// @dev LibUpcadePoints storage library
library LibUpcadePoints {
    // 32 bytes keccak hash of a string to use as a upcade points storage location.
    bytes32 constant UPCADE_POINT_STORAGE_POSITION = keccak256("upcade.points");

    /// @dev Storage UpcadePointsStorage struct
    struct UpcadePointsStorage {
        /// @dev UpcadePoints
        mapping(address => StorageTypes.WalletUpcadePoints) upcadePoints;
    }

    /// @dev Allows to fetch upcadePoints storage
    function upcadePointsStorage()
        internal
        pure
        returns (UpcadePointsStorage storage bs)
    {
        bytes32 position = UPCADE_POINT_STORAGE_POSITION;
        // assigns struct storage slot to the storage position
        assembly {
            bs.slot := position
        }
    }

    /**************************************************************\
    *                           Getters                                    
    /**************************************************************/

    /**
     * @dev This function allows to fetch add additional Upcade Points for user.
     *
     * @dev Parameters :
     * @param user User address
     *
     * @dev Returns :
     * @return Amount of additional Upcade Points
     */
    function getAdditionalUpcadePoints(
        address user
    ) internal view returns (uint256) {
        return upcadePointsStorage().upcadePoints[user].additionalUpcadePoints;
    }

    /**************************************************************\
    *                           Setters                                    
    /**************************************************************/

    /**
     * @dev This function allows to add additional Upcade Points for user.
     *
     * @dev Parameters :
     * @param account User address
     * @param upcadePoints Amount of upcadePoints
     */
    function addAdditionalUpcadePoints(
        address account,
        uint256 upcadePoints
    ) internal {
        upcadePointsStorage()
            .upcadePoints[account]
            .additionalUpcadePoints += upcadePoints;
    }
}

File 8 of 11 : StorageTypes.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

// Local imports - Types
import {EnumTypes} from "./EnumTypes.sol";

/// @dev StorageTypes library
library StorageTypes {
    struct Token {
        address tokenAddress;
        string name;
        EnumTypes.TokenType tokenType;
    }

    struct ERC20 {
        uint256 decimals;
        uint256 upcadePointsPerToken;
        EnumTypes.TokenUpcadePointsCalculationMethod upcadePointsCalculationMethod;
    }

    struct ERC721 {
        uint256 upcadePointsPerNft;
        EnumTypes.TokenUpcadePointsCalculationMethod upcadePointsCalculationMethod;
    }

    struct ERC1155 {
        string[] ids;
    }

    struct ERC1155Details {
        mapping(string => bool) isIdWhitelisted;
        mapping(string => uint256) upcadePointsPerId;
        mapping(string => EnumTypes.TokenUpcadePointsCalculationMethod) upcadePointsCalculationMethodPerId;
    }

    struct WalletUpcadePoints {
        uint256 additionalUpcadePoints;
    }

    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }
}

File 9 of 11 : AccessControlErrors.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

/// @dev AccessControlErrors library
library AccessControlErrors {
    /**
     * @dev AccessControlUnauthorizedAccount error
     *
     * @dev Parameters :
     * @param account Address which called function
     * @param neededRole Required missing role for account
     */
    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
}

File 10 of 11 : LibAccessControl.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

// Local imports - Constants
import {RolesConstants} from "../../constants/RolesConstants.sol";

// Local imports - Types
import {StorageTypes} from "../../types/StorageTypes.sol";

/// @dev LibAccessControl storage library
library LibAccessControl {
    // 32 bytes keccak hash of a string to use as a access control storage location.
    bytes32 constant ACCESS_CONTROL_STORAGE_POSITION =
        keccak256("upcade.points.access.control");

    /// @dev AccessControlStorage struct
    struct AccessControlStorage {
        /// @dev Roles
        mapping(bytes32 => StorageTypes.RoleData) roles;
    }

    /// @dev Allows to fetch access control storage
    function accessControlStorage()
        internal
        pure
        returns (AccessControlStorage storage acs)
    {
        bytes32 position = ACCESS_CONTROL_STORAGE_POSITION;
        // assigns struct storage slot to the storage position
        assembly {
            acs.slot := position
        }
    }

    /**************************************************************\
    *                           Getters                                    
    /**************************************************************/

    /**
     * @dev This function allows to fetch admin role for given role.
     *
     * @dev Parameters :
     * @param role Role
     *
     * @dev Returns :
     * @return Admin role for given role
     */
    function getRoleAdmin(bytes32 role) internal view returns (bytes32) {
        return accessControlStorage().roles[role].adminRole;
    }

    /**
     * @dev This function allows to fetch information if given user has given role.
     *
     * @dev Parameters :
     * @param account User address
     * @param role Role
     *
     * @dev Returns :
     * @return Bool - is user has given role
     */
    function hasRole(
        bytes32 role,
        address account
    ) internal view returns (bool) {
        return accessControlStorage().roles[role].members[account];
    }

    /**************************************************************\
    *                           Setters                                    
    /**************************************************************/

    /**
     * @dev This function allows to set contract admin.
     *
     * @dev Parameters :
     * @param user User address
     */
    function setAdmin(address user) internal {
        accessControlStorage().roles[RolesConstants.ADMIN_ROLE].members[
            user
        ] = true;
    }

    /**
     * @dev This function allows to grant given role for given user.
     *
     * @dev Parameters :
     * @param role Role
     * @param account User address
     */
    function grantRole(bytes32 role, address account) internal {
        accessControlStorage().roles[role].members[account] = true;
    }
}

File 11 of 11 : EnumTypes.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

/// @dev EnumTypes library
library EnumTypes {
    enum TokenType {
        ERC20,
        ERC721,
        ERC1155
    }

    enum TokenUpcadePointsCalculationMethod {
        SINGLE,
        ALL
    }
}

Settings
{
  "evmVersion": "paris",
  "optimizer": {
    "enabled": true,
    "mode": "3"
  },
  "outputSelection": {
    "*": {
      "*": [
        "abi"
      ]
    }
  },
  "detectMissingLibraries": false,
  "forceEVMLA": false,
  "enableEraVMExtensions": true,
  "libraries": {}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"upcadePoints","type":"uint256"}],"name":"UpcadePointsAdded","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"upcadePoints","type":"uint256"}],"name":"addAdditionalUpcadePoints","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x00020000000000020000008003000039000000400030043f0000000100200190000000340000c13d00000060021002700000001f02200197000000040020008c000000650000413d000000000301043b0000002103300197000000220030009c000000650000c13d000000440020008c000000650000413d0000000002000416000000000002004b000000650000c13d0000000402100370000000000202043b000000230020009c000000650000213d0000002401100370000000000101043b000100000001001d0000000001000411000000000010043f0000002401000041000000200010043f00000000010004140000001f0010009c0000001f01008041000000c00110021000000025011001c7000200000002001d0000801002000039007700720000040f00000001002001900000000202000029000000650000613d000000000101043b000000000101041a000000ff001001900000003c0000c13d0000002b01000041000000000010043f0000000001000411000000040010043f0000002c01000041000000240010043f0000002d0100004100000079000104300000000001000416000000000001004b000000650000c13d0000002001000039000001000010044300000120000004430000002001000041000000780001042e0000002301200197000200000001001d000000000010043f0000002601000041000000200010043f00000000010004140000001f0010009c0000001f01008041000000c00110021000000025011001c70000801002000039007700720000040f0000000100200190000000650000613d000000000101043b000000000201041a0000000103000029000000000032001a000000670000413d0000000002320019000000000021041b000000400100043d00000000003104350000001f0010009c0000001f01008041000000400110021000000000020004140000001f0020009c0000001f02008041000000c002200210000000000112019f00000027011001c70000800d020000390000000203000039000000280400004100000002050000290077006d0000040f0000000100200190000000650000613d0000000001000019000000780001042e000000000100001900000079000104300000002901000041000000000010043f0000001101000039000000040010043f0000002a01000041000000790001043000000070002104210000000102000039000000000001042d0000000002000019000000000001042d00000075002104230000000102000039000000000001042d0000000002000019000000000001042d0000007700000432000000780001042e00000079000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000200000000000000000000000000000040000001000000000000000000ffffffff00000000000000000000000000000000000000000000000000000000a8116f8f00000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffb9d4c827ae92f19024eab6f32c9f65f9730fe1b4d4370e1337dce2891bb14c560200000000000000000000000000000000000040000000000000000000000000cadbdeaa5eb735033c7cc6c45311fad3f405dcad29679d0ca2203b741cad7d6b02000000000000000000000000000000000000200000000000000000000000003c68d9d6786578b4a3dc2c26271086348204d06c30704df3000a7288a24500944e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000e2517d3f00000000000000000000000000000000000000000000000000000000241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0800000000000000000000000000000000000000440000000000000000000000007e912367c64ef8cebfb8e4d37e9546f624acb79d31ec08fe68576c5db91e08b9

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.