// SPDX-License-Identifier: Apache-2.0 pragma solidity >=0.5.0 <0.9.0; pragma experimental ABIEncoderV2; import "../../token-service/HederaTokenService.sol"; import "../../token-service/ExpiryHelper.sol"; import "../../token-service/KeyHelper.sol"; import "../../token-service/FeeHelper.sol"; contract TokenCreateCustomContract is HederaTokenService, ExpiryHelper, KeyHelper, FeeHelper { bool finiteTotalSupplyType = true; event ResponseCode(int responseCode); event CreatedToken(address tokenAddress); event TransferToken(address tokenAddress, address receiver, int64 amount); event MintedToken(int64 newTotalSupply, int64[] serialNumbers); function createFungibleTokenPublic( string memory name, string memory symbol, string memory memo, int64 initialTotalSupply, int64 maxSupply, int32 decimals, bool freezeDefaultStatus, address treasury, IHederaTokenService.TokenKey[] memory keys ) public payable { IHederaTokenService.Expiry memory expiry = IHederaTokenService.Expiry( 0, treasury, 8000000 ); IHederaTokenService.HederaToken memory token = IHederaTokenService.HederaToken( name, symbol, treasury, memo, finiteTotalSupplyType, maxSupply, freezeDefaultStatus, keys, expiry ); (int responseCode, address tokenAddress) = HederaTokenService.createFungibleToken(token, initialTotalSupply, decimals); if (responseCode != HederaResponseCodes.SUCCESS) { revert (); } emit CreatedToken(tokenAddress); } function createFungibleTokenWithPresetKeys( string memory name, string memory symbol, string memory memo, int64 initialTotalSupply, int64 maxSupply, int32 decimals, bool freezeDefaultStatus, address treasury ) public payable { IHederaTokenService.TokenKey[] memory keys = new IHederaTokenService.TokenKey[](6); keys[0] = getSingleKey(KeyType.ADMIN, KeyType.PAUSE, KeyValueType.INHERIT_ACCOUNT_KEY, bytes("")); keys[1] = getSingleKey(KeyType.KYC, KeyValueType.INHERIT_ACCOUNT_KEY, bytes("")); keys[2] = getSingleKey(KeyType.FREEZE, KeyValueType.INHERIT_ACCOUNT_KEY, bytes("")); keys[3] = getSingleKey(KeyType.WIPE, KeyValueType.INHERIT_ACCOUNT_KEY, bytes("")); keys[4] = getSingleKey(KeyType.SUPPLY, KeyValueType.INHERIT_ACCOUNT_KEY, bytes("")); keys[5] = getSingleKey(KeyType.FEE, KeyValueType.INHERIT_ACCOUNT_KEY, bytes("")); IHederaTokenService.Expiry memory expiry = IHederaTokenService.Expiry( 0, treasury, 8000000 ); IHederaTokenService.HederaToken memory token = IHederaTokenService.HederaToken( name, symbol, treasury, memo, finiteTotalSupplyType, maxSupply, freezeDefaultStatus, keys, expiry ); (int responseCode, address tokenAddress) = HederaTokenService.createFungibleToken(token, initialTotalSupply, decimals); if (responseCode != HederaResponseCodes.SUCCESS) { revert (); } emit CreatedToken(tokenAddress); } function createFungibleTokenWithCustomFeesPublic( address treasury, string memory name, string memory symbol, string memory memo, int64 initialTotalSupply, int64 maxSupply, int32 decimals, IHederaTokenService.FixedFee[] memory fixedFees, IHederaTokenService.FractionalFee[] memory fractionalFees, IHederaTokenService.TokenKey[] memory keys ) public payable { IHederaTokenService.Expiry memory expiry = IHederaTokenService.Expiry( 0, treasury, 8000000 ); IHederaTokenService.HederaToken memory token = IHederaTokenService.HederaToken( name, symbol, treasury, memo, finiteTotalSupplyType, maxSupply, false, keys, expiry ); (int responseCode, address tokenAddress) = HederaTokenService.createFungibleTokenWithCustomFees(token, initialTotalSupply, decimals, fixedFees, fractionalFees); emit ResponseCode(responseCode); if (responseCode != HederaResponseCodes.SUCCESS) { revert (); } emit CreatedToken(tokenAddress); } function createNonFungibleTokenPublic( string memory name, string memory symbol, string memory memo, int64 maxSupply, address treasury, IHederaTokenService.TokenKey[] memory keys ) public payable { IHederaTokenService.Expiry memory expiry = IHederaTokenService.Expiry( 0, treasury, 8000000 ); IHederaTokenService.HederaToken memory token = IHederaTokenService.HederaToken( name, symbol, treasury, memo, finiteTotalSupplyType, maxSupply, false, keys, expiry ); (int responseCode, address tokenAddress) = HederaTokenService.createNonFungibleToken(token); if (responseCode != HederaResponseCodes.SUCCESS) { revert (); } emit CreatedToken(tokenAddress); } function createNonFungibleTokenWithCustomFeesPublic( address treasury, string memory name, string memory symbol, string memory memo, int64 maxSupply, IHederaTokenService.FixedFee[] memory fixedFees, IHederaTokenService.RoyaltyFee[] memory royaltyFees, IHederaTokenService.TokenKey[] memory keys ) public payable { IHederaTokenService.Expiry memory expiry = IHederaTokenService.Expiry( 0, treasury, 8000000 ); IHederaTokenService.HederaToken memory token = IHederaTokenService.HederaToken( name, symbol, treasury, memo, finiteTotalSupplyType, maxSupply, false, keys, expiry ); (int responseCode, address tokenAddress) = HederaTokenService.createNonFungibleTokenWithCustomFees(token, fixedFees, royaltyFees); if (responseCode != HederaResponseCodes.SUCCESS) { revert (); } emit CreatedToken(tokenAddress); } function mintTokenPublic(address token, int64 amount, bytes[] memory metadata) public returns (int responseCode, int64 newTotalSupply, int64[] memory serialNumbers) { (responseCode, newTotalSupply, serialNumbers) = HederaTokenService.mintToken(token, amount, metadata); emit ResponseCode(responseCode); if (responseCode != HederaResponseCodes.SUCCESS) { revert(); } emit MintedToken(newTotalSupply, serialNumbers); } function mintTokenToAddressPublic(address token, address receiver, int64 amount, bytes[] memory metadata) public returns (int responseCode, int64 newTotalSupply, int64[] memory serialNumbers) { (responseCode, newTotalSupply, serialNumbers) = mintTokenPublic(token, amount, metadata); HederaTokenService.transferToken(token, address(this), receiver, amount); emit TransferToken(token, receiver, amount); } function mintNonFungibleTokenToAddressPublic(address token, address receiver, int64 amount, bytes[] memory metadata) public returns (int responseCode, int64 newTotalSupply, int64[] memory serialNumbers) { (responseCode, newTotalSupply, serialNumbers) = mintTokenPublic(token, amount, metadata); HederaTokenService.transferNFT(token, address(this), receiver, serialNumbers[0]); emit TransferToken(token, receiver, amount); } function associateTokensPublic(address account, address[] memory tokens) external returns (int256 responseCode) { (responseCode) = HederaTokenService.associateTokens(account, tokens); emit ResponseCode(responseCode); if (responseCode != HederaResponseCodes.SUCCESS) { revert (); } } function associateTokenPublic(address account, address token) public returns (int responseCode) { responseCode = HederaTokenService.associateToken(account, token); emit ResponseCode(responseCode); if (responseCode != HederaResponseCodes.SUCCESS) { revert (); } } function grantTokenKycPublic(address token, address account) external returns (int64 responseCode) { (responseCode) = HederaTokenService.grantTokenKyc(token, account); emit ResponseCode(responseCode); if (responseCode != HederaResponseCodes.SUCCESS) { revert(); } } function approvePublic(address token, address spender, uint256 amount) public returns (int responseCode) { responseCode = HederaTokenService.approve(token, spender, amount); emit ResponseCode(responseCode); if (responseCode != HederaResponseCodes.SUCCESS) { revert (); } } }