public async Task <IEnumerable <RegisterConstantOperation> > GetRegisterConstants(
     AccountParameter sender,
     ExpressionParameter address,
     Int32Parameter level,
     DateTimeParameter timestamp,
     OperationStatusParameter status,
     SortParameter sort,
     OffsetParameter offset,
     int limit,
     MichelineFormat format,
     Symbols quote)
 {
     var sql = new SqlBuilder(@"
         SELECT      o.*, b.""Hash""
         FROM        ""RegisterConstantOps"" AS o
         INNER JOIN  ""Blocks"" as b
                 ON  b.""Level"" = o.""Level""")
               .Filter("SenderId", sender)
               .Filter("Address", address)
               .FilterA(@"o.""Level""", level)
               .FilterA(@"o.""Timestamp""", timestamp)
               .Filter("Status", status)
               .Take(sort, offset, limit, x => x switch
     {
         "level" => ("Id", "Level"),
         "gasUsed" => ("GasUsed", "GasUsed"),
         "storageUsed" => ("StorageUsed", "StorageUsed"),
         "bakerFee" => ("BakerFee", "BakerFee"),
         "storageFee" => ("StorageFee", "StorageFee"),
         _ => ("Id", "Id")
     }, "o");
 public async Task <IEnumerable <OriginationOperation> > GetOriginations(
     AnyOfParameter anyof,
     AccountParameter initiator,
     AccountParameter sender,
     AccountParameter contractManager,
     AccountParameter contractDelegate,
     AccountParameter originatedContract,
     Int32Parameter typeHash,
     Int32Parameter codeHash,
     Int32Parameter level,
     DateTimeParameter timestamp,
     OperationStatusParameter status,
     SortParameter sort,
     OffsetParameter offset,
     int limit,
     MichelineFormat format,
     Symbols quote,
     bool includeStorage = false,
     bool includeBigmaps = false)
 {
     var sql = new SqlBuilder($@"
         SELECT      o.*, b.""Hash""
         FROM        ""OriginationOps"" AS o
         INNER JOIN  ""Blocks"" as b
                 ON  b.""Level"" = o.""Level""
         {(typeHash != null || codeHash != null ? @"LEFT JOIN ""Accounts"" as c ON c.""Id"" = o.""ContractId""" : "")}")
               .Filter(anyof, x => x switch
     {
         "initiator" => "InitiatorId",
         "sender" => "SenderId",
         "contractManager" => "ManagerId",
         "contractDelegate" => "DelegateId",
         _ => "ContractId"
     })
Beispiel #3
0
        public void AddParameters()
        {
            Library lib = Library.Create(this.AllorsSession, "TestLib");
            Program pgm = Program.Create(this.AllorsSession, "TestPgm", lib);

            Parameter parm1 = StringParameter.Create(this.AllorsSession, "@parm1", 10, "test1");

            pgm.FirstParameter = parm1;

            Parameter parm2 = StringParameter.Create(this.AllorsSession, "@parm2", 20, "test2");

            parm1.NextParameter = parm2;

            Parameter parm3 = IntParameter.Create(this.AllorsSession, "@parm3", 30);

            parm2.NextParameter = parm3;

            Parameter parm4 = DecimalParameter.Create(this.AllorsSession, "@parm4", 5, 2, 0M);

            parm3.NextParameter = parm4;

            Parameter parm5 = DateTimeParameter.Create(this.AllorsSession, "@parm5", DateTime.Now);

            parm4.NextParameter = parm5;

            Assert.IsTrue(pgm.Parameters.Count == 5);
        }
        public async Task <IEnumerable <BakingOperation> > GetBakings(
            AccountParameter baker,
            Int32Parameter level,
            DateTimeParameter timestamp,
            SortParameter sort,
            OffsetParameter offset,
            int limit,
            Symbols quote)
        {
            var sql = new SqlBuilder(@"SELECT ""Id"", ""Level"", ""Timestamp"", ""BakerId"", ""Hash"", ""Priority"", ""Deposit"", ""Reward"", ""Fees"" FROM ""Blocks""")
                      .Filter("BakerId", baker)
                      .Filter(@"""BakerId"" IS NOT NULL")
                      .Filter("Level", level)
                      .Filter("Timestamp", timestamp)
                      .Take(sort, offset, limit, x => x == "level" ? ("Id", "Level") : ("Id", "Id"));

            using var db = GetConnection();
            var rows = await db.QueryAsync(sql.Query, sql.Params);

            return(rows.Select(row => new BakingOperation
            {
                Id = row.Id,
                Level = row.Level,
                Timestamp = row.Timestamp,
                Baker = Accounts.GetAlias(row.BakerId),
                Block = row.Hash,
                Priority = row.Priority,
                Deposit = row.Deposit,
                Reward = row.Reward,
                Fees = row.Fees,
                Quote = Quotes.Get(quote, row.Level)
            }));
        }
Beispiel #5
0
        public async Task <IEnumerable <Statistics> > Get(
            StatisticsPeriod period,
            Int32Parameter cycle,
            Int32Parameter level,
            TimestampParameter timestamp,
            DateTimeParameter date,
            SortParameter sort,
            OffsetParameter offset,
            int limit,
            Symbols quote)
        {
            var sql = new SqlBuilder(@"SELECT * FROM ""Statistics""");

            if (period == StatisticsPeriod.Cyclic)
            {
                sql.Filter(@"""Cycle"" IS NOT NULL");
            }
            else if (period == StatisticsPeriod.Daily)
            {
                sql.Filter(@"""Date"" IS NOT NULL");
            }

            sql.Filter("Cycle", cycle)
            .Filter("Level", level)
            .Filter("Level", timestamp)
            .Filter("Date", date)
            .Take(sort, offset, limit, x => x switch
            {
                "level" => ("Level", "Level"),
                "cycle" => ("Cycle", "Cycle"),
                "date" => ("Date", "Date"),
                _ => ("Id", "Id")
            });
Beispiel #6
0
 public async Task <IEnumerable <DoubleBakingOperation> > GetDoubleBakings(
     AnyOfParameter anyof,
     AccountParameter accuser,
     AccountParameter offender,
     Int32Parameter level,
     DateTimeParameter timestamp,
     SortParameter sort,
     OffsetParameter offset,
     int limit,
     Symbols quote)
 {
     var sql = new SqlBuilder(@"SELECT o.*, b.""Hash"" FROM ""DoubleBakingOps"" AS o INNER JOIN ""Blocks"" as b ON b.""Level"" = o.""Level""")
               .Filter(anyof, x => x == "accuser" ? "AccuserId" : "OffenderId")
               .Filter("AccuserId", accuser, x => "OffenderId")
               .Filter("OffenderId", offender, x => "AccuserId")
               .FilterA(@"o.""Level""", level)
               .FilterA(@"o.""Timestamp""", timestamp)
               .Take(sort, offset, limit, x => x switch
     {
         "level" => ("Id", "Level"),
         "accusedLevel" => ("AccusedLevel", "AccusedLevel"),
         "accuserRewards" => ("AccuserReward", "AccuserReward"),
         "offenderLostDeposits" => ("OffenderLostDeposit", "OffenderLostDeposit"),
         "offenderLostRewards" => ("OffenderLostReward", "OffenderLostReward"),
         "offenderLostFees" => ("OffenderLostFee", "OffenderLostFee"),
         _ => ("Id", "Id")
     }, "o");
Beispiel #7
0
        public async Task <IEnumerable <EndorsementOperation> > GetEndorsements(
            AccountParameter delegat,
            Int32Parameter level,
            DateTimeParameter timestamp,
            SortParameter sort,
            OffsetParameter offset,
            int limit,
            Symbols quote)
        {
            var sql = new SqlBuilder(@"SELECT o.*, b.""Hash"" FROM ""EndorsementOps"" AS o INNER JOIN ""Blocks"" as b ON b.""Level"" = o.""Level""")
                      .Filter("DelegateId", delegat)
                      .FilterA(@"o.""Level""", level)
                      .FilterA(@"o.""Timestamp""", timestamp)
                      .Take(sort, offset, limit, x => x == "level" ? ("Id", "Level") : ("Id", "Id"), "o");

            using var db = GetConnection();
            var rows = await db.QueryAsync(sql.Query, sql.Params);

            return(rows.Select(row => new EndorsementOperation
            {
                Id = row.Id,
                Level = row.Level,
                Block = row.Hash,
                Timestamp = row.Timestamp,
                Hash = row.OpHash,
                Delegate = Accounts.GetAlias(row.DelegateId),
                Slots = row.Slots,
                Rewards = row.Reward,
                Deposit = row.Deposit,
                Quote = Quotes.Get(quote, row.Level)
            }));
        }
        public async Task <IEnumerable <RevelationPenaltyOperation> > GetRevelationPenalties(
            AccountParameter baker,
            Int32Parameter level,
            DateTimeParameter timestamp,
            SortParameter sort,
            OffsetParameter offset,
            int limit,
            Symbols quote)
        {
            var sql = new SqlBuilder(@"SELECT o.*, b.""Hash"" FROM ""RevelationPenaltyOps"" AS o INNER JOIN ""Blocks"" as b ON b.""Level"" = o.""Level""")
                      .FilterA(@"o.""BakerId""", baker)
                      .FilterA(@"o.""Level""", level)
                      .FilterA(@"o.""Timestamp""", timestamp)
                      .Take(sort, offset, limit, x => x == "level" ? ("Id", "Level") : ("Id", "Id"), "o");

            using var db = GetConnection();
            var rows = await db.QueryAsync(sql.Query, sql.Params);

            return(rows.Select(row => new RevelationPenaltyOperation
            {
                Id = row.Id,
                Level = row.Level,
                Block = row.Hash,
                Timestamp = row.Timestamp,
                Baker = Accounts.GetAlias(row.BakerId),
                MissedLevel = row.MissedLevel,
                LostReward = row.LostReward,
                LostFees = row.LostFees,
                Quote = Quotes.Get(quote, row.Level)
            }));
        }
Beispiel #9
0
        public void CallTest004()
        {
            Library           lib = Library.Create(this.AllorsSession, "TestLib");
            DateTimeParameter parm2;
            DateTime          tijd = DateTime.Now;

            using (Program pgm = Program.Create(this.AllorsSession, "Test004", lib))
            {
                DateTimeParameter parm1 = DateTimeParameter.Create(this.AllorsSession, "@parm1", tijd);
                pgm.FirstParameter = parm1;

                parm2 = DateTimeParameter.Create(this.AllorsSession, "@parm2", DateTime.MinValue);
                parm1.NextParameter = parm2;

                string connectionstring = ConfigurationManager.ConnectionStrings["iseries"].ConnectionString;
                using (Session session = new Session(connectionstring))
                {
                    pgm.Call(session);
                    session.Commit();
                }
            }

            Assert.IsTrue(parm2.Value.Date == tijd.Date);
            Assert.IsTrue(parm2.Value.Second == tijd.Second);
            Assert.IsTrue(parm2.Value.Minute == tijd.Minute);
        }
Beispiel #10
0
        public async Task <IEnumerable <BallotOperation> > GetBallots(
            AccountParameter sender,
            Int32Parameter level,
            DateTimeParameter timestamp,
            Int32Parameter epoch,
            Int32Parameter period,
            ProtocolParameter proposal,
            SortParameter sort,
            OffsetParameter offset,
            int limit,
            Symbols quote)
        {
            var sql = new SqlBuilder(@"
                SELECT      o.""Id"", o.""Level"", o.""Timestamp"", o.""OpHash"", o.""SenderId"", o.""Rolls"", o.""Vote"", o.""Epoch"", o.""Period"",
                            b.""Hash"",
                            proposal.""Hash"" as ""ProposalHash"", proposal.""Metadata"" ->> 'alias' as ""ProposalAlias"",
                            period.""Kind"", period.""FirstLevel"", period.""LastLevel""
                FROM        ""BallotOps"" as o
                INNER JOIN  ""Blocks"" as b ON b.""Level"" = o.""Level""
                INNER JOIN  ""Proposals"" as proposal ON proposal.""Id"" = o.""ProposalId""
                INNER JOIN  ""VotingPeriods"" as period ON period.""Index"" = o.""Period""
                ")
                      .Filter("SenderId", sender)
                      .FilterA(@"o.""Level""", level)
                      .FilterA(@"o.""Timestamp""", timestamp)
                      .FilterA(@"o.""Epoch""", epoch)
                      .FilterA(@"o.""Period""", period)
                      .FilterA(@"proposal.""Hash""", proposal)
                      .Take(sort, offset, limit, x => x == "level" ? ("Id", "Level") : ("Id", "Id"), "o");

            using var db = GetConnection();
            var rows = await db.QueryAsync(sql.Query, sql.Params);

            return(rows.Select(row => new BallotOperation
            {
                Id = row.Id,
                Level = row.Level,
                Block = row.Hash,
                Timestamp = row.Timestamp,
                Hash = row.OpHash,
                Period = new PeriodInfo
                {
                    Index = row.Period,
                    Epoch = row.Epoch,
                    Kind = PeriodKinds.ToString(row.Kind),
                    FirstLevel = row.FirstLevel,
                    LastLevel = row.LastLevel
                },
                Proposal = new ProposalAlias
                {
                    Hash = row.ProposalHash,
                    Alias = row.ProposalAlias
                },
                Delegate = Accounts.GetAlias(row.SenderId),
                Rolls = row.Rolls,
                Vote = Votes.ToString(row.Vote),
                Quote = Quotes.Get(quote, row.Level)
            }));
        }
        public async Task <int> GetOriginationsCount(
            Int32Parameter level,
            DateTimeParameter timestamp)
        {
            var sql = new SqlBuilder(@"SELECT COUNT(*) FROM ""OriginationOps""")
                      .Filter("Level", level)
                      .Filter("Timestamp", timestamp);

            using var db = GetConnection();
            return(await db.QueryFirstAsync <int>(sql.Query, sql.Params));
        }
Beispiel #12
0
        public void CallTest006()
        {
            Library           lib = Library.Create(this.AllorsSession, "TestLib");
            IntParameter      parm5;
            StringParameter   parm6;
            DecimalParameter  parm7;
            DateTimeParameter parm8;

            DateTime tijd = DateTime.Now;

            using (Program pgm = Program.Create(this.AllorsSession, "Test006", lib))
            {
                IntParameter parm1 = IntParameter.Create(this.AllorsSession, "@parm1", 25);
                pgm.FirstParameter = parm1;

                StringParameter parm2 = StringParameter.Create(this.AllorsSession, "@parm2", 20, "testing");
                parm1.NextParameter = parm2;

                DecimalParameter parm3 = DecimalParameter.Create(this.AllorsSession, "@parm3", 18, 2, 118.36M);
                parm2.NextParameter = parm3;

                DateTimeParameter parm4 = DateTimeParameter.Create(this.AllorsSession, "@parm4", tijd);
                parm3.NextParameter = parm4;

                parm5 = IntParameter.Create(this.AllorsSession, "@parm5", 0);
                parm4.NextParameter = parm5;

                parm6 = StringParameter.Create(this.AllorsSession, "@parm6", 20, "");
                parm5.NextParameter = parm6;

                parm7 = DecimalParameter.Create(this.AllorsSession, "@parm7", 18, 2, 0.00M);
                parm6.NextParameter = parm7;

                parm8 = DateTimeParameter.Create(this.AllorsSession, "@parm8", DateTime.MinValue);
                parm7.NextParameter = parm8;

                string connectionstring = ConfigurationManager.ConnectionStrings["iseries"].ConnectionString;
                using (Session session = new Session(connectionstring))
                {
                    pgm.Call(session);
                    session.Commit();
                }
            }

            Assert.IsTrue(parm5.Value == 25);
            Assert.IsTrue(parm6.Value == "testing");
            Assert.IsTrue(parm7.Value == 118.36M);
            Assert.IsTrue(parm8.Value.Date == tijd.Date);
        }
Beispiel #13
0
 public async Task <IEnumerable <Quote> > Get(
     Int32Parameter level,
     DateTimeParameter timestamp,
     SortParameter sort,
     OffsetParameter offset,
     int limit)
 {
     var sql = new SqlBuilder(@"SELECT * FROM ""Quotes""")
               .Filter("Level", level)
               .Filter("Timestamp", timestamp)
               .Take(sort, offset, limit, x => x switch
     {
         "level" => ("Id", "Level"),
         _ => ("Id", "Id")
     });
Beispiel #14
0
        public async Task <ActionResult <IEnumerable <Statistics> > > GetDaily(
            DateTimeParameter date,
            SelectParameter select,
            SortParameter sort,
            OffsetParameter offset,
            [Range(0, 10000)] int limit = 100,
            Symbols quote = Symbols.None)
        {
            #region validate
            if (sort != null && !sort.Validate("id", "level", "cycle", "date"))
            {
                return(new BadRequest($"{nameof(sort)}", "Sorting by the specified field is not allowed."));
            }
            #endregion

            if (select == null)
            {
                return(Ok(await Statistics.Get(StatisticsPeriod.Daily, null, null, null, date, sort, offset, limit, quote)));
            }

            if (select.Values != null)
            {
                if (select.Values.Length == 1)
                {
                    return(Ok(await Statistics.Get(StatisticsPeriod.Daily, null, null, null, date, sort, offset, limit, select.Values[0], quote)));
                }
                else
                {
                    return(Ok(await Statistics.Get(StatisticsPeriod.Daily, null, null, null, date, sort, offset, limit, select.Values, quote)));
                }
            }
            else
            {
                if (select.Fields.Length == 1)
                {
                    return(Ok(await Statistics.Get(StatisticsPeriod.Daily, null, null, null, date, sort, offset, limit, select.Fields[0], quote)));
                }
                else
                {
                    return(Ok(new SelectionResponse
                    {
                        Cols = select.Fields,
                        Rows = await Statistics.Get(StatisticsPeriod.Daily, null, null, null, date, sort, offset, limit, select.Fields, quote)
                    }));
                }
            }
        }
Beispiel #15
0
        public async Task <ActionResult <IEnumerable <Quote> > > Get(
            Int32Parameter level,
            DateTimeParameter timestamp,
            SelectParameter select,
            SortParameter sort,
            OffsetParameter offset,
            [Range(0, 10000)] int limit = 100)
        {
            #region validate
            if (sort != null && !sort.Validate("level"))
            {
                return(new BadRequest($"{nameof(sort)}", "Sorting by the specified field is not allowed."));
            }
            #endregion

            if (select == null)
            {
                return(Ok(await Quotes.Get(level, timestamp, sort, offset, limit)));
            }

            if (select.Values != null)
            {
                if (select.Values.Length == 1)
                {
                    return(Ok(await Quotes.Get(level, timestamp, sort, offset, limit, select.Values[0])));
                }
                else
                {
                    return(Ok(await Quotes.Get(level, timestamp, sort, offset, limit, select.Values)));
                }
            }
            else
            {
                if (select.Fields.Length == 1)
                {
                    return(Ok(await Quotes.Get(level, timestamp, sort, offset, limit, select.Fields[0])));
                }
                else
                {
                    return(Ok(new SelectionResponse
                    {
                        Cols = select.Fields,
                        Rows = await Quotes.Get(level, timestamp, sort, offset, limit, select.Fields)
                    }));
                }
            }
        }
Beispiel #16
0
        public void CreateDateTime()
        {
            DateTime tijd = DateTime.Now;

            DateTimeParameter param = DateTimeParameter.Create(this.AllorsSession, "strParam", tijd);

            Assert.IsTrue(param != null);
            Assert.IsTrue(param.Value == tijd);
            Assert.IsTrue(param.Name == "strParam");

            iDB2Parameter newValue = new iDB2Parameter("strParam", iDB2DbType.iDB2TimeStamp);
            DateTime      newtijd  = DateTime.Now;

            newValue.Value = newtijd;
            param.UpdateValue(newValue);

            Assert.IsTrue(param.Value == newtijd);
        }
 public async Task <IEnumerable <ActivationOperation> > GetActivations(
     AccountParameter account,
     Int32Parameter level,
     DateTimeParameter timestamp,
     SortParameter sort,
     OffsetParameter offset,
     int limit,
     Symbols quote)
 {
     var sql = new SqlBuilder(@"SELECT o.*, b.""Hash"" FROM ""ActivationOps"" AS o INNER JOIN ""Blocks"" as b ON b.""Level"" = o.""Level""")
               .Filter("AccountId", account)
               .FilterA(@"o.""Level""", level)
               .FilterA(@"o.""Timestamp""", timestamp)
               .Take(sort, offset, limit, x => x switch
     {
         "level" => ("Id", "Level"),
         "balance" => ("Balance", "Balance"),
         _ => ("Id", "Id")
     }, "o");
 public async Task <IEnumerable <DelegationOperation> > GetDelegations(
     AnyOfParameter anyof,
     AccountParameter initiator,
     AccountParameter sender,
     AccountParameter prevDelegate,
     AccountParameter newDelegate,
     Int32Parameter level,
     DateTimeParameter timestamp,
     OperationStatusParameter status,
     SortParameter sort,
     OffsetParameter offset,
     int limit,
     Symbols quote)
 {
     var sql = new SqlBuilder(@"SELECT o.*, b.""Hash"" FROM ""DelegationOps"" AS o INNER JOIN ""Blocks"" as b ON b.""Level"" = o.""Level""")
               .Filter(anyof, x => x switch
     {
         "initiator" => "InitiatorId",
         "sender" => "SenderId",
         "prevDelegate" => "PrevDelegateId",
         _ => "DelegateId"
     })
 private KeyValuePair <string, string> ParseParameter(IDocumentGeneratorParameter visitable)
 {
     if (visitable is BooleanParameter)
     {
         BooleanParameter b = visitable as BooleanParameter;
         return(new KeyValuePair <string, string>(b.LookingTag, Convert.ToString(b.Value)));
     }
     if (visitable is CharParameter)
     {
         CharParameter ch = visitable as CharParameter;
         return(new KeyValuePair <string, string>(ch.LookingTag, ch.Value.ToString()));
     }
     if (visitable is FloatParameter)
     {
         FloatParameter f = visitable as FloatParameter;
         return(new KeyValuePair <string, string>(f.LookingTag, f.Value.ToString("00.000")));
     }
     if (visitable is GuidParameter)
     {
         GuidParameter g = visitable as GuidParameter;
         return(new KeyValuePair <string, string>(g.LookingTag, g.Value.ToString()));
     }
     if (visitable is IntParameter)
     {
         IntParameter i = visitable as IntParameter;
         return(new KeyValuePair <string, string>(i.LookingTag, i.Value.ToString()));
     }
     if (visitable is StringParameter)
     {
         StringParameter s = visitable as StringParameter;
         return(new KeyValuePair <string, string>(s.LookingTag, HttpUtility.HtmlDecode(s.Value)));
     }
     if (visitable is DateTimeParameter)
     {
         DateTimeParameter d = visitable as DateTimeParameter;
         return(new KeyValuePair <string, string>(d.LookingTag, d.Value.ToShortDateString()));
     }
     throw new DSWException($"Parameter '{visitable.GetType().Name}' is not correct", null, DSWExceptionCode.Invalid);
 }
Beispiel #20
0
 public async Task <IEnumerable <Block> > Get(
     AccountParameter baker,
     Int32Parameter level,
     DateTimeParameter timestamp,
     Int32Parameter priority,
     SortParameter sort,
     OffsetParameter offset,
     int limit,
     Symbols quote)
 {
     var sql = new SqlBuilder(@"SELECT * FROM ""Blocks""")
               .Filter("BakerId", baker)
               .Filter("Level", level)
               .Filter("Timestamp", timestamp)
               .Filter("Priority", priority)
               .Take(sort, offset, limit, x => x switch
     {
         "level" => ("Id", "Level"),
         "priority" => ("Priority", "Priority"),
         "validations" => ("Validations", "Validations"),
         "reward" => ("Reward", "Reward"),
         "fees" => ("Fees", "Fees"),
         _ => ("Id", "Id")
     });
Beispiel #21
0
 public static void GetParameterType(DateTimeParameter obj, MethodReturnEventArgs <Type> e)
 {
     e.Result = typeof(DateTime);
     BaseParameterActions.DecorateParameterType(obj, e, true);
 }
        public async Task <object[][]> GetRevelationPenalties(
            AccountParameter baker,
            Int32Parameter level,
            DateTimeParameter timestamp,
            SortParameter sort,
            OffsetParameter offset,
            int limit,
            string[] fields,
            Symbols quote)
        {
            var columns = new HashSet <string>(fields.Length);
            var joins   = new HashSet <string>(1);

            foreach (var field in fields)
            {
                switch (field)
                {
                case "id": columns.Add(@"o.""Id"""); break;

                case "level": columns.Add(@"o.""Level"""); break;

                case "timestamp": columns.Add(@"o.""Timestamp"""); break;

                case "baker": columns.Add(@"o.""BakerId"""); break;

                case "missedLevel": columns.Add(@"o.""MissedLevel"""); break;

                case "lostReward": columns.Add(@"o.""LostReward"""); break;

                case "lostFees": columns.Add(@"o.""LostFees"""); break;

                case "block":
                    columns.Add(@"b.""Hash""");
                    joins.Add(@"INNER JOIN ""Blocks"" as b ON b.""Level"" = o.""Level""");
                    break;

                case "quote": columns.Add(@"o.""Level"""); break;
                }
            }

            if (columns.Count == 0)
            {
                return(Array.Empty <object[]>());
            }

            var sql = new SqlBuilder($@"SELECT {string.Join(',', columns)} FROM ""RevelationPenaltyOps"" as o {string.Join(' ', joins)}")
                      .FilterA(@"o.""BakerId""", baker)
                      .FilterA(@"o.""Level""", level)
                      .FilterA(@"o.""Timestamp""", timestamp)
                      .Take(sort, offset, limit, x => x == "level" ? ("Id", "Level") : ("Id", "Id"), "o");

            using var db = GetConnection();
            var rows = await db.QueryAsync(sql.Query, sql.Params);

            var result = new object[rows.Count()][];

            for (int i = 0; i < result.Length; i++)
            {
                result[i] = new object[fields.Length];
            }

            for (int i = 0, j = 0; i < fields.Length; j = 0, i++)
            {
                switch (fields[i])
                {
                case "id":
                    foreach (var row in rows)
                    {
                        result[j++][i] = row.Id;
                    }
                    break;

                case "level":
                    foreach (var row in rows)
                    {
                        result[j++][i] = row.Level;
                    }
                    break;

                case "block":
                    foreach (var row in rows)
                    {
                        result[j++][i] = row.Hash;
                    }
                    break;

                case "timestamp":
                    foreach (var row in rows)
                    {
                        result[j++][i] = row.Timestamp;
                    }
                    break;

                case "baker":
                    foreach (var row in rows)
                    {
                        result[j++][i] = await Accounts.GetAliasAsync(row.BakerId);
                    }
                    break;

                case "missedLevel":
                    foreach (var row in rows)
                    {
                        result[j++][i] = row.MissedLevel;
                    }
                    break;

                case "lostReward":
                    foreach (var row in rows)
                    {
                        result[j++][i] = row.LostReward;
                    }
                    break;

                case "lostFees":
                    foreach (var row in rows)
                    {
                        result[j++][i] = row.LostFees;
                    }
                    break;

                case "quote":
                    foreach (var row in rows)
                    {
                        result[j++][i] = Quotes.Get(quote, row.Level);
                    }
                    break;
                }
            }

            return(result);
        }
Beispiel #23
0
        public async Task <ActionResult <IEnumerable <Operation> > > GetOperations(
            [Required][Address] string address,
            string type,
            AccountParameter initiator,
            AccountParameter sender,
            AccountParameter target,
            AccountParameter prevDelegate,
            AccountParameter newDelegate,
            AccountParameter contractManager,
            AccountParameter contractDelegate,
            AccountParameter originatedContract,
            AccountParameter accuser,
            AccountParameter offender,
            AccountParameter baker,
            Int32Parameter level,
            DateTimeParameter timestamp,
            StringParameter entrypoint,
            JsonParameter parameter,
            StringParameter parameters,
            BoolParameter hasInternals,
            OperationStatusParameter status,
            SortMode sort = SortMode.Descending,
            int?lastId    = null,
            [Range(0, 1000)] int limit = 100,
            MichelineFormat micheline  = MichelineFormat.Json,
            Symbols quote       = Symbols.None,
            DateTimeOffset?from = null,
            DateTimeOffset?to   = null)
        {
            #region validate
            if (initiator != null)
            {
                if (initiator.Eqx != null)
                {
                    return(new BadRequest($"{nameof(initiator)}.eqx", "This parameter doesn't support .eqx mode."));
                }

                if (initiator.Nex != null)
                {
                    return(new BadRequest($"{nameof(initiator)}.eqx", "This parameter doesn't support .eqx mode."));
                }
            }

            if (sender != null)
            {
                if (sender.Eqx != null)
                {
                    return(new BadRequest($"{nameof(sender)}.eqx", "This parameter doesn't support .eqx mode."));
                }

                if (sender.Nex != null)
                {
                    return(new BadRequest($"{nameof(sender)}.eqx", "This parameter doesn't support .eqx mode."));
                }
            }

            if (target != null)
            {
                if (target.Eqx != null)
                {
                    return(new BadRequest($"{nameof(target)}.eqx", "This parameter doesn't support .eqx mode."));
                }

                if (target.Nex != null)
                {
                    return(new BadRequest($"{nameof(target)}.eqx", "This parameter doesn't support .eqx mode."));
                }
            }

            if (prevDelegate != null)
            {
                if (prevDelegate.Eqx != null)
                {
                    return(new BadRequest($"{nameof(prevDelegate)}.eqx", "This parameter doesn't support .eqx mode."));
                }

                if (prevDelegate.Nex != null)
                {
                    return(new BadRequest($"{nameof(prevDelegate)}.nex", "This parameter doesn't support .nex mode."));
                }
            }

            if (newDelegate != null)
            {
                if (newDelegate.Eqx != null)
                {
                    return(new BadRequest($"{nameof(newDelegate)}.eqx", "This parameter doesn't support .eqx mode."));
                }

                if (newDelegate.Nex != null)
                {
                    return(new BadRequest($"{nameof(newDelegate)}.nex", "This parameter doesn't support .nex mode."));
                }
            }

            if (contractManager != null)
            {
                if (contractManager.Eqx != null)
                {
                    return(new BadRequest($"{nameof(contractManager)}.eqx", "This parameter doesn't support .eqx mode."));
                }

                if (contractManager.Nex != null)
                {
                    return(new BadRequest($"{nameof(contractManager)}.nex", "This parameter doesn't support .nex mode."));
                }
            }

            if (contractDelegate != null)
            {
                if (contractDelegate.Eqx != null)
                {
                    return(new BadRequest($"{nameof(contractDelegate)}.eqx", "This parameter doesn't support .eqx mode."));
                }

                if (contractDelegate.Nex != null)
                {
                    return(new BadRequest($"{nameof(contractDelegate)}.nex", "This parameter doesn't support .nex mode."));
                }
            }

            if (originatedContract != null)
            {
                if (originatedContract.Eqx != null)
                {
                    return(new BadRequest($"{nameof(originatedContract)}.eqx", "This parameter doesn't support .eqx mode."));
                }

                if (originatedContract.Nex != null)
                {
                    return(new BadRequest($"{nameof(originatedContract)}.nex", "This parameter doesn't support .nex mode."));
                }
            }

            if (accuser != null)
            {
                if (accuser.Eqx != null)
                {
                    return(new BadRequest($"{nameof(accuser)}.eqx", "This parameter doesn't support .eqx mode."));
                }

                if (accuser.Nex != null)
                {
                    return(new BadRequest($"{nameof(accuser)}.nex", "This parameter doesn't support .nex mode."));
                }
            }

            if (offender != null)
            {
                if (offender.Eqx != null)
                {
                    return(new BadRequest($"{nameof(offender)}.eqx", "This parameter doesn't support .eqx mode."));
                }

                if (offender.Nex != null)
                {
                    return(new BadRequest($"{nameof(offender)}.nex", "This parameter doesn't support .nex mode."));
                }
            }

            if (baker != null)
            {
                if (baker.Eqx != null)
                {
                    return(new BadRequest($"{nameof(baker)}.eqx", "This parameter doesn't support .eqx mode."));
                }

                if (baker.Nex != null)
                {
                    return(new BadRequest($"{nameof(baker)}.nex", "This parameter doesn't support .nex mode."));
                }
            }
            #endregion

            var types = type != null ? new HashSet <string>(type.Split(',')) : OpTypes.DefaultSet;

            var _sort = sort == SortMode.Ascending
                ? new SortParameter {
                Asc = "Id"
            }
                : new SortParameter {
                Desc = "Id"
            };

            var _offset = lastId != null
                ? new OffsetParameter {
                Cr = lastId
            }
                : null;

            #region legacy
            if (timestamp == null && (from != null || to != null))
            {
                timestamp = new DateTimeParameter();
            }

            if (from != null)
            {
                timestamp.Ge = from.Value.DateTime;
            }
            if (to != null)
            {
                timestamp.Lt = to.Value.DateTime;
            }
            #endregion

            return(Ok(await Accounts.GetOperations(address, types, initiator, sender, target, prevDelegate, newDelegate, contractManager, contractDelegate, originatedContract, accuser, offender, baker, level, timestamp, entrypoint, parameter, parameters, hasInternals, status, _sort, _offset, limit, micheline, quote)));
        }
Beispiel #24
0
        public async Task <ActionResult <IEnumerable <Block> > > Get(
            AccountParameter baker,
            Int32Parameter level,
            DateTimeParameter timestamp,
            Int32Parameter priority,
            SelectParameter select,
            SortParameter sort,
            OffsetParameter offset,
            [Range(0, 10000)] int limit = 100,
            Symbols quote = Symbols.None)
        {
            #region validate
            if (baker != null)
            {
                if (baker.Eqx != null)
                {
                    return(new BadRequest($"{nameof(baker)}.eqx", "This parameter doesn't support .eqx mode."));
                }

                if (baker.Nex != null)
                {
                    return(new BadRequest($"{nameof(baker)}.nex", "This parameter doesn't support .nex mode."));
                }

                if (baker.Eq == -1 || baker.In?.Count == 0)
                {
                    return(Ok(Enumerable.Empty <OriginationOperation>()));
                }
            }

            if (sort != null && !sort.Validate("id", "level", "priority", "validations", "reward", "fees"))
            {
                return(new BadRequest($"{nameof(sort)}", "Sorting by the specified field is not allowed."));
            }
            #endregion

            if (select == null)
            {
                return(Ok(await Blocks.Get(baker, level, timestamp, priority, sort, offset, limit, quote)));
            }

            if (select.Values != null)
            {
                if (select.Values.Length == 1)
                {
                    return(Ok(await Blocks.Get(baker, level, timestamp, priority, sort, offset, limit, select.Values[0], quote)));
                }
                else
                {
                    return(Ok(await Blocks.Get(baker, level, timestamp, priority, sort, offset, limit, select.Values, quote)));
                }
            }
            else
            {
                if (select.Fields.Length == 1)
                {
                    return(Ok(await Blocks.Get(baker, level, timestamp, priority, sort, offset, limit, select.Fields[0], quote)));
                }
                else
                {
                    return(Ok(new SelectionResponse
                    {
                        Cols = select.Fields,
                        Rows = await Blocks.Get(baker, level, timestamp, priority, sort, offset, limit, select.Fields, quote)
                    }));
                }
            }
        }
Beispiel #25
0
        public async Task <object[]> GetProposals(
            AccountParameter sender,
            Int32Parameter level,
            DateTimeParameter timestamp,
            Int32Parameter epoch,
            Int32Parameter period,
            ProtocolParameter proposal,
            BoolParameter duplicated,
            SortParameter sort,
            OffsetParameter offset,
            int limit,
            string field,
            Symbols quote)
        {
            var columns = new HashSet <string>(4);
            var joins   = new HashSet <string>(3);

            switch (field)
            {
            case "id": columns.Add(@"o.""Id"""); break;

            case "level": columns.Add(@"o.""Level"""); break;

            case "timestamp": columns.Add(@"o.""Timestamp"""); break;

            case "hash": columns.Add(@"o.""OpHash"""); break;

            case "delegate": columns.Add(@"o.""SenderId"""); break;

            case "rolls": columns.Add(@"o.""Rolls"""); break;

            case "duplicated": columns.Add(@"o.""Duplicated"""); break;

            case "proposal":
                columns.Add(@"proposal.""Hash"" as ""ProposalHash""");
                columns.Add(@"proposal.""Metadata"" ->> 'alias' as ""ProposalAlias""");
                joins.Add(@"INNER JOIN ""Proposals"" as proposal ON proposal.""Id"" = o.""ProposalId""");
                break;

            case "period":
                columns.Add(@"o.""Epoch""");
                columns.Add(@"o.""Period""");
                columns.Add(@"period.""Kind""");
                columns.Add(@"period.""FirstLevel""");
                columns.Add(@"period.""LastLevel""");
                joins.Add(@"INNER JOIN ""VotingPeriods"" as period ON period.""Index"" = o.""Period""");
                break;

            case "block":
                columns.Add(@"b.""Hash""");
                joins.Add(@"INNER JOIN ""Blocks"" as b ON b.""Level"" = o.""Level""");
                break;

            case "quote": columns.Add(@"o.""Level"""); break;
            }

            if (period != null)
            {
                joins.Add(@"INNER JOIN ""VotingPeriods"" as period ON period.""Index"" = o.""Period""");
            }

            if (proposal != null)
            {
                joins.Add(@"INNER JOIN ""Proposals"" as proposal ON proposal.""Id"" = o.""ProposalId""");
            }

            if (columns.Count == 0)
            {
                return(Array.Empty <object>());
            }

            var sql = new SqlBuilder($@"SELECT {string.Join(',', columns)} FROM ""ProposalOps"" as o {string.Join(' ', joins)}")
                      .Filter("SenderId", sender)
                      .FilterA(@"o.""Level""", level)
                      .FilterA(@"o.""Timestamp""", timestamp)
                      .FilterA(@"o.""Duplicated""", duplicated)
                      .FilterA(@"o.""Epoch""", epoch)
                      .FilterA(@"o.""Period""", period)
                      .FilterA(@"proposal.""Hash""", proposal)
                      .Take(sort, offset, limit, x => x == "level" ? ("Id", "Level") : ("Id", "Id"), "o");

            using var db = GetConnection();
            var rows = await db.QueryAsync(sql.Query, sql.Params);

            //TODO: optimize memory allocation
            var result = new object[rows.Count()];
            var j      = 0;

            switch (field)
            {
            case "id":
                foreach (var row in rows)
                {
                    result[j++] = row.Id;
                }
                break;

            case "level":
                foreach (var row in rows)
                {
                    result[j++] = row.Level;
                }
                break;

            case "block":
                foreach (var row in rows)
                {
                    result[j++] = row.Hash;
                }
                break;

            case "timestamp":
                foreach (var row in rows)
                {
                    result[j++] = row.Timestamp;
                }
                break;

            case "hash":
                foreach (var row in rows)
                {
                    result[j++] = row.OpHash;
                }
                break;

            case "rolls":
                foreach (var row in rows)
                {
                    result[j++] = row.Rolls;
                }
                break;

            case "duplicated":
                foreach (var row in rows)
                {
                    result[j++] = row.Duplicated;
                }
                break;

            case "period":
                foreach (var row in rows)
                {
                    result[j++] = new PeriodInfo
                    {
                        Index      = row.Period,
                        Epoch      = row.Epoch,
                        Kind       = PeriodKinds.ToString(row.Kind),
                        FirstLevel = row.FirstLevel,
                        LastLevel  = row.LastLevel
                    }
                }
                ;
                break;

            case "proposal":
                foreach (var row in rows)
                {
                    result[j++] = new ProposalAlias
                    {
                        Hash  = row.ProposalHash,
                        Alias = row.ProposalAlias
                    }
                }
                ;
                break;

            case "delegate":
                foreach (var row in rows)
                {
                    result[j++] = await Accounts.GetAliasAsync(row.SenderId);
                }
                break;

            case "quote":
                foreach (var row in rows)
                {
                    result[j++] = Quotes.Get(quote, row.Level);
                }
                break;
            }

            return(result);
        }
Beispiel #26
0
        public async Task <object[]> GetEndorsements(
            AccountParameter delegat,
            Int32Parameter level,
            DateTimeParameter timestamp,
            SortParameter sort,
            OffsetParameter offset,
            int limit,
            string field,
            Symbols quote)
        {
            var columns = new HashSet <string>(1);
            var joins   = new HashSet <string>(1);

            switch (field)
            {
            case "id": columns.Add(@"o.""Id"""); break;

            case "level": columns.Add(@"o.""Level"""); break;

            case "timestamp": columns.Add(@"o.""Timestamp"""); break;

            case "hash": columns.Add(@"o.""OpHash"""); break;

            case "delegate": columns.Add(@"o.""DelegateId"""); break;

            case "slots": columns.Add(@"o.""Slots"""); break;

            case "rewards": columns.Add(@"o.""Reward"""); break;

            case "deposit": columns.Add(@"o.""Deposit"""); break;

            case "block":
                columns.Add(@"b.""Hash""");
                joins.Add(@"INNER JOIN ""Blocks"" as b ON b.""Level"" = o.""Level""");
                break;

            case "quote": columns.Add(@"o.""Level"""); break;
            }

            if (columns.Count == 0)
            {
                return(Array.Empty <object>());
            }

            var sql = new SqlBuilder($@"SELECT {string.Join(',', columns)} FROM ""EndorsementOps"" as o {string.Join(' ', joins)}")
                      .Filter("DelegateId", delegat)
                      .FilterA(@"o.""Level""", level)
                      .FilterA(@"o.""Timestamp""", timestamp)
                      .Take(sort, offset, limit, x => x == "level" ? ("Id", "Level") : ("Id", "Id"), "o");

            using var db = GetConnection();
            var rows = await db.QueryAsync(sql.Query, sql.Params);

            //TODO: optimize memory allocation
            var result = new object[rows.Count()];
            var j      = 0;

            switch (field)
            {
            case "id":
                foreach (var row in rows)
                {
                    result[j++] = row.Id;
                }
                break;

            case "level":
                foreach (var row in rows)
                {
                    result[j++] = row.Level;
                }
                break;

            case "block":
                foreach (var row in rows)
                {
                    result[j++] = row.Hash;
                }
                break;

            case "timestamp":
                foreach (var row in rows)
                {
                    result[j++] = row.Timestamp;
                }
                break;

            case "hash":
                foreach (var row in rows)
                {
                    result[j++] = row.OpHash;
                }
                break;

            case "delegate":
                foreach (var row in rows)
                {
                    result[j++] = await Accounts.GetAliasAsync(row.DelegateId);
                }
                break;

            case "slots":
                foreach (var row in rows)
                {
                    result[j++] = row.Slots;
                }
                break;

            case "rewards":
                foreach (var row in rows)
                {
                    result[j++] = row.Reward;
                }
                break;

            case "deposit":
                foreach (var row in rows)
                {
                    result[j++] = row.Deposit;
                }
                break;

            case "quote":
                foreach (var row in rows)
                {
                    result[j++] = Quotes.Get(quote, row.Level);
                }
                break;
            }

            return(result);
        }
Beispiel #27
0
        private void Mapper(IDocumentGeneratorParameter visitable)
        {
            if (visitable is BooleanParameter)
            {
                BooleanParameter v = visitable as BooleanParameter;
                MappedParameters.Add(new SC.BuildValueModel()
                {
                    IsHTML = false,
                    Name   = v.Name,
                    Value  = v.Value.ToString()
                });
                return;
            }
            if (visitable is CharParameter)
            {
                CharParameter v = visitable as CharParameter;
                MappedParameters.Add(new SC.BuildValueModel()
                {
                    IsHTML = false,
                    Name   = v.Name,
                    Value  = v.Value.ToString()
                });
                return;
            }
            if (visitable is FloatParameter)
            {
                FloatParameter v = visitable as FloatParameter;
                MappedParameters.Add(new SC.BuildValueModel()
                {
                    IsHTML = false,
                    Name   = v.Name,
                    Value  = v.Value.ToString()
                });
                return;
            }
            if (visitable is GuidParameter)
            {
                GuidParameter v = visitable as GuidParameter;
                MappedParameters.Add(new SC.BuildValueModel()
                {
                    IsHTML = false,
                    Name   = v.Name,
                    Value  = v.Value.ToString()
                });
                return;
            }
            if (visitable is IntParameter)
            {
                IntParameter v = visitable as IntParameter;
                MappedParameters.Add(new SC.BuildValueModel()
                {
                    IsHTML = false,
                    Name   = v.Name,
                    Value  = v.Value.ToString()
                });
                return;
            }
            if (visitable is StringParameter)
            {
                StringParameter v = visitable as StringParameter;
                MappedParameters.Add(new SC.BuildValueModel()
                {
                    IsHTML = v.HasHtmlValue,
                    Name   = v.Name,
                    Value  = WebUtility.HtmlDecode(v.Value)
                });
                return;
            }
            if (visitable is DateTimeParameter)
            {
                DateTimeParameter v = visitable as DateTimeParameter;
                MappedParameters.Add(new SC.BuildValueModel()
                {
                    IsHTML = false,
                    Name   = v.Name,
                    Value  = v.Value.ToShortDateString()
                });
                return;
            }

            throw new DSWException(string.Concat("Parameter '", visitable.GetType().Name, "' is not correct"), null, DSWExceptionCode.Invalid);
        }
Beispiel #28
0
 public static void GetParameterTypeString(DateTimeParameter obj, MethodReturnEventArgs <string> e)
 {
     e.Result = "DateTime";
     BaseParameterActions.DecorateParameterType(obj, e, true);
 }
        public async Task <object[][]> GetBakings(
            AccountParameter baker,
            Int32Parameter level,
            DateTimeParameter timestamp,
            SortParameter sort,
            OffsetParameter offset,
            int limit,
            string[] fields,
            Symbols quote)
        {
            var columns = new HashSet <string>(fields.Length);

            foreach (var field in fields)
            {
                switch (field)
                {
                case "id": columns.Add(@"""Id"""); break;

                case "level": columns.Add(@"""Level"""); break;

                case "timestamp": columns.Add(@"""Timestamp"""); break;

                case "baker": columns.Add(@"""BakerId"""); break;

                case "block": columns.Add(@"""Hash"""); break;

                case "priority": columns.Add(@"""Priority"""); break;

                case "deposit": columns.Add(@"""Deposit"""); break;

                case "reward": columns.Add(@"""Reward"""); break;

                case "fees": columns.Add(@"""Fees"""); break;

                case "quote": columns.Add(@"""Level"""); break;
                }
            }

            if (columns.Count == 0)
            {
                return(Array.Empty <object[]>());
            }

            var sql = new SqlBuilder($@"SELECT {string.Join(',', columns)} FROM ""Blocks""")
                      .Filter("BakerId", baker)
                      .Filter(@"""BakerId"" IS NOT NULL")
                      .Filter("Level", level)
                      .Filter("Timestamp", timestamp)
                      .Take(sort, offset, limit, x => x == "level" ? ("Id", "Level") : ("Id", "Id"));

            using var db = GetConnection();
            var rows = await db.QueryAsync(sql.Query, sql.Params);

            var result = new object[rows.Count()][];

            for (int i = 0; i < result.Length; i++)
            {
                result[i] = new object[fields.Length];
            }

            for (int i = 0, j = 0; i < fields.Length; j = 0, i++)
            {
                switch (fields[i])
                {
                case "id":
                    foreach (var row in rows)
                    {
                        result[j++][i] = row.Id;
                    }
                    break;

                case "level":
                    foreach (var row in rows)
                    {
                        result[j++][i] = row.Level;
                    }
                    break;

                case "timestamp":
                    foreach (var row in rows)
                    {
                        result[j++][i] = row.Timestamp;
                    }
                    break;

                case "baker":
                    foreach (var row in rows)
                    {
                        result[j++][i] = await Accounts.GetAliasAsync(row.BakerId);
                    }
                    break;

                case "block":
                    foreach (var row in rows)
                    {
                        result[j++][i] = row.Hash;
                    }
                    break;

                case "priority":
                    foreach (var row in rows)
                    {
                        result[j++][i] = row.Priority;
                    }
                    break;

                case "deposit":
                    foreach (var row in rows)
                    {
                        result[j++][i] = row.Deposit;
                    }
                    break;

                case "reward":
                    foreach (var row in rows)
                    {
                        result[j++][i] = row.Reward;
                    }
                    break;

                case "fees":
                    foreach (var row in rows)
                    {
                        result[j++][i] = row.Fees;
                    }
                    break;

                case "quote":
                    foreach (var row in rows)
                    {
                        result[j++][i] = Quotes.Get(quote, row.Level);
                    }
                    break;
                }
            }

            return(result);
        }
 public static void GetParameterType(DateTimeParameter obj, MethodReturnEventArgs<Type> e)
 {
     e.Result = typeof(DateTime);
     BaseParameterActions.DecorateParameterType(obj, e, true);
 }
 public static void GetParameterTypeString(DateTimeParameter obj, MethodReturnEventArgs<string> e)
 {
     e.Result = "DateTime";
     BaseParameterActions.DecorateParameterType(obj, e, true);
 }
Beispiel #32
0
        public async Task <IEnumerable <MigrationOperation> > GetMigrations(
            AccountParameter account,
            MigrationKindParameter kind,
            Int64Parameter balanceChange,
            Int32Parameter level,
            DateTimeParameter timestamp,
            SortParameter sort,
            OffsetParameter offset,
            int limit,
            MichelineFormat format,
            Symbols quote,
            bool includeStorage = false,
            bool includeDiffs   = false)
        {
            var sql = new SqlBuilder(@"SELECT o.*, b.""Hash"" FROM ""MigrationOps"" AS o INNER JOIN ""Blocks"" as b ON b.""Level"" = o.""Level""")
                      .Filter("AccountId", account)
                      .Filter("Kind", kind)
                      .Filter("BalanceChange", balanceChange)
                      .FilterA(@"o.""Level""", level)
                      .FilterA(@"o.""Timestamp""", timestamp)
                      .Take(sort, offset, limit, x => x == "level" ? ("Id", "Level") : ("Id", "Id"), "o");

            using var db = GetConnection();
            var rows = await db.QueryAsync(sql.Query, sql.Params);

            #region include storage
            var storages = includeStorage
                ? await AccountRepository.GetStorages(db,
                                                      rows.Where(x => x.StorageId != null)
                                                      .Select(x => (int)x.StorageId)
                                                      .Distinct()
                                                      .ToList(),
                                                      format)
                : null;

            #endregion

            #region include diffs
            var diffs = includeDiffs
                ? await BigMapsRepository.GetMigrationDiffs(db,
                                                            rows.Where(x => x.BigMapUpdates != null)
                                                            .Select(x => (int)x.Id)
                                                            .ToList(),
                                                            format)
                : null;

            #endregion

            return(rows.Select(row => new MigrationOperation
            {
                Id = row.Id,
                Level = row.Level,
                Block = row.Hash,
                Timestamp = row.Timestamp,
                Account = Accounts.GetAlias(row.AccountId),
                Kind = MigrationKinds.ToString(row.Kind),
                BalanceChange = row.BalanceChange,
                Storage = row.StorageId == null ? null : storages?[row.StorageId],
                Diffs = row.BigMapUpdates == null ? null : diffs?[row.Id],
                Quote = Quotes.Get(quote, row.Level)
            }));
        }