Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- ArianeeWhitelist
- Optimization enabled
- true
- Compiler version
- v0.5.6+commit.b259423e
- Verified at
- 2019-06-11T10:08:39.135353Z
Contract source code
// File: @0xcert/ethereum-utils-contracts/src/contracts/math/safe-math.sol pragma solidity 0.5.6; /** * @dev Math operations with safety checks that throw on error. This contract is based on the * source code at: * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol. */ library SafeMath { /** * @dev Error constants. */ string constant OVERFLOW = "008001"; string constant SUBTRAHEND_GREATER_THEN_MINUEND = "008002"; string constant DIVISION_BY_ZERO = "008003"; /** * @dev Multiplies two numbers, reverts on overflow. * @param _factor1 Factor number. * @param _factor2 Factor number. * @return The product of the two factors. */ function mul( uint256 _factor1, uint256 _factor2 ) internal pure returns (uint256 product) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (_factor1 == 0) { return 0; } product = _factor1 * _factor2; require(product / _factor1 == _factor2, OVERFLOW); } /** * @dev Integer division of two numbers, truncating the quotient, reverts on division by zero. * @param _dividend Dividend number. * @param _divisor Divisor number. * @return The quotient. */ function div( uint256 _dividend, uint256 _divisor ) internal pure returns (uint256 quotient) { // Solidity automatically asserts when dividing by 0, using all gas. require(_divisor > 0, DIVISION_BY_ZERO); quotient = _dividend / _divisor; // assert(_dividend == _divisor * quotient + _dividend % _divisor); // There is no case in which this doesn't hold. } /** * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). * @param _minuend Minuend number. * @param _subtrahend Subtrahend number. * @return Difference. */ function sub( uint256 _minuend, uint256 _subtrahend ) internal pure returns (uint256 difference) { require(_subtrahend <= _minuend, SUBTRAHEND_GREATER_THEN_MINUEND); difference = _minuend - _subtrahend; } /** * @dev Adds two numbers, reverts on overflow. * @param _addend1 Number. * @param _addend2 Number. * @return Sum. */ function add( uint256 _addend1, uint256 _addend2 ) internal pure returns (uint256 sum) { sum = _addend1 + _addend2; require(sum >= _addend1, OVERFLOW); } /** * @dev Divides two numbers and returns the remainder (unsigned integer modulo), reverts when * dividing by zero. * @param _dividend Number. * @param _divisor Number. * @return Remainder. */ function mod( uint256 _dividend, uint256 _divisor ) internal pure returns (uint256 remainder) { require(_divisor != 0, DIVISION_BY_ZERO); remainder = _dividend % _divisor; } } // File: @0xcert/ethereum-utils-contracts/src/contracts/permission/abilitable.sol pragma solidity 0.5.6; /** * @title Contract for setting abilities. * @dev For optimization purposes the abilities are represented as a bitfield. Maximum number of * abilities is therefore 256. This is an example(for simplicity is made for max 8 abilities) of how * this works. * 00000001 Ability A - number representation 1 * 00000010 Ability B - number representation 2 * 00000100 Ability C - number representation 4 * 00001000 Ability D - number representation 8 * 00010000 Ability E - number representation 16 * etc ... * To grant abilities B and C, we would need a bitfield of 00000110 which is represented by number * 6, in other words, the sum of abilities B and C. The same concept works for revoking abilities * and checking if someone has multiple abilities. */ contract Abilitable { using SafeMath for uint; /** * @dev Error constants. */ string constant NOT_AUTHORIZED = "017001"; string constant CANNOT_REVOKE_OWN_SUPER_ABILITY = "017002"; string constant INVALID_INPUT = "017003"; /** * @dev Ability 1 (00000001) is a reserved ability called super ability. It is an * ability to grant or revoke abilities of other accounts. Other abilities are determined by the * implementing contract. */ uint8 constant SUPER_ABILITY = 1; /** * @dev Maps address to ability ids. */ mapping(address => uint256) public addressToAbility; /** * @dev Emits when an address is granted an ability. * @param _target Address to which we are granting abilities. * @param _abilities Number representing bitfield of abilities we are granting. */ event GrantAbilities( address indexed _target, uint256 indexed _abilities ); /** * @dev Emits when an address gets an ability revoked. * @param _target Address of which we are revoking an ability. * @param _abilities Number representing bitfield of abilities we are revoking. */ event RevokeAbilities( address indexed _target, uint256 indexed _abilities ); /** * @dev Guarantees that msg.sender has certain abilities. */ modifier hasAbilities( uint256 _abilities ) { require(_abilities > 0, INVALID_INPUT); require( addressToAbility[msg.sender] & _abilities == _abilities, NOT_AUTHORIZED ); _; } /** * @dev Contract constructor. * Sets SUPER_ABILITY ability to the sender account. */ constructor() public { addressToAbility[msg.sender] = SUPER_ABILITY; emit GrantAbilities(msg.sender, SUPER_ABILITY); } /** * @dev Grants specific abilities to specified address. * @param _target Address to grant abilities to. * @param _abilities Number representing bitfield of abilities we are granting. */ function grantAbilities( address _target, uint256 _abilities ) external hasAbilities(SUPER_ABILITY) { addressToAbility[_target] |= _abilities; emit GrantAbilities(_target, _abilities); } /** * @dev Unassigns specific abilities from specified address. * @param _target Address of which we revoke abilites. * @param _abilities Number representing bitfield of abilities we are revoking. * @param _allowSuperRevoke Additional check that prevents you from removing your own super * ability by mistake. */ function revokeAbilities( address _target, uint256 _abilities, bool _allowSuperRevoke ) external hasAbilities(SUPER_ABILITY) { if (!_allowSuperRevoke && msg.sender == _target) { require((_abilities & 1) == 0, CANNOT_REVOKE_OWN_SUPER_ABILITY); } addressToAbility[_target] &= ~_abilities; emit RevokeAbilities(_target, _abilities); } /** * @dev Check if an address has a specific ability. Throws if checking for 0. * @param _target Address for which we want to check if it has a specific abilities. * @param _abilities Number representing bitfield of abilities we are checking. */ function isAble( address _target, uint256 _abilities ) external view returns (bool) { require(_abilities > 0, INVALID_INPUT); return (addressToAbility[_target] & _abilities) == _abilities; } } // File: contracts/ArianeeWhitelist.sol pragma solidity 0.5.6; contract ArianeeWhitelist is Abilitable{ /** * @dev Mapping from token id to whitelisted address */ mapping(uint256=> mapping(address=>bool)) internal whitelistedAddress; /** * @dev Mapping from address to token to blacklisted address. */ mapping(address=> mapping(uint256=> mapping(address=>bool))) internal optOutAddressPerOwner; /** * @dev This emits when a new address is whitelisted for a token */ event WhitelistedAddressAdded(uint256 _tokenId, address _address); /** * @dev This emits when an address is blacklisted by a NFT owner on a given token. */ event BlacklistedAddresAdded(address _sender, uint256 _tokenId, bool _activate); uint8 constant ABILITY_ADD_WHITELIST = 2; /** * @dev add an address to the whitelist for a nft. * @notice can only be called by contract authorized. * @param _tokenId id of the nft * @param _address address to whitelist. */ function addWhitelistedAddress(uint256 _tokenId, address _address) external hasAbilities(ABILITY_ADD_WHITELIST) { whitelistedAddress[_tokenId][_address] = true; emit WhitelistedAddressAdded(_tokenId, _address); } /** * @dev blacklist an address by a receiver. * @param _sender address to blacklist. * @param _activate blacklist or unblacklist the sender */ function addBlacklistedAddress(address _sender, uint256 _tokenId, bool _activate) external { optOutAddressPerOwner[msg.sender][_tokenId][_sender] = _activate; emit BlacklistedAddresAdded(_sender, _tokenId, _activate); } /** * @dev Return if a sender is authorized to send message to this owner. * @param _tokenId NFT to check. * @param _sender address to check. * @param _tokenOwner owner of the token id. * @return true if address it authorized. */ function isAuthorized(uint256 _tokenId, address _sender, address _tokenOwner) external view returns(bool) { return (whitelistedAddress[_tokenId][_sender] && !isBlacklisted(_tokenOwner, _sender, _tokenId)); } /** * @dev Return if an address whitelisted for a given NFT. * @param _tokenId NFT to check. * @param _address address to check. * @return true if address it whitelisted. */ function isWhitelisted(uint256 _tokenId, address _address) public view returns (bool _isWhitelisted) { _isWhitelisted = whitelistedAddress[_tokenId][_address]; } /** * @dev Return if an address backlisted by a user for a given NFT. * @param _owner owner of the token id. * @param _sender address to check. * @param _tokenId NFT to check. * @return true if address it blacklisted. */ function isBlacklisted(address _owner, address _sender, uint256 _tokenId) public view returns(bool _isBlacklisted) { _isBlacklisted = optOutAddressPerOwner[_owner][_tokenId][_sender]; } }
Contract ABI
[{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"grantAbilities","inputs":[{"type":"address","name":"_target"},{"type":"uint256","name":"_abilities"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":"_isBlacklisted"}],"name":"isBlacklisted","inputs":[{"type":"address","name":"_owner"},{"type":"address","name":"_sender"},{"type":"uint256","name":"_tokenId"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"addressToAbility","inputs":[{"type":"address","name":""}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"isAuthorized","inputs":[{"type":"uint256","name":"_tokenId"},{"type":"address","name":"_sender"},{"type":"address","name":"_tokenOwner"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":"_isWhitelisted"}],"name":"isWhitelisted","inputs":[{"type":"uint256","name":"_tokenId"},{"type":"address","name":"_address"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"addWhitelistedAddress","inputs":[{"type":"uint256","name":"_tokenId"},{"type":"address","name":"_address"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"revokeAbilities","inputs":[{"type":"address","name":"_target"},{"type":"uint256","name":"_abilities"},{"type":"bool","name":"_allowSuperRevoke"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"isAble","inputs":[{"type":"address","name":"_target"},{"type":"uint256","name":"_abilities"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"addBlacklistedAddress","inputs":[{"type":"address","name":"_sender"},{"type":"uint256","name":"_tokenId"},{"type":"bool","name":"_activate"}],"constant":false},{"type":"event","name":"WhitelistedAddressAdded","inputs":[{"type":"uint256","name":"_tokenId","indexed":false},{"type":"address","name":"_address","indexed":false}],"anonymous":false},{"type":"event","name":"BlacklistedAddresAdded","inputs":[{"type":"address","name":"_sender","indexed":false},{"type":"uint256","name":"_tokenId","indexed":false},{"type":"bool","name":"_activate","indexed":false}],"anonymous":false},{"type":"event","name":"GrantAbilities","inputs":[{"type":"address","name":"_target","indexed":true},{"type":"uint256","name":"_abilities","indexed":true}],"anonymous":false},{"type":"event","name":"RevokeAbilities","inputs":[{"type":"address","name":"_target","indexed":true},{"type":"uint256","name":"_abilities","indexed":true}],"anonymous":false}]
Contract Creation Code
0x6080604081815233600081815260208190529182206001908190559290917fc4adfc5f00262a1ab9b2241c7e98408a91e58dc5777d786164bba34a7652f62f91a36108348061004f6000396000f3fe608060405234801561001057600080fd5b50600436106100865760e060020a60003504630ab319e8811461008b5780630f9222ef146100b957806345a32c86146101035780635d73c4ec1461013b5780637d22c35c1461016f57806387159d9b1461019b578063aca910e7146101c7578063ba00a330146101fb578063e716561b14610227575b600080fd5b6100b7600480360360408110156100a157600080fd5b50600160a060020a03813516906020013561025b565b005b6100ef600480360360608110156100cf57600080fd5b50600160a060020a038135811691602081013590911690604001356103a7565b604080519115158252519081900360200190f35b6101296004803603602081101561011957600080fd5b5035600160a060020a03166103de565b60408051918252519081900360200190f35b6100ef6004803603606081101561015157600080fd5b50803590600160a060020a03602082013581169160400135166103f0565b6100ef6004803603604081101561018557600080fd5b5080359060200135600160a060020a0316610432565b6100b7600480360360408110156101b157600080fd5b5080359060200135600160a060020a031661045c565b6100b7600480360360608110156101dd57600080fd5b50600160a060020a038135169060208101359060400135151561056e565b6100ef6004803603604081101561021157600080fd5b50600160a060020a0381351690602001356106ef565b6100b76004803603606081101561023d57600080fd5b50600160a060020a0381351690602081013590604001351515610788565b604080518082019091526006815260d060020a653031373030330260208201526001906102d6565b8381101561029b578181015183820152602001610283565b50505050905090810190601f1680156102c85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5033600090815260208181526040918290205482518084019093526006835260d060020a6530313730303102918301919091528216821461035b5760405160e560020a62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561029b578181015183820152602001610283565b50600160a060020a038316600081815260208190526040808220805486179055518492917fc4adfc5f00262a1ab9b2241c7e98408a91e58dc5777d786164bba34a7652f62f91a3505050565b600160a060020a03928316600090815260026020908152604080832093835292815282822093909416815291909252205460ff1690565b60006020819052908152604090205481565b6000838152600160209081526040808320600160a060020a038616845290915281205460ff16801561042a57506104288284866103a7565b155b949350505050565b6000918252600160209081526040808420600160a060020a03909316845291905290205460ff1690565b604080518082018252600680825260d060020a653031373030330260209283015233600090815280835283902054835180850190945290835260d060020a65303137303031029183019190915260029190821682146104ff5760405160e560020a62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561029b578181015183820152602001610283565b506000838152600160208181526040808420600160a060020a03871680865290835293819020805460ff191690931790925581518681529081019290925280517fa1fc15b295f9db85ce6f3e653f9a7e79e321f0828de5d7d09a5b0618bab645599281900390910190a1505050565b604080518082018252600680825260d060020a653031373030330260209283015233600090815280835283902054835180850190945290835260d060020a65303137303031029183019190915260019190821682146106115760405160e560020a62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561029b578181015183820152602001610283565b5081158015610628575033600160a060020a038516145b156106a257604080518082019091526006815260d160020a6518189b98181902602082015260018416156106a05760405160e560020a62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561029b578181015183820152602001610283565b505b600160a060020a03841660008181526020819052604080822080548719169055518592917fbb71944f65b9a48cc7d835179fb5e874f29b60aa0195785fb54968d8dddef08a91a350505050565b600080821160405180604001604052806006815260200160d060020a6530313730303302815250906107655760405160e560020a62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561029b578181015183820152602001610283565b5050600160a060020a039190911660009081526020819052604090205481161490565b3360009081526002602090815260408083208584528252808320600160a060020a03871680855290835292819020805485151560ff199091168117909155815193845291830185905282810191909152517fd9ce29b70508c42ba4c716e51cd5645b51ef2aaa8e83b40902860c4012ae4caf9181900360600190a150505056fea165627a7a723058203bd7424b6cc2e162af28e718c15a55e4b87c1310c22e6913ca0da1d431d5a3f60029
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100865760e060020a60003504630ab319e8811461008b5780630f9222ef146100b957806345a32c86146101035780635d73c4ec1461013b5780637d22c35c1461016f57806387159d9b1461019b578063aca910e7146101c7578063ba00a330146101fb578063e716561b14610227575b600080fd5b6100b7600480360360408110156100a157600080fd5b50600160a060020a03813516906020013561025b565b005b6100ef600480360360608110156100cf57600080fd5b50600160a060020a038135811691602081013590911690604001356103a7565b604080519115158252519081900360200190f35b6101296004803603602081101561011957600080fd5b5035600160a060020a03166103de565b60408051918252519081900360200190f35b6100ef6004803603606081101561015157600080fd5b50803590600160a060020a03602082013581169160400135166103f0565b6100ef6004803603604081101561018557600080fd5b5080359060200135600160a060020a0316610432565b6100b7600480360360408110156101b157600080fd5b5080359060200135600160a060020a031661045c565b6100b7600480360360608110156101dd57600080fd5b50600160a060020a038135169060208101359060400135151561056e565b6100ef6004803603604081101561021157600080fd5b50600160a060020a0381351690602001356106ef565b6100b76004803603606081101561023d57600080fd5b50600160a060020a0381351690602081013590604001351515610788565b604080518082019091526006815260d060020a653031373030330260208201526001906102d6565b8381101561029b578181015183820152602001610283565b50505050905090810190601f1680156102c85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5033600090815260208181526040918290205482518084019093526006835260d060020a6530313730303102918301919091528216821461035b5760405160e560020a62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561029b578181015183820152602001610283565b50600160a060020a038316600081815260208190526040808220805486179055518492917fc4adfc5f00262a1ab9b2241c7e98408a91e58dc5777d786164bba34a7652f62f91a3505050565b600160a060020a03928316600090815260026020908152604080832093835292815282822093909416815291909252205460ff1690565b60006020819052908152604090205481565b6000838152600160209081526040808320600160a060020a038616845290915281205460ff16801561042a57506104288284866103a7565b155b949350505050565b6000918252600160209081526040808420600160a060020a03909316845291905290205460ff1690565b604080518082018252600680825260d060020a653031373030330260209283015233600090815280835283902054835180850190945290835260d060020a65303137303031029183019190915260029190821682146104ff5760405160e560020a62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561029b578181015183820152602001610283565b506000838152600160208181526040808420600160a060020a03871680865290835293819020805460ff191690931790925581518681529081019290925280517fa1fc15b295f9db85ce6f3e653f9a7e79e321f0828de5d7d09a5b0618bab645599281900390910190a1505050565b604080518082018252600680825260d060020a653031373030330260209283015233600090815280835283902054835180850190945290835260d060020a65303137303031029183019190915260019190821682146106115760405160e560020a62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561029b578181015183820152602001610283565b5081158015610628575033600160a060020a038516145b156106a257604080518082019091526006815260d160020a6518189b98181902602082015260018416156106a05760405160e560020a62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561029b578181015183820152602001610283565b505b600160a060020a03841660008181526020819052604080822080548719169055518592917fbb71944f65b9a48cc7d835179fb5e874f29b60aa0195785fb54968d8dddef08a91a350505050565b600080821160405180604001604052806006815260200160d060020a6530313730303302815250906107655760405160e560020a62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561029b578181015183820152602001610283565b5050600160a060020a039190911660009081526020819052604090205481161490565b3360009081526002602090815260408083208584528252808320600160a060020a03871680855290835292819020805485151560ff199091168117909155815193845291830185905282810191909152517fd9ce29b70508c42ba4c716e51cd5645b51ef2aaa8e83b40902860c4012ae4caf9181900360600190a150505056fea165627a7a723058203bd7424b6cc2e162af28e718c15a55e4b87c1310c22e6913ca0da1d431d5a3f60029