コード例 #1
0
ファイル: PhantasmaDemo.cs プロジェクト: merl111/PhantasmaSDK
    /// <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);
    }
コード例 #2
0
ファイル: PhantasmaDemo.cs プロジェクト: merl111/PhantasmaSDK
    /// <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);
            }
                                                               ));
        });
    }
コード例 #3
0
    /// <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);
        }
                                               ));
    }
コード例 #4
0
ファイル: PhantasmaDemo.cs プロジェクト: merl111/PhantasmaSDK
    /// <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);
        }
                                               ));
    }
コード例 #5
0
ファイル: PhantasmaDemo.cs プロジェクト: merl111/PhantasmaSDK
    /// <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);
            }
        }
                           ));
    }
コード例 #6
0
ファイル: PhantasmaDemo.cs プロジェクト: merl111/PhantasmaSDK
    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.");
        }));
    }
コード例 #7
0
ファイル: PhantasmaDemo.cs プロジェクト: merl111/PhantasmaSDK
    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));
        }
    }
コード例 #8
0
    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);
        }
                                                           ));
    }
コード例 #9
0
ファイル: PhantasmaDemo.cs プロジェクト: merl111/PhantasmaSDK
    /// <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);
        }
                                                           ));
    }
コード例 #10
0
    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();
                }
            }
        }
    }
コード例 #11
0
    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();
            }
        }));
    }