/// <summary> /// Check if the logged in address is the owner of a token /// </summary> /// <param name="tokenSymbol">Symbol of the token</param> public bool OwnsToken(string tokenSymbol, Action callback = null) { IsTokenOwner = false; CanvasManager.Instance.ShowOperationPopup("Fetching tokens from the blockchain...", false); StartCoroutine(PhantasmaApi.GetTokens( (result) => { foreach (var token in result) { if (token.symbol.Equals(TOKEN_SYMBOL) && token.ownerAddress.Equals(Key.Address.ToString())) { IsTokenOwner = true; break; } } CanvasManager.Instance.HideOperationPopup(); if (callback != null) { callback(); } }, (errorType, errorMessage) => { CanvasManager.Instance.HideOperationPopup(); CanvasManager.Instance.ShowResultPopup(EOPERATION_RESULT.FAIL, errorType + " - " + errorMessage); } )); return(IsTokenOwner); }
/// <summary> /// Create a new token on Phantasma Blockchain /// </summary> public void CreateToken() { CheckTokens(() => { CanvasManager.Instance.ShowOperationPopup("Creating a new token on the blockchain...", false); var script = ScriptUtils.BeginScript() .AllowGas(Key.Address, Address.Null, 1, 9999) .CallContract("nexus", "CreateToken", Key.Address, TOKEN_SYMBOL, TOKEN_NAME, 10000, 0, TokenFlags.Transferable | TokenFlags.Finite) .SpendGas(Key.Address) .EndScript(); StartCoroutine(PhantasmaApi.SignAndSendTransaction(Key, script, "main", (result) => { StartCoroutine(CheckTokenCreation(EBLOCKCHAIN_OPERATION.CREATE_TOKEN, result)); }, (errorType, errorMessage) => { CanvasManager.Instance.HideOperationPopup(); CanvasManager.Instance.ShowResultPopup(EOPERATION_RESULT.FAIL, errorType + " - " + errorMessage); } )); }); }
/// <summary> /// Returns the account name and balance of given address. /// </summary> /// <param name="address">String, base58 encoded - address to check for balance and name.</param> public void GetAccount(string address) { CanvasManager.Instance.ShowOperationPopup("Fetching account data from the blockchain...", false); StartCoroutine(PhantasmaApi.GetAccount(address, account => { CanvasManager.Instance.accountBalancesMenu.SetBalance("Name: " + account.name); foreach (var balance in account.balances) { var isFungible = PhantasmaTokens[balance.symbol].flags.Contains("Fungible"); var amount = isFungible ? decimal.Parse(balance.amount) / (decimal)Mathf.Pow(10f, 8) : decimal.Parse(balance.amount); CanvasManager.Instance.accountBalancesMenu.AddBalanceEntry("Chain: " + balance.chain + " - " + amount + " " + balance.symbol); } CanvasManager.Instance.HideOperationPopup(); LoggedIn(address); }, (errorType, errorMessage) => { CanvasManager.Instance.ShowResultPopup(EOPERATION_RESULT.FAIL, errorType + " - " + errorMessage); } )); }
/// <summary> /// Returns the account name and balance of given address. /// </summary> /// <param name="address">String, base58 encoded - address to check for balance and name.</param> public void GetAccount(string address) { CanvasManager.Instance.ShowOperationPopup("Fetching account data from the blockchain...", false); StartCoroutine(PhantasmaApi.GetAccount(address, account => { CanvasManager.Instance.accountMenu.SetBalance("Name: " + account.name); foreach (var balance in account.balances) { var isFungible = PhantasmaTokens[balance.symbol].flags.Contains("Fungible"); var amount = isFungible ? decimal.Parse(balance.amount) / (decimal)Mathf.Pow(10f, 8) : decimal.Parse(balance.amount); CanvasManager.Instance.accountMenu.AddBalanceEntry("Chain: " + balance.chain + " - " + amount + " " + balance.symbol); if (balance.symbol.Equals(TOKEN_SYMBOL)) { TokenCurrentSupply = amount; MyCars.Clear(); foreach (var tokenID in balance.ids) { StartCoroutine(PhantasmaApi.GetTokenData(TOKEN_SYMBOL, tokenID.ToString(), (tokenData => { var ramBytes = Base16.Decode(tokenData.ram); var carMutableData = Serialization.Unserialize <CarMutableData>(ramBytes); var romBytes = Base16.Decode(tokenData.rom); var carData = Serialization.Unserialize <CarData>(romBytes); var newCar = new Car(); newCar.SetCar(Address.FromText(tokenData.ownerAddress), tokenID, carData, carMutableData); MyCars.Add(newCar.TokenID, newCar); }), (type, s) => { })); } } } CanvasManager.Instance.HideOperationPopup(); LoggedIn(address); }, (errorType, errorMessage) => { CanvasManager.Instance.ShowResultPopup(EOPERATION_RESULT.FAIL, errorType + " - " + errorMessage); } )); }
/// <summary> /// Check the tokens deployed in Phantasma Blockchain. /// </summary> public void CheckTokens(Action callback = null) { IsTokenCreated = false; CanvasManager.Instance.ShowOperationPopup("Fetching Phantasma tokens...", false); PhantasmaTokens.Clear(); StartCoroutine(PhantasmaApi.GetTokens( (result) => { foreach (var token in result) { PhantasmaTokens.Add(token.symbol, token); if (token.symbol.Equals(TOKEN_SYMBOL)) { IsTokenCreated = true; break; } } CanvasManager.Instance.HideOperationPopup(); if (callback != null) { callback(); } }, (errorType, errorMessage) => { CanvasManager.Instance.HideOperationPopup(); if (CanvasManager.Instance.loginMenu.gameObject.activeInHierarchy) { CanvasManager.Instance.ShowResultPopup(EOPERATION_RESULT.FAIL, errorType + " - " + errorMessage); } else if (CanvasManager.Instance.adminMenu.gameObject.activeInHierarchy) { CanvasManager.Instance.ShowResultPopup(EOPERATION_RESULT.FAIL, errorType + " - " + errorMessage); } else { CanvasManager.Instance.SetErrorMessage(errorType + " - " + errorMessage); } } )); }
private IEnumerator CancelTransactionCoroutine(string transactionHash) { yield return(PhantasmaApi.CancelTransaction(transactionHash, (tx) => { if (_pendingTxCoroutine != null) { StopCoroutine(_pendingTxCoroutine); _pendingTxCoroutine = null; } CanvasManager.Instance.HideOperationPopup(); CanvasManager.Instance.HideResultPopup(); CanvasManager.Instance.ShowCancelOperationPopup(EOPERATION_RESULT.SUCCESS, "The operation '" + _BLOCKCHAIN_OPERATION_DESCRIPTION[_lastTransactionType] + "' was canceled with success."); }, (errorType, errorMessage) => { CanvasManager.Instance.ShowCancelOperationPopup(EOPERATION_RESULT.FAIL, "The transaction regarding the operation '" + _BLOCKCHAIN_OPERATION_DESCRIPTION[_lastTransactionType] + "' is already being processed by the blockchain and cannot be canceled anymore."); })); }
private IEnumerator CheckOperationCoroutine(EBLOCKCHAIN_OPERATION operation, string transactionHash, Action <Transaction> callback, Action <EPHANTASMA_SDK_ERROR_TYPE, string> errorHandlingCallback = null) { _lastTransactionType = operation; _lastTransactionHash = transactionHash; var isTransactionCompleted = false; while (!isTransactionCompleted) { yield return(PhantasmaApi.GetTransaction(transactionHash, (tx) => { isTransactionCompleted = true; if (callback != null) { callback(tx); } }, (errorType, errorMessage) => { if (errorType == EPHANTASMA_SDK_ERROR_TYPE.API_ERROR && errorMessage.Equals("pending")) { // Pending } else { isTransactionCompleted = true; if (errorHandlingCallback != null) { errorHandlingCallback(errorType, errorMessage); } } })); yield return(new WaitForSecondsRealtime(_TRANSACTION_CONFIRMATION_DELAY)); } }
public void TransferTokens(Address from, Address to, string tokenSymbol, BigInteger amount) { CanvasManager.Instance.ShowOperationPopup("Transferring tokens between addresses...", false); var script = ScriptUtils.BeginScript() .AllowGas(Key.Address, Address.Null, 1, 9999) .CallContract("token", "TransferTokens", from, to, tokenSymbol, amount) .SpendGas(Key.Address) .EndScript(); StartCoroutine(PhantasmaApi.SignAndSendTransaction(Key, script, "main", (result) => { StartCoroutine(CheckTokensTransfer(result)); }, (errorType, errorMessage) => { CanvasManager.Instance.HideOperationPopup(); CanvasManager.Instance.ShowResultPopup(EOPERATION_RESULT.FAIL, errorType + " - " + errorMessage); } )); }
/// <summary> /// Mint a new token and increase the supply of the created token /// </summary> public void MintToken(string tokenName) { var carData = new CarData { rarity = CarRarity.Common, imageID = Random.Range(0, carImages.Count) }; var carMutableData = new CarMutableData { name = tokenName, power = (byte)Random.Range(1, 10), speed = (byte)Random.Range(1, 10), location = CarLocation.None, }; var txData = Serialization.Serialize(carData); var txMutableData = Serialization.Serialize(carMutableData); var script = ScriptUtils.BeginScript() .AllowGas(Key.Address, Address.Null, 1, 9999) .CallContract("token", "MintToken", Key.Address, TOKEN_SYMBOL, txData, txMutableData, 0) .SpendGas(Key.Address) .EndScript(); CanvasManager.Instance.ShowOperationPopup("Minting a new token...", false); StartCoroutine(PhantasmaApi.SignAndSendTransaction(Key, script, "main", (result) => { StartCoroutine(CheckTokenMint(carData, carMutableData, result)); }, (errorType, errorMessage) => { CanvasManager.Instance.ShowResultPopup(EOPERATION_RESULT.FAIL, errorType + " - " + errorMessage); } )); }
private IEnumerator ProcessTransactions(AccountTransactions accountTransactions, int currentPage, int itemsPerPage, int totalPages, Action successCallback = null, Action errorCallback = null) { if (currentPage < totalPages) { yield return(PhantasmaApi.GetAddressTransactions(Key.Address.Text, (uint)currentPage + 1, (uint)itemsPerPage, (accountTxs, cPage, tPages) => { LastTransactions.AddRange(accountTransactions.txs); StartCoroutine(ProcessTransactions(accountTxs, cPage, itemsPerPage, tPages, successCallback, errorCallback)); }, (errorType, errorMessage) => { CanvasManager.Instance.HideOperationPopup(); CanvasManager.Instance.ShowResultPopup(EOPERATION_RESULT.FAIL, errorType + " - " + errorMessage); })); } else { CanvasManager.Instance.HideOperationPopup(); if (totalPages == 0) { CanvasManager.Instance.transactionsHistoryMenu.ShowRefreshButton("No transactions associated to your address on the blockchain."); } else { LastTransactions.AddRange(accountTransactions.txs); if (successCallback != null) { successCallback(); } } } }
private IEnumerator GetTransactionsHistoryCoroutine(Action successCallback = null, Action errorCallback = null) { CanvasManager.Instance.ShowOperationPopup("Fetching last transactions from the blockchain...", false); int itemsPerPage = 20; LastTransactions.Clear(); yield return(PhantasmaApi.GetAddressTransactions(Key.Address.Text, 1, (uint)itemsPerPage, (accountTransactions, currentPage, totalPages) => { StartCoroutine(ProcessTransactions(accountTransactions, currentPage, itemsPerPage, totalPages, successCallback, errorCallback)); }, (errorType, errorMessage) => { CanvasManager.Instance.HideOperationPopup(); CanvasManager.Instance.ShowResultPopup(EOPERATION_RESULT.FAIL, errorType + " - " + errorMessage); if (errorCallback != null) { errorCallback(); } })); }