// 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"; contract TokenCreateContract is HederaTokenService, ExpiryHelper, KeyHelper { string name = "tokenName"; string symbol = "tokenSymbol"; string memo = "memo"; int64 initialTotalSupply = 10000000000; int64 maxSupply = 20000000000; int32 decimals = 0; bool freezeDefaultStatus = false; bool finiteTotalSupplyType = true; event ResponseCode(int responseCode); event CreatedToken(address tokenAddress); event MintedToken(int64 newTotalSupply, int64[] serialNumbers); event KycGranted(bool kycGranted); function createFungibleTokenPublic( 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 createFungibleTokenWithSECP256K1AdminKeyPublic( address treasury, bytes memory adminKey ) public payable returns (address) { IHederaTokenService.TokenKey[] memory keys = new IHederaTokenService.TokenKey[](6); keys[0] = getSingleKey(KeyType.ADMIN, KeyType.PAUSE, KeyValueType.SECP256K1, adminKey); keys[1] = getSingleKey(KeyType.KYC, KeyValueType.SECP256K1, adminKey); keys[2] = getSingleKey(KeyType.FREEZE, KeyValueType.SECP256K1, adminKey); keys[3] = getSingleKey(KeyType.SUPPLY, KeyValueType.SECP256K1, adminKey); keys[4] = getSingleKey(KeyType.WIPE, KeyValueType.SECP256K1, adminKey); keys[5] = getSingleKey(KeyType.FEE, KeyValueType.SECP256K1, adminKey); 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); return tokenAddress; } function createFungibleTokenWithSECP256K1AdminKeyAssociateAndTransferToAddressPublic(address treasury, bytes memory adminKey, int64 amount) public payable { address tokenAddress = this.createFungibleTokenWithSECP256K1AdminKeyPublic{value : msg.value}(treasury, adminKey); this.associateTokenPublic(msg.sender, tokenAddress); this.grantTokenKycPublic(tokenAddress, msg.sender); HederaTokenService.transferToken(tokenAddress, address(this), msg.sender, amount); } function createFungibleTokenWithSECP256K1AdminKeyWithoutKYCPublic( address treasury, bytes memory adminKey ) public payable returns (address) { IHederaTokenService.TokenKey[] memory keys = new IHederaTokenService.TokenKey[](4); keys[0] = getSingleKey(KeyType.ADMIN, KeyType.PAUSE, KeyValueType.SECP256K1, adminKey); keys[1] = getSingleKey(KeyType.FREEZE, KeyValueType.SECP256K1, adminKey); keys[2] = getSingleKey(KeyType.SUPPLY, KeyValueType.SECP256K1, adminKey); keys[3] = getSingleKey(KeyType.WIPE, KeyValueType.SECP256K1, adminKey); 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); return tokenAddress; } function createFungibleTokenWithCustomFeesPublic( address treasury, address fixedFeeTokenAddress ) public payable { IHederaTokenService.TokenKey[] memory keys = new IHederaTokenService.TokenKey[](1); keys[0] = getSingleKey(KeyType.ADMIN, KeyType.ADMIN, 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, false, keys, expiry ); IHederaTokenService.FixedFee[] memory fixedFees = new IHederaTokenService.FixedFee[](1); fixedFees[0] = IHederaTokenService.FixedFee(1, fixedFeeTokenAddress, false, false, treasury); IHederaTokenService.FractionalFee[] memory fractionalFees = new IHederaTokenService.FractionalFee[](1); fractionalFees[0] = IHederaTokenService.FractionalFee(4, 5, 10, 30, false, treasury); (int responseCode, address tokenAddress) = HederaTokenService.createFungibleTokenWithCustomFees(token, initialTotalSupply, decimals, fixedFees, fractionalFees); emit ResponseCode(responseCode); if (responseCode != HederaResponseCodes.SUCCESS) { revert (); } emit CreatedToken(tokenAddress); } function createNonFungibleTokenPublic( address treasury ) public payable { IHederaTokenService.TokenKey[] memory keys = new IHederaTokenService.TokenKey[](5); 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.SUPPLY, KeyValueType.INHERIT_ACCOUNT_KEY, bytes("")); keys[4] = getSingleKey(KeyType.WIPE, 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.createNonFungibleToken(token); if (responseCode != HederaResponseCodes.SUCCESS) { revert (); } emit CreatedToken(tokenAddress); } function createNonFungibleTokenWithSECP256K1AdminKeyPublic( address treasury, bytes memory adminKey ) public payable { IHederaTokenService.TokenKey[] memory keys = new IHederaTokenService.TokenKey[](6); keys[0] = getSingleKey(KeyType.ADMIN, KeyType.PAUSE, KeyValueType.SECP256K1, adminKey); keys[1] = getSingleKey(KeyType.KYC, KeyValueType.SECP256K1, adminKey); keys[2] = getSingleKey(KeyType.FREEZE, KeyValueType.SECP256K1, adminKey); keys[3] = getSingleKey(KeyType.SUPPLY, KeyValueType.SECP256K1, adminKey); keys[4] = getSingleKey(KeyType.WIPE, KeyValueType.SECP256K1, adminKey); keys[5] = getSingleKey(KeyType.FEE, KeyValueType.SECP256K1, adminKey); 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.createNonFungibleToken(token); if (responseCode != HederaResponseCodes.SUCCESS) { revert (); } emit CreatedToken(tokenAddress); } function createNonFungibleTokenWithSECP256K1AdminKeyWithoutKYCPublic( address treasury, bytes memory adminKey ) public payable { IHederaTokenService.TokenKey[] memory keys = new IHederaTokenService.TokenKey[](4); keys[0] = getSingleKey(KeyType.ADMIN, KeyType.PAUSE, KeyValueType.SECP256K1, adminKey); keys[1] = getSingleKey(KeyType.FREEZE, KeyValueType.SECP256K1, adminKey); keys[2] = getSingleKey(KeyType.SUPPLY, KeyValueType.SECP256K1, adminKey); keys[3] = getSingleKey(KeyType.WIPE, KeyValueType.SECP256K1, adminKey); 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.createNonFungibleToken(token); if (responseCode != HederaResponseCodes.SUCCESS) { revert (); } emit CreatedToken(tokenAddress); } function createNonFungibleTokenWithCustomFeesPublic( address treasury, address fixedFeeTokenAddress ) public payable { IHederaTokenService.TokenKey[] memory keys = new IHederaTokenService.TokenKey[](5); 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.SUPPLY, KeyValueType.INHERIT_ACCOUNT_KEY, bytes("")); keys[4] = getSingleKey(KeyType.WIPE, 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 ); IHederaTokenService.FixedFee[] memory fixedFees = new IHederaTokenService.FixedFee[](1); fixedFees[0] = IHederaTokenService.FixedFee(1, fixedFeeTokenAddress, false, false, treasury); IHederaTokenService.RoyaltyFee[] memory royaltyFees = new IHederaTokenService.RoyaltyFee[](1); royaltyFees[0] = IHederaTokenService.RoyaltyFee(4, 5, 10, fixedFeeTokenAddress, false, treasury); (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, 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); HederaTokenService.transferNFT(token, address(this), msg.sender, serialNumbers[0]); } 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(); } } //Adding this function to showcase token functionality in extended updateTokenInfo test suite function updateTokenInfoPublic(address token, IHederaTokenService.HederaToken memory tokenInfo)external returns (int responseCode) { (responseCode) = HederaTokenService.updateTokenInfo(token, tokenInfo); 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 (); } } }