Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
4877619 | 17 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
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)
// 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); } }
// 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); }
// 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); } }
// 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; }
// 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"); }
// 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 ); } } }
// 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; } }
// 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; } }
// 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); }
// 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; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.28; /// @dev EnumTypes library library EnumTypes { enum TokenType { ERC20, ERC721, ERC1155 } enum TokenUpcadePointsCalculationMethod { SINGLE, ALL } }
{ "evmVersion": "paris", "optimizer": { "enabled": true, "mode": "3" }, "outputSelection": { "*": { "*": [ "abi" ] } }, "detectMissingLibraries": false, "forceEVMLA": false, "enableEraVMExtensions": true, "libraries": {} }
[{"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
Loading...
Loading
Loading...
Loading
[ 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.