Exemple #1
0
        public async Task <Result <IEnumerable <IBlockchainTransaction> > > GetTokenTransactionsAsync(
            string address,
            CancellationToken cancellationToken = default)
        {
            var txsSources = new List <TxsSource>();

            if (_currency.Name == NYX)
            {
                var token = _currency as TezosTokens.NYX;

                txsSources = new List <TxsSource>
                {
                    new TxsSource
                    {
                        BaseUri    = _baseUri,
                        RequestUri = $"operations/transactions?sender={address}&target={token.TokenContractAddress}&parameters.as=*\"entrypoint\":\"setAllowTransferFrom\"*",
                        Parser     = new Func <string, Result <IEnumerable <TezosTransaction> > >(content => ParseTxs(JsonConvert.DeserializeObject <JArray>(content)))
                    },
                    new TxsSource
                    {
                        BaseUri    = _baseUri,
                        RequestUri = $"operations/transactions?target={token.TokenContractAddress}&parameters.as=*\"entrypoint\":\"transfer\"*{address}*",
                        Parser     = new Func <string, Result <IEnumerable <TezosTransaction> > >(content => ParseTxs(JsonConvert.DeserializeObject <JArray>(content)))
                    },
                    new TxsSource
                    {
                        BaseUri    = _baseUri,
                        RequestUri = $"operations/transactions?target={token.TokenContractAddress}&parameters.as=*\"entrypoint\":\"transfer\"*{Forge.ForgeAddress(address)}*",
                        Parser     = new Func <string, Result <IEnumerable <TezosTransaction> > >(content => ParseTxs(JsonConvert.DeserializeObject <JArray>(content)))
                    },
                    new TxsSource
                    {
                        BaseUri    = _baseUri,
                        RequestUri = $"operations/transactions?target={token.TokenContractAddress}&parameters.as=*\"entrypoint\":\"transferFrom\"*{address}*",
                        Parser     = new Func <string, Result <IEnumerable <TezosTransaction> > >(content => ParseTxs(JsonConvert.DeserializeObject <JArray>(content)))
                    },
                    new TxsSource
                    {
                        BaseUri    = _baseUri,
                        RequestUri = $"operations/transactions?target={token.TokenContractAddress}&parameters.as=*\"entrypoint\":\"transferFrom\"*{Forge.ForgeAddress(address)}*",
                        Parser     = new Func <string, Result <IEnumerable <TezosTransaction> > >(content => ParseTxs(JsonConvert.DeserializeObject <JArray>(content)))
                    }
                };
            }
            else if (_currency.Name == FA2)
            {
                var token = _currency as TezosTokens.FA2;

                txsSources = new List <TxsSource>
                {
                    new TxsSource
                    {
                        BaseUri    = _baseUri,
                        RequestUri = $"operations/transactions?sender={address}&target={token.TokenContractAddress}&parameters.as=*\"entrypoint\":\"update_operators\"*",
                        Parser     = new Func <string, Result <IEnumerable <TezosTransaction> > >(content => ParseTxs(JsonConvert.DeserializeObject <JArray>(content)))
                    },
                    new TxsSource
                    {
                        BaseUri    = _baseUri,
                        RequestUri = $"operations/transactions?target={token.TokenContractAddress}&parameters.as=*\"entrypoint\":\"transfer\"*{address}*",
                        Parser     = new Func <string, Result <IEnumerable <TezosTransaction> > >(content => ParseTxs(JsonConvert.DeserializeObject <JArray>(content)))
                    },
                    new TxsSource
                    {
                        BaseUri    = _baseUri,
                        RequestUri = $"operations/transactions?target={token.TokenContractAddress}&parameters.as=*\"entrypoint\":\"transfer\"*{Forge.ForgeAddress(address)}*",
                        Parser     = new Func <string, Result <IEnumerable <TezosTransaction> > >(content => ParseTxs(JsonConvert.DeserializeObject <JArray>(content)))
                    }
                };
            }
            else
            {
                var token = _currency as TezosTokens.FA12;

                txsSources = new List <TxsSource>
                {
                    new TxsSource
                    {
                        BaseUri    = _baseUri,
                        RequestUri = $"operations/transactions?sender={address}&target={token.TokenContractAddress}&parameters.as=*\"entrypoint\":\"approve\"*",
                        Parser     = new Func <string, Result <IEnumerable <TezosTransaction> > >(content => ParseTxs(JsonConvert.DeserializeObject <JArray>(content)))
                    },
                    new TxsSource
                    {
                        BaseUri    = token.BcdApi,
                        RequestUri = $"tokens/{token.BcdNetwork}/{address}/transfers?size=10000", // todo: use contract filter {token.TokenContractAddress}";
                        Parser     = new Func <string, Result <IEnumerable <TezosTransaction> > >(content => ParseTokenTxs(JsonConvert.DeserializeObject <JObject>(content)))
                    },
                };
            }

            var txsResult = Enumerable.Empty <IBlockchainTransaction>();

            foreach (var txsSource in txsSources)
            {
                var txsRes = await HttpHelper.GetAsyncResult(
                    baseUri : txsSource.BaseUri,
                    requestUri : txsSource.RequestUri,
                    headers : _headers,
                    responseHandler : (response, content) => txsSource.Parser(content),
                    cancellationToken : cancellationToken)
                             .ConfigureAwait(false);

                if (txsRes == null)
                {
                    return(new Error(Errors.RequestError, $"Connection error while getting token approve transactions for address {address}"));
                }

                if (txsRes.HasError)
                {
                    return(txsRes.Error);
                }

                txsResult = txsResult.Concat(txsRes.Value);
            }

            return(new Result <IEnumerable <IBlockchainTransaction> >(txsResult));
        }