pragma ever-solidity ^0.62.0; import "./../additional/SID.tsol"; import "../interfaces/TIP3TokenWallet.tsol"; import "../interfaces/TIP3TokenRoot.tsol"; import "../interfaces/ITokenRoot.tsol"; import "../interfaces/ITransferableOwnership.tsol"; import "../interfaces/ITokenWallet.tsol"; import "../interfaces/IBurnableTokenWallet.tsol"; import "../interfaces/IBurnableByRootTokenRoot.tsol"; import "../interfaces/IBurnableByRootTokenWallet.tsol"; import "../interfaces/IDestroyable.tsol"; import "../interfaces/IVersioned.tsol"; import "../interfaces/IDisableableMintTokenRoot.tsol"; import "../interfaces/ITokenWalletUpgradeable.tsol"; import "../interfaces/ITokenRootUpgradeable.tsol"; import "../interfaces/IBurnPausableTokenRoot.tsol"; interface TIP3 { function acceptBurn(uint128 _value) external; function acceptTransfer(uint128 _value) external; function acceptMint(uint128 _value) external; } /** * @title Selector - TIP-6.1 standard methods to publish and detect what * interfaces a smart contract implements. */ contract Selector { uint static _randomNonce; constructor() public { tvm.accept(); } /** * @dev Calculate an interface identifier for `acceptTransfer` method. * @return Interface identifier for `acceptTransfer` method. */ function calculateAcceptTransferSelector() public pure returns (bytes4) { TIP3 i; return bytes4(tvm.functionId(i.acceptTransfer) - 1); } /** * @dev Calculate an interface identifier for `acceptMint` method. * @return Interface identifier for `acceptMint` method. */ function calculateAcceptMintSelector() public pure returns (bytes4) { TIP3 i; return bytes4(tvm.functionId(i.acceptMint) - 1); } /** * @dev Calculate an interface identifier for `acceptBurn` method. * @return Interface identifier for `acceptBurn` method. */ function calculateAcceptBurnSelector() public pure returns (bytes4) { TIP3 i; return bytes4(tvm.functionId(i.acceptBurn) - 1); } /** * @dev Calculate an interface identifiers for `name`, `symbol`, * `decimals`, `totalSupply`, `walletCode`, and `acceptBurn` methods. * * @return Interface identifiers for `name`, `symbol`, `decimals`, * `totalSupply`, `walletCode`, `acceptBurn` methods. */ function calculateTIP3TokenRootInterfaceID() public pure returns (bytes4) { TIP3TokenRoot i; return bytes4( tvm.functionId(i.name) ^ tvm.functionId(i.symbol) ^ tvm.functionId(i.decimals) ^ tvm.functionId(i.totalSupply) ^ tvm.functionId(i.walletCode) ^ uint32(calculateAcceptBurnSelector()) ); } /** * @dev Calculate an interface identifiers for `root`, `balance`, * `walletCode`, `acceptTransfer`, and `acceptMint`methods. * * @return Interface identifiers for `root`, `balance`, `walletCode`, * `acceptTransfer`, and `acceptMint` methods. */ function calculateTIP3TokenWalletInterfaceID() public pure returns(bytes4) { TIP3TokenWallet i; return bytes4( tvm.functionId(i.root) ^ tvm.functionId(i.balance) ^ tvm.functionId(i.walletCode) ^ uint32(calculateAcceptTransferSelector()) ^ uint32(calculateAcceptMintSelector()) ); } /** * @dev Calculate an interface identifier for `supportsInterface` method. * @return Interface identifier for `supportsInterface` method. */ function calculateSIDInterfaceID() public pure returns(bytes4) { SID i; return bytes4(tvm.functionId(i.supportsInterface)); } /** * @dev Calculate an interface identifier for `version` method. * @return Interface identifier for `version` method. */ function calculateVersionedInterfaceID() public pure returns(bytes4) { IVersioned i; return bytes4(tvm.functionId(i.version)); } /** * @dev Calculate an interface identifiers for `rootOwner`, `walletOf`, * `mint`, `deployWallet` methods. * @return Interface identifiers for `rootOwner`, `walletOf`, `mint`, * `deployWallet` methods. */ function calculateTokenRootInterfaceID() public pure returns (bytes4) { ITokenRoot i; return bytes4( tvm.functionId(i.rootOwner) ^ tvm.functionId(i.walletOf) ^ tvm.functionId(i.mint) ^ tvm.functionId(i.deployWallet) ); } /** * @dev Calculate an interface identifiers for `owner`, `transfer`, * and `transferToWallet` methods. * @return Interface identifiers for `TokenWallet` methods. */ function calculateTokenWalletInterfaceID() public pure returns (bytes4) { ITokenWallet i; return bytes4( tvm.functionId(i.owner) ^ tvm.functionId(i.transfer) ^ tvm.functionId(i.transferToWallet) ); } /** * @dev Calculate an interface identifier for `burn` method. * @return Interface identifier for `burn` method. */ function calculateBurnableTokenWalletInterfaceID() public pure returns (bytes4) { IBurnableTokenWallet i; return bytes4(tvm.functionId(i.burn)); } /** * @dev Calculate an interface identifiers for `burnTokens`, * `disableBurnByRoot`, and `burnByRootDisabled` methods. * * @return Interface identifiers for `burn` method. */ function calculateBurnableByRootTokenRootInterfaceID() public pure returns (bytes4) { IBurnableByRootTokenRoot i; return bytes4( tvm.functionId(i.burnTokens) ^ tvm.functionId(i.disableBurnByRoot) ^ tvm.functionId(i.burnByRootDisabled) ); } /** * @dev Calculate an interface identifier for `burnByRoot` method. * @return Interface identifier for `burnByRoot` method. */ function calculateBurnableByRootTokenWalletInterfaceID() public pure returns (bytes4) { IBurnableByRootTokenWallet i; return bytes4(tvm.functionId(i.burnByRoot)); } /** * @dev Calculate an interface identifier for `destroy` method. * @return Interface identifier for `destroy` method. */ function calculateDestroyableInterfaceID() public pure returns (bytes4) { IDestroyable i; return bytes4(tvm.functionId(i.destroy)); } /** * @dev Calculate an interface identifiers for `disableMint` * and `mintDisabled` methods. * @return Interface identifiers for `disableMint` and `mintDisabled` method. */ function calculateDisableableMintTokenRootInterfaceID() public pure returns (bytes4) { IDisableableMintTokenRoot i; return bytes4( tvm.functionId(i.disableMint) ^ tvm.functionId(i.mintDisabled) ); } /** * @dev Calculate an interface identifier for `transferOwnership` method. * @return Interface identifier for `transferOwnership` method. */ function calculateTransferableOwnershipInterfaceID() public pure returns (bytes4) { ITransferableOwnership i; return bytes4( tvm.functionId(i.transferOwnership) ); } /** * @dev Calculate an interface identifiers for `setBurnPaused` and `burnPaused` methods. * @return Interface identifiers for `setBurnPaused` and `burnPaused` method. */ function calculateBurnPausableTokenRootInterfaceID() public pure returns (bytes4) { IBurnPausableTokenRoot i; return bytes4( tvm.functionId(i.setBurnPaused) ^ tvm.functionId(i.burnPaused) ); } /** * platformCode upgrade acceptUpgrade * @dev Calculate an interface identifiers for `upgrade`, `acceptUpgrade` * and `platformCode` methods. * @return Interface identifiers for `upgrade`, `acceptUpgrade` and * `platformCode` methods. */ function calculateTokenWalletUpgradeableInterfaceID() public pure returns (bytes4) { ITokenWalletUpgradeable i; return bytes4( tvm.functionId(i.platformCode) ^ tvm.functionId(i.upgrade) ^ tvm.functionId(i.acceptUpgrade) ); } /** * @dev Calculate an interface identifiers for `walletVersion`, * `platformCode`, `requestUpgradeWallet`, `setWalletCode` and `upgrade` methods. * * @return Interface identifiers for `walletVersion`, `platformCode`, * `requestUpgradeWallet`, `setWalletCode` and `upgrade` methods. */ function calculateTokenRootUpgradeableInterfaceID() public pure returns (bytes4) { ITokenRootUpgradeable i; return bytes4( tvm.functionId(i.walletVersion) ^ tvm.functionId(i.platformCode) ^ tvm.functionId(i.requestUpgradeWallet) ^ tvm.functionId(i.setWalletCode) ^ tvm.functionId(i.upgrade) ); } }