From ef5b334cb18ea4af0b7962374003194d65f0455e Mon Sep 17 00:00:00 2001 From: wadealexc Date: Fri, 20 Jun 2025 14:36:01 +0000 Subject: [PATCH 1/2] test: scratch space for rounding analysis --- foundry.toml | 3 + params.toml | 0 .../integration/dsf_percent_deltas_plot3.png | Bin 0 -> 133531 bytes .../integration/dsf_percent_deltas_plot4.png | Bin 0 -> 108666 bytes src/test/integration/iterations.json | 1103 ++++++++++++ src/test/integration/iterations2.json | 1014 +++++++++++ src/test/integration/output.json | 1521 +++++++++++++++++ src/test/integration/params.toml | 12 + src/test/integration/plot.py | 60 + src/test/integration/plot2.py | 102 ++ .../tests/RoundingDeallocation.t.sol | 609 +++++++ 11 files changed, 4424 insertions(+) create mode 100644 params.toml create mode 100644 src/test/integration/dsf_percent_deltas_plot3.png create mode 100644 src/test/integration/dsf_percent_deltas_plot4.png create mode 100644 src/test/integration/iterations.json create mode 100644 src/test/integration/iterations2.json create mode 100644 src/test/integration/output.json create mode 100644 src/test/integration/params.toml create mode 100644 src/test/integration/plot.py create mode 100644 src/test/integration/plot2.py create mode 100644 src/test/integration/tests/RoundingDeallocation.t.sol diff --git a/foundry.toml b/foundry.toml index 86113eb783..62bce3cf12 100644 --- a/foundry.toml +++ b/foundry.toml @@ -80,6 +80,9 @@ no_match_path = "script/releases/**/*.sol" fs_permissions = [{ access = "read-write", path = "./"}] + gas_limit = "18446744073709551615" # 2^64-1 + memory_limit = 1073741824 + [profile.default.fmt] # Single-line vs multi-line statement blocks single_line_statement_blocks = "preserve" # Options: "single", "multi", "preserve" diff --git a/params.toml b/params.toml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/integration/dsf_percent_deltas_plot3.png b/src/test/integration/dsf_percent_deltas_plot3.png new file mode 100644 index 0000000000000000000000000000000000000000..311e14efac808ecfaad2470d1d75d4edd998794c GIT binary patch literal 133531 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∨+? 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 literal 0 HcmV?d00001 diff --git a/src/test/integration/dsf_percent_deltas_plot4.png b/src/test/integration/dsf_percent_deltas_plot4.png new file mode 100644 index 0000000000000000000000000000000000000000..99a4d1931542af47cbd8ddab8f07575725bebf2c GIT binary patch literal 108666 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%0De}5ktE3=uR1I8{o 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 Rxi|THeH{bs)E!5E`Cpi;XpsN_ literal 0 HcmV?d00001 diff --git a/src/test/integration/iterations.json b/src/test/integration/iterations.json new file mode 100644 index 0000000000..05817a2aab --- /dev/null +++ b/src/test/integration/iterations.json @@ -0,0 +1,1103 @@ +[ + 998993963782696177, + 996984924623115577, + 994979919678714859, + 992978936810431293, + 990981963927855711, + 988988988988988988, + 987000000000000000, + 986013986013986013, + 984031936127744510, + 982053838484546360, + 980079681274900398, + 978109452736318407, + 976143141153081510, + 974180734856007944, + 972222222222222222, + 970267591674925668, + 968316831683168316, + 966369930761622156, + 964426877470355731, + 962487660414610069, + 960552268244575936, + 958620689655172413, + 956692913385826771, + 954768928220255653, + 952848722986247544, + 950932286555446516, + 949019607843137254, + 947110675808031341, + 945205479452054794, + 943304007820136852, + 941406250000000000, + 940487804878048780, + 938596491228070175, + 936708860759493670, + 934824902723735408, + 932944606413994169, + 931067961165048543, + 929194956353055286, + 927325581395348837, + 925459825750242013, + 923597678916827852, + 921739130434782608, + 919884169884169884, + 918032786885245901, + 916184971098265895, + 914340712223291626, + 912500000000000000, + 911623439000960614, + 909788867562380038, + 907957813998082454, + 906130268199233716, + 904306220095693779, + 902485659655831739, + 900668576886341929, + 898854961832061068, + 897044804575786463, + 895238095238095238, + 893434823977164605, + 891634980988593155, + 889838556505223171, + 888045540796963946, + 886255924170616113, + 884469696969696969, + 882686849574266792, + 880907372400756143, + 879131255901794145, + 877358490566037735, + 875589066918001885, + 873822975517890772, + 872060206961429915, + 870300751879699248, + 868544600938967136, + 866791744840525328, + 865042174320524835, + 863295880149812734, + 861552853133769878, + 859813084112149532, + 858076563958916900, + 856343283582089552, + 854613233923578751, + 852886405959031657, + 851162790697674418, + 849442379182156133, + 847725162488393686, + 846011131725417439, + 844300278035217794, + 842592592592592592, + 840888066604995374, + 839186691312384473, + 837488457987072945, + 835793357933579335, + 834101382488479262, + 832412523020257826, + 830726770929162833, + 829044117647058823, + 827364554637281910, + 825688073394495412, + 824014665444546287, + 822344322344322344, + 820677035681610247, + 819012797074954296, + 817351598173515981, + 815693430656934306, + 814038286235186873, + 812386156648451730, + 810737033666969972, + 809090909090909090, + 807447774750227066, + 805807622504537205, + 804170444242973708, + 802536231884057971, + 800904977375565610, + 799276672694394213, + 797651309846431797, + 796028880866425992, + 794409377817853922, + 792792792792792792, + 791179117911791179, + 789568345323741007, + 787960467205750224, + 786355475763016157, + 784753363228699551, + 783154121863799283, + 781557743957027752, + 779964221824686940, + 778373547810545129, + 776785714285714285, + 775200713648528099, + 773618538324420677, + 772039180765805877, + 770462633451957295, + 768888888888888888, + 767317939609236234, + 765749778172138420, + 764184397163120567, + 762621789193976970, + 761061946902654867, + 759504862953138815, + 757950530035335689, + 756398940864960282, + 754850088183421516, + 753303964757709251, + 751760563380281690, + 750219876868953386, + 748681898066783831, + 747146619841966637, + 745614035087719298, + 744084136722173531, + 742556917688266199, + 741032370953630796, + 739510489510489510, + 737991266375545851, + 736474694589877835, + 734960767218831734, + 733449477351916376, + 731940818102697998, + 730434782608695652, + 728931364031277150, + 727430555555555555, + 725932350390286209, + 724436741767764298, + 722943722943722943, + 721453287197231833, + 719965427830596369, + 718480138169257340, + 716997411561691113, + 715517241379310344, + 714039621016365202, + 712564543889845094, + 711092003439380911, + 709621993127147766, + 708154506437768240, + 706689536878216123, + 705227077977720651, + 703767123287671232, + 702309666381522668, + 700854700854700854, + 699402220324508966, + 697952218430034129, + 696504688832054560, + 695059625212947189, + 693617021276595744, + 692176870748299319, + 690739167374681393, + 689303904923599320, + 687871077184054283, + 686440677966101694, + 685012701100762066, + 683587140439932318, + 682163989856297548, + 680743243243243243, + 679324894514767932, + 677908937605396290, + 676495366470092670, + 675084175084175084, + 673675357443229604, + 672268907563025210, + 670864819479429051, + 669463087248322147, + 668063704945515507, + 666666666666666666, + 665271966527196652, + 663879598662207357, + 662489557226399331, + 661101836393989983, + 659716430358632193, + 658333333333333333, + 656952539550374687, + 655574043261231281, + 654197838736492103, + 652823920265780730, + 651452282157676348, + 650082918739635157, + 648715824357912178, + 647350993377483443, + 645988420181968569, + 644628099173553719, + 643270024772914946, + 641914191419141914, + 640560593569661995, + 639209225700164744, + 637860082304526748, + 636513157894736842, + 635168447000821692, + 633825944170771756, + 632485643970467596, + 631147540983606557, + 629811629811629811, + 628477905073649754, + 627146361406377759, + 625816993464052287, + 624489795918367346, + 623164763458401305, + 621841890790546047, + 620521172638436482, + 619202603742880390, + 617886178861788617, + 616571892770105605, + 615259740259740259, + 613949716139497161, + 612641815235008103, + 611336032388663967, + 610032362459546925, + 608730800323362974, + 607431340872374798, + 606133979015334947, + 604838709677419354, + 603545527800161160, + 602254428341384863, + 600965406275140788, + 599678456591639871, + 598393574297188755, + 597110754414125200, + 595829991980753809, + 594551282051282051, + 593274619695756605, + 592000000000000000, + 591526778577138289, + 590255591054313099, + 588986432561851556, + 587719298245614035, + 586454183266932270, + 585191082802547770, + 583929992044550517, + 582670906200317965, + 581413820492454328, + 580158730158730158, + 578905630452022204, + 577654516640253565, + 576405384006334125, + 575158227848101265, + 573913043478260869, + 572669826224328593, + 571428571428571428, + 570189274447949526, + 568951930654058313, + 567716535433070866, + 566483084185680566, + 565251572327044025, + 564021995286724273, + 562794348508634222, + 561568627450980392, + 560344827586206896, + 559122944400939702, + 557902973395931142, + 556684910086004691, + 555468750000000000, + 555035128805620608, + 553822152886115444, + 552611067809820732, + 551401869158878504, + 550194552529182879, + 548989113530326594, + 547785547785547785, + 546583850931677018, + 545384018619084561, + 544186046511627906, + 542989930286599535, + 541795665634674922, + 540603248259860788, + 539412673879443585, + 538223938223938223, + 537037037037037037, + 535851966075558982, + 534668721109399075, + 533487297921478060, + 532307692307692307, + 531129900076863950, + 529953917050691244, + 528779739063699155, + 527607361963190184, + 526436781609195402, + 525267993874425727, + 524100994644223412, + 522935779816513761, + 521772345301757066, + 520610687022900763, + 519450800915331807, + 518292682926829268, + 517136329017517136, + 515981735159817351, + 514828897338403041, + 513677811550151975, + 512528473804100227, + 511380880121396054, + 510235026535253980, + 509090909090909090, + 507948523845571536, + 506807866868381240, + 505668934240362811, + 504531722054380664, + 503396226415094339, + 502262443438914027, + 501130369253956292, + 500000000000000000, + 499623777276147479, + 498496240601503759, + 497370398196844477, + 496246246246246246, + 495123780945236309, + 494002998500749625, + 492883895131086142, + 491766467065868263, + 490650710545998504, + 489536621823617339, + 488424197162061239, + 487313432835820895, + 486204325130499627, + 485096870342771982, + 483991064780342516, + 482886904761904761, + 481784386617100371, + 480683506686478454, + 479584261321455085, + 478486646884272997, + 477390659747961452, + 476296296296296296, + 475203552923760177, + 474112426035502958, + 473022912047302291, + 471935007385524372, + 470848708487084870, + 469764011799410029, + 468680913780397936, + 467599410898379970, + 466519499632082413, + 465441176470588235, + 464364437913299044, + 463289280469897209, + 462215700660308143, + 461143695014662756, + 460073260073260073, + 459004392386530014, + 457937088514996342, + 456871345029239766, + 455807158509861212, + 454744525547445255, + 453683442742523705, + 452623906705539358, + 451565914056809905, + 450509461426491994, + 449454545454545454, + 448401162790697674, + 447349310094408133, + 446298984034833091, + 445250181290790427, + 444202898550724637, + 443157132512671976, + 442112879884225759, + 441070137382501807, + 440028901734104046, + 438989169675090252, + 437950937950937950, + 436914203316510454, + 435878962536023054, + 434845212383009359, + 433812949640287769, + 432782171099928109, + 431752873563218390, + 430725053840631730, + 429698708751793400, + 428673835125448028, + 427650429799426934, + 426628489620615604, + 425608011444921316, + 424588992137240886, + 423571428571428571, + 422555317630264097, + 421540656205420827, + 420527441197434069, + 419515669515669515, + 418505338078291814, + 417496443812233285, + 416488983653162757, + 415482954545454545, + 414478353442157558, + 413475177304964539, + 412473423104181431, + 411473087818696883, + 410474168435951875, + 409476661951909476, + 408480565371024734, + 407485875706214689, + 406492589978828510, + 405500705218617771, + 404510218463706835, + 403521126760563380, + 402533427163969035, + 401547116736990154, + 400562192550948699, + 399578651685393258, + 398596491228070175, + 397615708274894810, + 396636299929922915, + 395658263305322128, + 394681595521343596, + 393706293706293706, + 392732354996505939, + 391759776536312849, + 390788555478018143, + 389818688981868898, + 388850174216027874, + 387883008356545961, + 386917188587334725, + 385952712100139082, + 384989576094510076, + 384027777777777777, + 383067314365024288, + 382108183079056865, + 381150381150381150, + 380193905817174515, + 379238754325259515, + 378284923928077455, + 377332411886662059, + 376381215469613259, + 375431331953071083, + 374482758620689655, + 373535492763611302, + 372589531680440771, + 371644872677219545, + 370701513067400275, + 369759450171821305, + 368818681318681318, + 367879203843514070, + 366941015089163237, + 366004112405757368, + 365068493150684931, + 364134154688569472, + 363201094391244870, + 362269309637730690, + 361338797814207650, + 360409556313993174, + 359481582537517053, + 358554873892297205, + 357629427792915531, + 356705241660993873, + 355782312925170068, + 354860639021074099, + 353940217391304347, + 353021045485403937, + 352103120759837177, + 351186440677966101, + 350271002710027100, + 349356804333107650, + 348443843031123139, + 347532116294793779, + 346621621621621621, + 345712356515867656, + 344804318488529014, + 343897505057316250, + 342991913746630727, + 342087542087542087, + 341184387617765814, + 340282447881640887, + 339381720430107526, + 338482202820685023, + 337583892617449664, + 336686787391012743, + 335790884718498659, + 334896182183523107, + 334002677376171352, + 333110367892976588, + 332219251336898395, + 331329325317301269, + 330440587449933244, + 329553035356904603, + 328666666666666666, + 327781479013990672, + 326897470039946737, + 326014637391882900, + 325132978723404255, + 324252491694352159, + 323373173970783532, + 322495023224950232, + 321618037135278514, + 320742213386348575, + 319867549668874172, + 318994043679682329, + 318121693121693121, + 317250495703899537, + 316380449141347424, + 315511551155115511, + 314643799472295514, + 313777191825972313, + 312911725955204216, + 312047399605003291, + 311184210526315789, + 310322156476002629, + 309461235216819973, + 308601444517399868, + 307742782152230971, + 306885245901639344, + 306028833551769331, + 305173542894564505, + 304319371727748691, + 303466317854807063, + 302614379084967320, + 301763553233180927, + 300913838120104438, + 300065231572080887, + 299217731421121251, + 298371335504885993, + 297526041666666666, + 296681847755367599, + 295838751625487646, + 294996751137102014, + 294155844155844155, + 293316028552887735, + 292477302204928664, + 291639662994167206, + 290803108808290155, + 289967637540453074, + 289133247089262613, + 288299935358758888, + 287467700258397932, + 286636539703034215, + 285806451612903225, + 284977433913604126, + 284149484536082474, + 283322601416613007, + 282496782496782496, + 281672025723472668, + 280848329048843187, + 280025690430314707, + 279204107830551989, + 278383579217447081, + 277564102564102564, + 276745675848814862, + 275928297055057618, + 275111964171465131, + 274296675191815856, + 273482428115015974, + 272669220945083014, + 271857051691129546, + 271045918367346938, + 270235818992989165, + 269426751592356687, + 268618714194780394, + 267811704834605597, + 267005721551176096, + 266200762388818297, + 265396825396825396, + 264593908629441624, + 263792010145846544, + 262991128010139416, + 262191260291323622, + 261392405063291139, + 260594560404807084, + 259797724399494310, + 259001895135818066, + 258207070707070707, + 257413249211356466, + 256620428751576292, + 255828607435412728, + 255037783375314861, + 254247954688483322, + 253459119496855345, + 252671275927089880, + 251884422110552763, + 251098556183301946, + 250313676286072772, + 249529780564263322, + 248746867167919799, + 247964934251721978, + 247183979974968710, + 246404002501563477, + 245625000000000000, + 245471580262336039, + 244694132334581772, + 243917654398003742, + 243142144638403990, + 242367601246105919, + 241594022415940224, + 240821406347230864, + 240049751243781094, + 239279055313859540, + 238509316770186335, + 237740533829919304, + 236972704714640198, + 236205827650340979, + 235439900867410161, + 234674922600619195, + 233910891089108910, + 233147804576376004, + 232385661310259579, + 231624459542927733, + 230864197530864197, + 230104873534855027, + 229346485819975339, + 228589032655576093, + 227832512315270935, + 227076923076923076, + 226322263222632226, + 225568531038721573, + 224815724815724815, + 224063842848373235, + 223312883435582822, + 222562844880441446, + 221813725490196078, + 221065523576240048, + 220318237454100367, + 219571865443425076, + 218826405867970660, + 218081857055589492, + 217338217338217338, + 216595485051860890, + 215853658536585365, + 215112736136502132, + 214372716199756394, + 213633597078514911, + 212895377128953771, + 212158054711246200, + 211421628189550425, + 210686095931997571, + 209951456310679611, + 209217707701637355, + 208484848484848484, + 207752877044215626, + 207021791767554479, + 206291591046581972, + 205562273276904474, + 204833836858006042, + 204106280193236714, + 203379601689800844, + 202653799758745476, + 201928872814948764, + 201204819277108433, + 200481637567730282, + 199759326113116726, + 199037883343355381, + 198317307692307692, + 197597597597597597, + 196878751500600240, + 196160767846430713, + 195443645083932853, + 194727381665668064, + 194011976047904191, + 193297426690604428, + 192583732057416267, + 191870890615660490, + 191158900836320191, + 190447761194029850, + 189737470167064439, + 189028026237328562, + 188319427890345649, + 187611673615247170, + 186904761904761904, + 186198691255205234, + 185493460166468489, + 184789067142008318, + 184085510688836104, + 183382789317507418, + 182680901542111506, + 181979845880260818, + 181279620853080568, + 180580224985198342, + 179881656804733727, + 179183914843287995, + 178486997635933806, + 177790903721204961, + 177095631641086186, + 176401179941002949, + 175707547169811320, + 175014731879787860, + 174322732626619552, + 173631547969393761, + 172941176470588235, + 172251616696061140, + 171562867215041128, + 170874926600117439, + 170187793427230046, + 169501466275659824, + 168815943728018757, + 168131224370240187, + 167447306791569086, + 166764189584552369, + 166081871345029239, + 165400350672121566, + 164719626168224299, + 164039696438995913, + 163360560093348891, + 162682215743440233, + 162004662004662004, + 161327897495631916, + 160651920838183934, + 159976730657358929, + 159302325581395348, + 158628704241719930, + 157955865272938443, + 157283807312826465, + 156612529002320185, + 155942028985507246, + 155272305909617612, + 154603358425014475, + 153935185185185185, + 153267784846732215, + 152601156069364161, + 151935297515886770, + 151270207852193995, + 150605885747259088, + 149942329873125720, + 149279538904899135, + 148617511520737327, + 147956246401842256, + 147295742232451093, + 146635997699827487, + 145977011494252873, + 145318782309017805, + 144661308840413318, + 144004589787722317, + 143348623853211009, + 142693409742120343, + 142038946162657502, + 141385231825987406, + 140732265446224256, + 140080045740423098, + 139428571428571428, + 138777841233580810, + 138127853881278538, + 137478608100399315, + 136830102622576966, + 136182336182336182, + 135535307517084282, + 134889015367103016, + 134243458475540386, + 133598635588402501, + 132954545454545454, + 132311186825667234, + 131668558456299659, + 131026659103800340, + 130385487528344671, + 129745042492917847, + 129105322763306908, + 128466327108092812, + 127828054298642533, + 127190503109101187, + 126553672316384180, + 125917560700169395, + 125282167042889390, + 124647490129723632, + 124013528748590755, + 123380281690140845, + 122747747747747747, + 122115925717501406, + 121484814398200224, + 120854412591343451, + 120224719101123595, + 119595732734418865, + 118967452300785634, + 118339876612450925, + 117713004484304932, + 117086834733893557, + 116461366181410974, + 115836597649692221, + 115212527964205816, + 114589155953046394, + 113966480446927374, + 113344500279173646, + 112723214285714285, + 112102621305075292, + 111482720178372352, + 110863509749303621, + 110244988864142538, + 109627156371730662, + 109010011123470522, + 108393551973318510, + 107777777777777777, + 107162687395891171, + 106548279689234184, + 105934553521907931, + 105321507760532150, + 104709141274238227, + 104097452934662236, + 103486441615938018, + 102876106194690265, + 102266445550027639, + 101657458563535911, + 101049144119271120, + 100441501103752759, + 99834528405956977, + 99228224917309812, + 98622589531680440, + 98017621145374449, + 97413318657127132, + 96809680968096809, + 96206706981858163, + 95604395604395604, + 95002745744096650, + 94401756311745334, + 93801426220515633, + 93201754385964912, + 92602739726027397, + 92004381161007667, + 91406677613574165, + 90809628008752735, + 90213231273920174, + 89617486338797814, + 89022392135445111, + 88427947598253275, + 87834151663938897, + 87241003271537622, + 86648501362397820, + 86056644880174291, + 85465432770821992, + 84874863982589771, + 84284937466014138, + 83695652173913043, + 83107007061379684, + 82519001085776330, + 81931633206728160, + 81344902386117136, + 80758807588075880, + 80173347778981581, + 79588521927449918, + 79004329004329004, + 78420767982693347, + 77837837837837837, + 77255537547271745, + 76673866090712742, + 76092822450080949, + 75512405609492988, + 74932614555256064, + 74353448275862068, + 73774905761981690, + 73196986006458557, + 72619688004303388, + 72043010752688172, + 71466953250940354, + 70891514500537056, + 70316693505099302, + 69742489270386266, + 69168900804289544, + 68595927116827438, + 68023567220139260, + 67451820128479657, + 66880684858212948, + 66310160427807486, + 65740245857830037, + 65170940170940170, + 64602242391884676, + 64034151547491995, + 63466666666666666, + 62899786780383795, + 62333510921683537, + 61767838125665601, + 61202767429483767, + 60638297872340425, + 60074428495481127, + 59511158342189160, + 58948486457780138, + 58386411889596602, + 57824933687002652, + 57264050901378579, + 56703762586115527, + 56144067796610169, + 55584965590259396, + 55026455026455026, + 54468535166578529, + 53911205073995771, + 53354463814051769, + 52798310454065469, + 52242744063324538, + 51687763713080168, + 51133368476541908, + 50579557428872497, + 50026329647182727, + 49473684210526315, + 48921620199894792, + 48370136698212407, + 47819232790331056, + 47268907563025210, + 46719160104986876, + 46169989506820566, + 45621394861038280, + 45073375262054507, + 44525929806181246, + 43979057591623036, + 43432757718472004, + 42887029288702928, + 42341871406168322, + 41797283176593521, + 41253263707571801, + 40709812108559498, + 40166927490871152, + 39624608967674661, + 39082855653986451, + 38541666666666666, + 38001041124414367, + 37460978147762747, + 36921476859074362, + 36382536382536382, + 35844155844155844, + 35306334371754932, + 34769071094966268, + 34232365145228215, + 33696215655780196, + 33160621761658031, + 32625582599689280, + 32091097308488612, + 31557165028453181, + 31023784901758014, + 30490956072351421, + 29958677685950413, + 29426948890036138, + 28895768833849329, + 28365136668385765, + 27835051546391752, + 27305512622359608, + 26776519052523171, + 26248069994853319, + 25720164609053497, + 25192802056555269, + 24665981500513874, + 24139702105803800, + 23613963039014373, + 23088763468445356, + 22564102564102564, + 22039979497693490, + 21516393442622950, + 20993343573988735, + 20470829068577277, + 19948849104859335, + 19427402862985685, + 18906489524782830, + 18386108273748723, + 17866258295048494, + 17346938775510204, + 16828148903620601, + 16309887869520897, + 15792154865002547, + 15274949083503054, + 14758269720101781, + 14242115971515768, + 13726487036095577, + 13211382113821138, + 12696800406297613, + 12182741116751269, + 11669203450025367, + 11156186612576064, + 10643689812468322, + 10131712259371833, + 9620253164556962, + 9109311740890688, + 8598887202832574, + 8088978766430738, + 7579585649317837, + 7070707070707070, + 6562342251388187, + 6054490413723511, + 5547150781643973, + 5040322580645161, + 4534005037783375, + 4028197381671701, + 3522898842476094, + 3018108651911468, + 2513826043237807, + 2010050251256281, + 1506780512305374, + 1004016064257028, + 501756146512794, + 501504513540621, + 501253132832080, + 501002004008016, + 500751126690035, + 500500500500500, + 500250125062531, + 500000000000000, + 499750124937531, + 499500499500499, + 499251123315027, + 499001996007984, + 498753117206982, + 498504486540378, + 498256103637269, + 498007968127490, + 497760079641612, + 497512437810945, + 497265042267528, + 497017892644135, + 496770988574267, + 496524329692154, + 496277915632754, + 496031746031746, + 495785820525532, + 495540138751238, + 495294700346706, + 495049504950495, + 494804552201880, + 494559841740850, + 494315373208106, + 494071146245059, + 493827160493827, + 493583415597235, + 493339911198815, + 493096646942800, + 492853622474125, + 492610837438423, + 492368291482028, + 492125984251968, + 491883915395966, + 491642084562438, + 491400491400491, + 491159135559921, + 490918016691212, + 490677134445534, + 490436488474742, + 490196078431372, + 489955903968642, + 489715964740450, + 489476260401370, + 489236790606653, + 488997555012224, + 488758553274682, + 488519785051294, + 488281250000000, + 488042947779404, + 487804878048780, + 487567040468064, + 487329434697855, + 487092060399415, + 486854917234664, + 486618004866180, + 486381322957198, + 486144871171609, + 485908649173955, + 485672656629431, + 485436893203883, + 485201358563803, + 484966052376333, + 484730974309258, + 484496124031007, + 484261501210653, + 484027105517909, + 483792936623125, + 483558994197292, + 483325277912034, + 483091787439613, + 482858522452921, + 482625482625482, + 482392667631452, + 482160077145612, + 481927710843373, + 481695568400770, + 481463649494463, + 481231953801732, + 481000481000481, + 480769230769230, + 480538202787121, + 480307396733909, + 480076812289966, + 479846449136276, + 479616306954436, + 479386385426653, + 479156684235745, + 478927203065134, + 478697941598851, + 478468899521531, + 478240076518412, + 478011472275334, + 477783086478738, + 477554918815663 +] \ No newline at end of file diff --git a/src/test/integration/iterations2.json b/src/test/integration/iterations2.json new file mode 100644 index 0000000000..6f8dc10e71 --- /dev/null +++ b/src/test/integration/iterations2.json @@ -0,0 +1,1014 @@ +[ + 997987927565392354, + 993975903614457831, + 989979959919839679, + 986000000000000000, + 984031936127744510, + 980079681274900398, + 976143141153081510, + 972222222222222222, + 968316831683168316, + 964426877470355731, + 960552268244575936, + 956692913385826771, + 952848722986247544, + 949019607843137254, + 945205479452054794, + 941406250000000000, + 939571150097465886, + 935797665369649805, + 932038834951456310, + 928294573643410852, + 924564796905222437, + 920849420849420849, + 917148362235067437, + 913461538461538461, + 909788867562380038, + 906130268199233716, + 902485659655831739, + 898854961832061068, + 895238095238095238, + 891634980988593155, + 888045540796963946, + 884469696969696969, + 880907372400756143, + 877358490566037735, + 873822975517890772, + 870300751879699248, + 866791744840525328, + 863295880149812734, + 859813084112149532, + 856343283582089552, + 852886405959031657, + 849442379182156133, + 846011131725417439, + 842592592592592592, + 839186691312384473, + 835793357933579335, + 832412523020257826, + 829044117647058823, + 825688073394495412, + 822344322344322344, + 819012797074954296, + 815693430656934306, + 812386156648451730, + 809090909090909090, + 805807622504537205, + 802536231884057971, + 799276672694394213, + 796028880866425992, + 792792792792792792, + 789568345323741007, + 786355475763016157, + 783154121863799283, + 779964221824686940, + 776785714285714285, + 773618538324420677, + 770462633451957295, + 767317939609236234, + 764184397163120567, + 761061946902654867, + 757950530035335689, + 754850088183421516, + 751760563380281690, + 748681898066783831, + 745614035087719298, + 742556917688266199, + 739510489510489510, + 736474694589877835, + 733449477351916376, + 730434782608695652, + 727430555555555555, + 724436741767764298, + 721453287197231833, + 718480138169257340, + 715517241379310344, + 712564543889845094, + 709621993127147766, + 706689536878216123, + 703767123287671232, + 700854700854700854, + 697952218430034129, + 695059625212947189, + 692176870748299319, + 689303904923599320, + 686440677966101694, + 683587140439932318, + 680743243243243243, + 677908937605396290, + 675084175084175084, + 672268907563025210, + 669463087248322147, + 666666666666666666, + 663879598662207357, + 661101836393989983, + 658333333333333333, + 655574043261231281, + 652823920265780730, + 650082918739635157, + 647350993377483443, + 644628099173553719, + 641914191419141914, + 639209225700164744, + 636513157894736842, + 633825944170771756, + 631147540983606557, + 628477905073649754, + 625816993464052287, + 623164763458401305, + 620521172638436482, + 617886178861788617, + 615259740259740259, + 612641815235008103, + 610032362459546925, + 607431340872374798, + 604838709677419354, + 602254428341384863, + 599678456591639871, + 597110754414125200, + 594551282051282051, + 592000000000000000, + 591054313099041533, + 588516746411483253, + 585987261146496815, + 583465818759936406, + 580952380952380952, + 578446909667194928, + 575949367088607594, + 573459715639810426, + 570977917981072555, + 568503937007874015, + 566037735849056603, + 563579277864992150, + 561128526645768025, + 558685446009389671, + 556250000000000000, + 555382215288611544, + 552959501557632398, + 550544323483670295, + 548136645962732919, + 545736434108527131, + 543343653250773993, + 540958268933539412, + 538580246913580246, + 536209553158705701, + 533846153846153846, + 531490015360983102, + 529141104294478527, + 526799387442572741, + 524464831804281345, + 522137404580152671, + 519817073170731707, + 517503805175038051, + 515197568389057750, + 512898330804248861, + 510606060606060606, + 508320726172465960, + 506042296072507552, + 503770739064856711, + 501506024096385542, + 499248120300751879, + 496996996996996996, + 494752623688155922, + 492514970059880239, + 490284005979073243, + 488059701492537313, + 485842026825633383, + 483630952380952380, + 481426448736998514, + 479228486646884272, + 477037037037037037, + 474852071005917159, + 472673559822747415, + 470501474926253687, + 468335787923416789, + 466176470588235294, + 464023494860499265, + 461876832844574780, + 459736456808199121, + 457602339181286549, + 455474452554744525, + 453352769679300291, + 451237263464337700, + 449127906976744186, + 447024673439767779, + 444927536231884057, + 442836468885672937, + 440751445086705202, + 438672438672438672, + 436599423631123919, + 434532374100719424, + 432471264367816091, + 430416068866571018, + 428366762177650429, + 426323319027181688, + 424285714285714285, + 422253922967189728, + 420227920227920227, + 418207681365576102, + 416193181818181818, + 414184397163120567, + 412181303116147308, + 410183875530410183, + 408192090395480225, + 406205923836389280, + 404225352112676056, + 402250351617440225, + 400280898876404494, + 398316970546984572, + 396358543417366946, + 394405594405594405, + 392458100558659217, + 390516039051603905, + 388579387186629526, + 386648122392211404, + 384722222222222222, + 382801664355062413, + 380886426592797783, + 378976486860304287, + 377071823204419889, + 375172413793103448, + 373278236914600550, + 371389270976616231, + 369505494505494505, + 367626886145404663, + 365753424657534246, + 363885088919288645, + 362021857923497267, + 360163710777626193, + 358310626702997275, + 356462585034013605, + 354619565217391304, + 352781546811397557, + 350948509485094850, + 349120433017591339, + 347297297297297297, + 345479082321187584, + 343665768194070080, + 341857335127860026, + 340053763440860215, + 338255033557046979, + 336461126005361930, + 334672021419009370, + 332887700534759358, + 331108144192256341, + 329333333333333333, + 327563249001331557, + 325797872340425531, + 324037184594953519, + 322281167108753315, + 320529801324503311, + 318783068783068783, + 317040951122853368, + 315303430079155672, + 313570487483530961, + 311842105263157894, + 310118265440210249, + 308398950131233595, + 306684141546526867, + 304973821989528795, + 303267973856209150, + 301566579634464751, + 299869621903520208, + 298177083333333333, + 296488946684005201, + 294805194805194805, + 293125810635538261, + 291450777202072538, + 289780077619663648, + 288113695090439276, + 286451612903225806, + 284793814432989690, + 283140283140283140, + 281491002570694087, + 279845956354300385, + 278205128205128205, + 276568501920614596, + 274936061381074168, + 273307790549169859, + 271683673469387755, + 270063694267515923, + 268447837150127226, + 266836086404066073, + 265228426395939086, + 263624841571609632, + 262025316455696202, + 260429835651074589, + 258838383838383838, + 257250945775535939, + 255667506297229219, + 254088050314465408, + 252512562814070351, + 250941028858218318, + 249373433583959899, + 247809762202753441, + 246250000000000000, + 245942571785268414, + 244389027431421446, + 242839352428393524, + 241293532338308457, + 239751552795031055, + 238213399503722084, + 236679058240396530, + 235148514851485148, + 233621755253399258, + 232098765432098765, + 230579531442663378, + 229064039408866995, + 227552275522755227, + 226044226044226044, + 224539877300613496, + 223039215686274509, + 221542227662178702, + 220048899755501222, + 218559218559218559, + 217073170731707317, + 215590742996345919, + 214111922141119221, + 212636695018226002, + 211165048543689320, + 209696969696969696, + 208232445520581113, + 206771463119709794, + 205314009661835748, + 203860072376357056, + 202409638554216867, + 200962695547533092, + 199519230769230769, + 198079231692677070, + 196642685851318944, + 195209580838323353, + 193779904306220095, + 192353643966547192, + 190930787589498806, + 189511323003575685, + 188095238095238095, + 186682520808561236, + 185273159144893111, + 183867141162514827, + 182464454976303317, + 181065088757396449, + 179669030732860520, + 178276269185360094, + 176886792452830188, + 175500588928150765, + 174117647058823529, + 172737955346650998, + 171361502347417840, + 169988276670574443, + 168618266978922716, + 167251461988304093, + 165887850467289719, + 164527421236872812, + 163170163170163170, + 161816065192083818, + 160465116279069767, + 159117305458768873, + 157772621809744779, + 156431054461181923, + 155092592592592592, + 153757225433526011, + 152424942263279445, + 151095732410611303, + 149769585253456221, + 148446490218642117, + 147126436781609195, + 145809414466130884, + 144495412844036697, + 143184421534936998, + 141876430205949656, + 140571428571428571, + 139269406392694063, + 137970353477765108, + 136674259681093394, + 135381114903299203, + 134090909090909090, + 132803632236095346, + 131519274376417233, + 130237825594563986, + 128959276018099547, + 127683615819209039, + 126410835214446952, + 125140924464487034, + 123873873873873873, + 122609673790776152, + 121348314606741573, + 120089786756453423, + 118834080717488789, + 117581187010078387, + 116331096196868008, + 115083798882681564, + 113839285714285714, + 112597547380156075, + 111358574610244988, + 110122358175750834, + 108888888888888888, + 107658157602663706, + 106430155210643015, + 105204872646733111, + 103982300884955752, + 102762430939226519, + 101545253863134657, + 100330760749724366, + 99118942731277533, + 97909790979097909, + 96703296703296703, + 95499451152579582, + 94298245614035087, + 93099671412924424, + 91903719912472647, + 90710382513661202, + 89519650655021834, + 88331515812431842, + 87145969498910675, + 85963003264417845, + 84782608695652173, + 83604777415852334, + 82429501084598698, + 81256771397616468, + 80086580086580086, + 78918918918918918, + 77753779697624190, + 76591154261057173, + 75431034482758620, + 74273412271259418, + 73118279569892473, + 71965628356605800, + 70815450643776824, + 69667738478027867, + 68522483940042826, + 67379679144385026, + 66239316239316239, + 65101387406616862, + 63965884861407249, + 62832800851970181, + 61702127659574468, + 60573857598299681, + 59447983014861995, + 58324496288441145, + 57203389830508474, + 56084656084656084, + 54968287526427061, + 53854276663146779, + 52742616033755274, + 51633298208640674, + 50526315789473684, + 49421661409043112, + 48319327731092436, + 47219307450157397, + 46121593291404612, + 45026178010471204, + 43933054393305439, + 42842215256008359, + 41753653444676409, + 40667361835245046, + 39583333333333333, + 38501560874089490, + 37422037422037422, + 36344755970924195, + 35269709543568464, + 34196891191709844, + 33126293995859213, + 32057911065149948, + 30991735537190082, + 29927760577915376, + 28865979381443298, + 27806385169927909, + 26748971193415637, + 25693730729701952, + 24640657084188911, + 23589743589743589, + 22540983606557377, + 21494370522006141, + 20449897750511247, + 19407558733401430, + 18367346938775510, + 17329255861365953, + 16293279022403258, + 15259409969481180, + 14227642276422764, + 13197969543147208, + 12170385395537525, + 11144883485309017, + 10121457489878542, + 9100101112234580, + 8080808080808080, + 7063572149344096, + 6048387096774193, + 5035246727089627, + 4024144869215291, + 3015075376884422, + 2008032128514056, + 1003009027081243, + 334001336005344021, + 333110814419225634, + 332221480987324883, + 331333333333333333, + 330446369087275149, + 329560585885486018, + 328675981370592149, + 327792553191489361, + 326910299003322259, + 326029216467463479, + 325149303251493032, + 324270557029177718, + 323392975480450629, + 322516556291390728, + 321641297154202514, + 320767195767195767, + 319894249834765366, + 319022457067371202, + 318151815181518151, + 317282321899736147, + 316413974950560316, + 315546772068511198, + 314680710994075049, + 313815789473684210, + 312952005259697567, + 312089356110381077, + 311227839789888378, + 310367454068241469, + 309508196721311475, + 308650065530799475, + 307793058284217419, + 306937172774869109, + 306082406801831262, + 305228758169934640, + 304376224689745264, + 303524804177545691, + 302674494455316373, + 301825293350717079, + 300977198697068403, + 300130208333333333, + 299284320104098893, + 298439531859557867, + 297595841455490578, + 296753246753246753, + 295911745619727449, + 295071335927367055, + 294232015554115359, + 293393782383419689, + 292556634304207119, + 291720569210866752, + 290885585003232062, + 290051679586563307, + 289218850871530019, + 288387096774193548, + 287556415215989684, + 286726804123711340, + 285898261429491307, + 285070785070785070, + 284244372990353697, + 283419023136246786, + 282594733461785484, + 281771501925545571, + 280949326491340602, + 280128205128205128, + 279308135810377962, + 278489116517285531, + 277671145233525271, + 276854219948849104, + 276038338658146964, + 275223499361430395, + 274409700063816209, + 273596938775510204, + 272785213511790949, + 271974522292993630, + 271164863144493952, + 270356234096692111, + 269548633184996821, + 268742058449809402, + 267936507936507936, + 267131979695431472, + 266328471781864299, + 265525982256020278, + 264724509183027232, + 263924050632911392, + 263124604680581910, + 262326169405815423, + 261528742893240682, + 260732323232323232, + 259936908517350157, + 259142496847414880, + 258349086326402016, + 257556675062972292, + 256765261170547514, + 255974842767295597, + 255185417976115650, + 254396984924623115, + 253609541745134965, + 252823086574654956, + 252037617554858934, + 251253132832080200, + 250469630557294927, + 249687108886107634, + 248905565978736710, + 248125000000000000, + 247970018738288569, + 247191011235955056, + 246412975670617592, + 245635910224438902, + 244859813084112149, + 244084682440846824, + 243310516490354698, + 242537313432835820, + 241765071472964574, + 240993788819875776, + 240223463687150837, + 239454094292803970, + 238685678859268443, + 237918215613382899, + 237151702786377708, + 236386138613861386, + 235621521335807050, + 234857849196538936, + 234095120444718962, + 233333333333333333, + 232572486119679210, + 231812577065351418, + 231053604436229205, + 230295566502463054, + 229538461538461538, + 228782287822878228, + 228027043638598647, + 227272727272727272, + 226519337016574585, + 225766871165644171, + 225015328019619865, + 224264705882352941, + 223515003061849357, + 222766217870257037, + 222018348623853211, + 221271393643031784, + 220525351252290775, + 219780219780219780, + 219035997559487492, + 218292682926829268, + 217550274223034734, + 216808769792935444, + 216068167985392574, + 215328467153284671, + 214589665653495440, + 213851761846901579, + 213114754098360655, + 212378640776699029, + 211643420254699818, + 210909090909090909, + 210175651120533010, + 209443099273607748, + 208711433756805807, + 207980652962515114, + 207250755287009063, + 206521739130434782, + 205793602896801448, + 205066344993968636, + 204339963833634719, + 203614457831325301, + 202889825406381697, + 202166064981949458, + 201443174984966927, + 200721153846153846, + 200000000000000000, + 199879951980792316, + 199160167966406718, + 198441247002398081, + 197723187537447573, + 197005988023952095, + 196289646918013165, + 195574162679425837, + 194859533771667662, + 194145758661887694, + 193432835820895522, + 192720763723150357, + 192009540846750149, + 191299165673420738, + 190589636688505062, + 189880952380952380, + 189173111243307555, + 188466111771700356, + 187759952465834818, + 187054631828978622, + 186350148367952522, + 185646500593119810, + 184943687018375815, + 184241706161137440, + 183540556542332741, + 182840236686390532, + 182140745121230041, + 181442080378250591, + 180744240992321323, + 180047225501770956, + 179351032448377581, + 178655660377358490, + 177961107837360047, + 177267373380447585, + 176574455562095350, + 175882352941176470, + 175191064079952968, + 174500587544065804, + 173810921902524955, + 173122065727699530, + 172434017595307917, + 171746776084407971, + 171060339777387229, + 170374707259953161, + 169689877121123464, + 169005847953216374, + 168322618351841028, + 167640186915887850, + 166958552247518972, + 166277712952158693, + 165597667638483965, + 164918414918414918, + 164239953407105416, + 163562281722933643, + 162885398487492728, + 162209302325581395, + 161533991865194654, + 160859465737514518, + 160185722576900754, + 159512761020881670, + 158840579710144927, + 158169177288528389, + 157498552403011001, + 156828703703703703, + 156159629843840370, + 155491329479768786, + 154823801270941652, + 154157043879907621, + 153491055972302365, + 152825836216839677, + 152161383285302593, + 151497695852534562, + 150834772596430627, + 150172612197928653, + 149511213341000575, + 148850574712643678, + 148190695002871912, + 147531572904707233, + 146873207114170969, + 146215596330275229, + 145558739255014326, + 144902634593356242, + 144247281053234115, + 143592677345537757, + 142938822184105202, + 142285714285714285, + 141633352370074243, + 140981735159817351, + 140330861380490587, + 139680729760547320, + 139031339031339031, + 138382687927107061, + 137734775184974388, + 137087599544937428, + 136441159749857873, + 135795454545454545, + 135150482680295286, + 134506242905788876, + 133862733976176971, + 133219954648526077, + 132577903682719546, + 131936579841449603, + 131295981890209394, + 130656108597285067, + 130016958733747880, + 129378531073446327, + 128740824392998306, + 128103837471783295, + 127467569091934574, + 126832018038331454, + 126197183098591549, + 125563063063063063, + 124929656724817107, + 124296962879640044, + 123664980326025857, + 123033707865168539, + 122403144300954519, + 121773288439955106, + 121144139091418956, + 120515695067264573, + 119887955182072829, + 119260918253079507, + 118634583100167879, + 118008948545861297, + 117384013415315818, + 116759776536312849, + 116136236739251814, + 115513392857142857, + 114891243725599553, + 114269788182831661, + 113649025069637883, + 113028953229398663, + 112409571508069003, + 111790878754171301, + 111172873818788215, + 110555555555555555, + 109938922820655191, + 109322974472807991, + 108707709373266777, + 108093126385809312, + 107479224376731301, + 106866002214839424, + 106253458771444382, + 105641592920353982, + 105030403537866224, + 104419889502762430, + 103810049696300386, + 103200883002207505, + 102592388306674020, + 101984564498346196, + 101377410468319559, + 100770925110132158, + 100165107319757842, + 99559955995599559, + 98955470038482682, + 98351648351648351, + 97748489840746842, + 97145993413830954, + 96544157981349424, + 95942982456140350, + 95342465753424657, + 94742606790799561, + 94143404488232074, + 93544857768052516, + 92946965554948059, + 92349726775956284, + 91753140360458765, + 91157205240174672, + 90561920349154391, + 89967284623773173, + 89373297002724795, + 88779956427015250, + 88187261839956450, + 87595212187159956, + 87003806416530723, + 86413043478260869, + 85822922324823465, + 85233441910966340, + 84644601193705914, + 84056399132321041, + 83468834688346883, + 82881906825568797, + 82295614510016242, + 81709956709956709, + 81124932395889670, + 80540540540540540, + 79956780118854673, + 79373650107991360, + 78791149487317862, + 78209277238403451, + 77628032345013477, + 77047413793103448, + 76467420570813139, + 75888051668460710, + 75309306078536847, + 74731182795698924, + 74153680816765180, + 73576799140708915, + 73000536768652710, + 72424892703862660, + 71849865951742627, + 71275455519828510, + 70701660417782538, + 70128479657387580, + 69555912252541466, + 68983957219251336, + 68412613575628006, + 67841880341880341, + 67271756540309663, + 66702241195304162, + 66133333333333333, + 65565031982942430, + 64997336174746936, + 64430244941427050, + 63863757317722192, + 63297872340425531, + 62732589048378522, + 62167906482465462, + 61603823685608072, + 61040339702760084, + 60477453580901856, + 59915164369034994, + 59353471118177000, + 58792372881355932, + 58231868713605082, + 57671957671957671, + 57112638815441565, + 56553911205073995, + 55995773903856312, + 55438225976768743, + 54881266490765171, + 54324894514767932, + 53769109119662625, + 53213909378292939, + 52659294365455502, + 52105263157894736, + 51551814834297738, + 50998948475289169, + 50446663163426169, + 49894957983193277, + 49343832020997375, + 48793284365162644, + 48243314105925537, + 47693920335429769, + 47145102147721320, + 46596858638743455, + 46049188906331763, + 45502092050209205, + 44955567171981181, + 44409613375130616, + 43864229765013054, + 43319415448851774, + 42775169535732916, + 42231491136600625, + 41688379364252214, + 41145833333333333, + 40603852160333159, + 40062434963579604, + 39521580863234529, + 38981288981288981, + 38441558441558441, + 37902388369678089, + 37363777893098079, + 36825726141078838, + 36288232244686365, + 35751295336787564, + 35214914552045572, + 34679089026915113, + 34143817899637868, + 33609100310237849, + 33074935400516795, + 32541322314049586, + 32008260196179659, + 31475748194014447, + 30943785456420835, + 30412371134020618, + 29881504379185986, + 29351184346035015, + 28821410190427174, + 28292181069958847, + 27763496143958868, + 27235354573484069, + 26707755521314843, + 26180698151950718, + 25654181631605951, + 25128205128205128, + 24602767811378780, + 24077868852459016, + 23553507424475166, + 23029682702149437, + 22506393861892583, + 21983640081799591, + 21461420541645375, + 20939734422880490, + 20418580908626850, + 19897959183673469, + 19377868434472208, + 18858307849133537, + 18339276617422312, + 17820773930753564, + 17302798982188295, + 16785350966429298, + 16268429079816980, + 15752032520325203, + 15236160487557135, + 14720812182741116, + 14205986808726534, + 13691683569979716, + 13177901672579827, + 12664640324214792, + 12151898734177215, + 11639676113360323, + 11127971674253920, + 10616784630940343, + 10106114199090449, + 9595959595959595, + 9086320040383644, + 8577194752774974, + 8068582955118507, + 7560483870967741, + 7052896725440806, + 6545820745216515, + 6039255158530447, + 5533199195171026, + 5027652086475615, + 4522613065326633, + 4018081366147664, + 3514056224899598, + 3010536879076768, + 2507522567703109, + 2005012531328320, + 1503006012024048, + 1001502253380070, + 500500500500500, + 500250125062531, + 500000000000000, + 499750124937531, + 499500499500499, + 499251123315027, + 499001996007984, + 498753117206982, + 498504486540378, + 498256103637269 +] \ No newline at end of file diff --git a/src/test/integration/output.json b/src/test/integration/output.json new file mode 100644 index 0000000000..2ddb6c640b --- /dev/null +++ b/src/test/integration/output.json @@ -0,0 +1,1521 @@ +{ + "DTZ": { + "": [ + 998993963782696177, + 996984924623115577, + 994979919678714859, + 992978936810431293, + 990981963927855711, + 988988988988988988, + 987000000000000000, + 986013986013986013, + 984031936127744510, + 982053838484546360, + 980079681274900398, + 978109452736318407, + 976143141153081510, + 974180734856007944, + 972222222222222222, + 970267591674925668, + 968316831683168316, + 966369930761622156, + 964426877470355731, + 962487660414610069, + 960552268244575936, + 958620689655172413, + 956692913385826771, + 954768928220255653, + 952848722986247544, + 950932286555446516, + 949019607843137254, + 947110675808031341, + 945205479452054794, + 943304007820136852, + 941406250000000000, + 940487804878048780, + 938596491228070175, + 936708860759493670, + 934824902723735408, + 932944606413994169, + 931067961165048543, + 929194956353055286, + 927325581395348837, + 925459825750242013, + 923597678916827852, + 921739130434782608, + 919884169884169884, + 918032786885245901, + 916184971098265895, + 914340712223291626, + 912500000000000000, + 911623439000960614, + 909788867562380038, + 907957813998082454, + 906130268199233716, + 904306220095693779, + 902485659655831739, + 900668576886341929, + 898854961832061068, + 897044804575786463, + 895238095238095238, + 893434823977164605, + 891634980988593155, + 889838556505223171, + 888045540796963946, + 886255924170616113, + 884469696969696969, + 882686849574266792, + 880907372400756143, + 879131255901794145, + 877358490566037735, + 875589066918001885, + 873822975517890772, + 872060206961429915, + 870300751879699248, + 868544600938967136, + 866791744840525328, + 865042174320524835, + 863295880149812734, + 861552853133769878, + 859813084112149532, + 858076563958916900, + 856343283582089552, + 854613233923578751, + 852886405959031657, + 851162790697674418, + 849442379182156133, + 847725162488393686, + 846011131725417439, + 844300278035217794, + 842592592592592592, + 840888066604995374, + 839186691312384473, + 837488457987072945, + 835793357933579335, + 834101382488479262, + 832412523020257826, + 830726770929162833, + 829044117647058823, + 827364554637281910, + 825688073394495412, + 824014665444546287, + 822344322344322344, + 820677035681610247, + 819012797074954296, + 817351598173515981, + 815693430656934306, + 814038286235186873, + 812386156648451730, + 810737033666969972, + 809090909090909090, + 807447774750227066, + 805807622504537205, + 804170444242973708, + 802536231884057971, + 800904977375565610, + 799276672694394213, + 797651309846431797, + 796028880866425992, + 794409377817853922, + 792792792792792792, + 791179117911791179, + 789568345323741007, + 787960467205750224, + 786355475763016157, + 784753363228699551, + 783154121863799283, + 781557743957027752, + 779964221824686940, + 778373547810545129, + 776785714285714285, + 775200713648528099, + 773618538324420677, + 772039180765805877, + 770462633451957295, + 768888888888888888, + 767317939609236234, + 765749778172138420, + 764184397163120567, + 762621789193976970, + 761061946902654867, + 759504862953138815, + 757950530035335689, + 756398940864960282, + 754850088183421516, + 753303964757709251, + 751760563380281690, + 750219876868953386, + 748681898066783831, + 747146619841966637, + 745614035087719298, + 744084136722173531, + 742556917688266199, + 741032370953630796, + 739510489510489510, + 737991266375545851, + 736474694589877835, + 734960767218831734, + 733449477351916376, + 731940818102697998, + 730434782608695652, + 728931364031277150, + 727430555555555555, + 725932350390286209, + 724436741767764298, + 722943722943722943, + 721453287197231833, + 719965427830596369, + 718480138169257340, + 716997411561691113, + 715517241379310344, + 714039621016365202, + 712564543889845094, + 711092003439380911, + 709621993127147766, + 708154506437768240, + 706689536878216123, + 705227077977720651, + 703767123287671232, + 702309666381522668, + 700854700854700854, + 699402220324508966, + 697952218430034129, + 696504688832054560, + 695059625212947189, + 693617021276595744, + 692176870748299319, + 690739167374681393, + 689303904923599320, + 687871077184054283, + 686440677966101694, + 685012701100762066, + 683587140439932318, + 682163989856297548, + 680743243243243243, + 679324894514767932, + 677908937605396290, + 676495366470092670, + 675084175084175084, + 673675357443229604, + 672268907563025210, + 670864819479429051, + 669463087248322147, + 668063704945515507, + 666666666666666666, + 665271966527196652, + 663879598662207357, + 662489557226399331, + 661101836393989983, + 659716430358632193, + 658333333333333333, + 656952539550374687, + 655574043261231281, + 654197838736492103, + 652823920265780730, + 651452282157676348, + 650082918739635157, + 648715824357912178, + 647350993377483443, + 645988420181968569, + 644628099173553719, + 643270024772914946, + 641914191419141914, + 640560593569661995, + 639209225700164744, + 637860082304526748, + 636513157894736842, + 635168447000821692, + 633825944170771756, + 632485643970467596, + 631147540983606557, + 629811629811629811, + 628477905073649754, + 627146361406377759, + 625816993464052287, + 624489795918367346, + 623164763458401305, + 621841890790546047, + 620521172638436482, + 619202603742880390, + 617886178861788617, + 616571892770105605, + 615259740259740259, + 613949716139497161, + 612641815235008103, + 611336032388663967, + 610032362459546925, + 608730800323362974, + 607431340872374798, + 606133979015334947, + 604838709677419354, + 603545527800161160, + 602254428341384863, + 600965406275140788, + 599678456591639871, + 598393574297188755, + 597110754414125200, + 595829991980753809, + 594551282051282051, + 593274619695756605, + 592000000000000000, + 591526778577138289, + 590255591054313099, + 588986432561851556, + 587719298245614035, + 586454183266932270, + 585191082802547770, + 583929992044550517, + 582670906200317965, + 581413820492454328, + 580158730158730158, + 578905630452022204, + 577654516640253565, + 576405384006334125, + 575158227848101265, + 573913043478260869, + 572669826224328593, + 571428571428571428, + 570189274447949526, + 568951930654058313, + 567716535433070866, + 566483084185680566, + 565251572327044025, + 564021995286724273, + 562794348508634222, + 561568627450980392, + 560344827586206896, + 559122944400939702, + 557902973395931142, + 556684910086004691, + 555468750000000000, + 555035128805620608, + 553822152886115444, + 552611067809820732, + 551401869158878504, + 550194552529182879, + 548989113530326594, + 547785547785547785, + 546583850931677018, + 545384018619084561, + 544186046511627906, + 542989930286599535, + 541795665634674922, + 540603248259860788, + 539412673879443585, + 538223938223938223, + 537037037037037037, + 535851966075558982, + 534668721109399075, + 533487297921478060, + 532307692307692307, + 531129900076863950, + 529953917050691244, + 528779739063699155, + 527607361963190184, + 526436781609195402, + 525267993874425727, + 524100994644223412, + 522935779816513761, + 521772345301757066, + 520610687022900763, + 519450800915331807, + 518292682926829268, + 517136329017517136, + 515981735159817351, + 514828897338403041, + 513677811550151975, + 512528473804100227, + 511380880121396054, + 510235026535253980, + 509090909090909090, + 507948523845571536, + 506807866868381240, + 505668934240362811, + 504531722054380664, + 503396226415094339, + 502262443438914027, + 501130369253956292, + 500000000000000000, + 499623777276147479, + 498496240601503759, + 497370398196844477, + 496246246246246246, + 495123780945236309, + 494002998500749625, + 492883895131086142, + 491766467065868263, + 490650710545998504, + 489536621823617339, + 488424197162061239, + 487313432835820895, + 486204325130499627, + 485096870342771982, + 483991064780342516, + 482886904761904761, + 481784386617100371, + 480683506686478454, + 479584261321455085, + 478486646884272997, + 477390659747961452, + 476296296296296296, + 475203552923760177, + 474112426035502958, + 473022912047302291, + 471935007385524372, + 470848708487084870, + 469764011799410029, + 468680913780397936, + 467599410898379970, + 466519499632082413, + 465441176470588235, + 464364437913299044, + 463289280469897209, + 462215700660308143, + 461143695014662756, + 460073260073260073, + 459004392386530014, + 457937088514996342, + 456871345029239766, + 455807158509861212, + 454744525547445255, + 453683442742523705, + 452623906705539358, + 451565914056809905, + 450509461426491994, + 449454545454545454, + 448401162790697674, + 447349310094408133, + 446298984034833091, + 445250181290790427, + 444202898550724637, + 443157132512671976, + 442112879884225759, + 441070137382501807, + 440028901734104046, + 438989169675090252, + 437950937950937950, + 436914203316510454, + 435878962536023054, + 434845212383009359, + 433812949640287769, + 432782171099928109, + 431752873563218390, + 430725053840631730, + 429698708751793400, + 428673835125448028, + 427650429799426934, + 426628489620615604, + 425608011444921316, + 424588992137240886, + 423571428571428571, + 422555317630264097, + 421540656205420827, + 420527441197434069, + 419515669515669515, + 418505338078291814, + 417496443812233285, + 416488983653162757, + 415482954545454545, + 414478353442157558, + 413475177304964539, + 412473423104181431, + 411473087818696883, + 410474168435951875, + 409476661951909476, + 408480565371024734, + 407485875706214689, + 406492589978828510, + 405500705218617771, + 404510218463706835, + 403521126760563380, + 402533427163969035, + 401547116736990154, + 400562192550948699, + 399578651685393258, + 398596491228070175, + 397615708274894810, + 396636299929922915, + 395658263305322128, + 394681595521343596, + 393706293706293706, + 392732354996505939, + 391759776536312849, + 390788555478018143, + 389818688981868898, + 388850174216027874, + 387883008356545961, + 386917188587334725, + 385952712100139082, + 384989576094510076, + 384027777777777777, + 383067314365024288, + 382108183079056865, + 381150381150381150, + 380193905817174515, + 379238754325259515, + 378284923928077455, + 377332411886662059, + 376381215469613259, + 375431331953071083, + 374482758620689655, + 373535492763611302, + 372589531680440771, + 371644872677219545, + 370701513067400275, + 369759450171821305, + 368818681318681318, + 367879203843514070, + 366941015089163237, + 366004112405757368, + 365068493150684931, + 364134154688569472, + 363201094391244870, + 362269309637730690, + 361338797814207650, + 360409556313993174, + 359481582537517053, + 358554873892297205, + 357629427792915531, + 356705241660993873, + 355782312925170068, + 354860639021074099, + 353940217391304347, + 353021045485403937, + 352103120759837177, + 351186440677966101, + 350271002710027100, + 349356804333107650, + 348443843031123139, + 347532116294793779, + 346621621621621621, + 345712356515867656, + 344804318488529014, + 343897505057316250, + 342991913746630727, + 342087542087542087, + 341184387617765814, + 340282447881640887, + 339381720430107526, + 338482202820685023, + 337583892617449664, + 336686787391012743, + 335790884718498659, + 334896182183523107, + 334002677376171352, + 333110367892976588, + 332219251336898395, + 331329325317301269, + 330440587449933244, + 329553035356904603, + 328666666666666666, + 327781479013990672, + 326897470039946737, + 326014637391882900, + 325132978723404255, + 324252491694352159, + 323373173970783532, + 322495023224950232, + 321618037135278514, + 320742213386348575, + 319867549668874172, + 318994043679682329, + 318121693121693121, + 317250495703899537, + 316380449141347424, + 315511551155115511, + 314643799472295514, + 313777191825972313, + 312911725955204216, + 312047399605003291, + 311184210526315789, + 310322156476002629, + 309461235216819973, + 308601444517399868, + 307742782152230971, + 306885245901639344, + 306028833551769331, + 305173542894564505, + 304319371727748691, + 303466317854807063, + 302614379084967320, + 301763553233180927, + 300913838120104438, + 300065231572080887, + 299217731421121251, + 298371335504885993, + 297526041666666666, + 296681847755367599, + 295838751625487646, + 294996751137102014, + 294155844155844155, + 293316028552887735, + 292477302204928664, + 291639662994167206, + 290803108808290155, + 289967637540453074, + 289133247089262613, + 288299935358758888, + 287467700258397932, + 286636539703034215, + 285806451612903225, + 284977433913604126, + 284149484536082474, + 283322601416613007, + 282496782496782496, + 281672025723472668, + 280848329048843187, + 280025690430314707, + 279204107830551989, + 278383579217447081, + 277564102564102564, + 276745675848814862, + 275928297055057618, + 275111964171465131, + 274296675191815856, + 273482428115015974, + 272669220945083014, + 271857051691129546, + 271045918367346938, + 270235818992989165, + 269426751592356687, + 268618714194780394, + 267811704834605597, + 267005721551176096, + 266200762388818297, + 265396825396825396, + 264593908629441624, + 263792010145846544, + 262991128010139416, + 262191260291323622, + 261392405063291139, + 260594560404807084, + 259797724399494310, + 259001895135818066, + 258207070707070707, + 257413249211356466, + 256620428751576292, + 255828607435412728, + 255037783375314861, + 254247954688483322, + 253459119496855345, + 252671275927089880, + 251884422110552763, + 251098556183301946, + 250313676286072772, + 249529780564263322, + 248746867167919799, + 247964934251721978, + 247183979974968710, + 246404002501563477, + 245625000000000000, + 245471580262336039, + 244694132334581772, + 243917654398003742, + 243142144638403990, + 242367601246105919, + 241594022415940224, + 240821406347230864, + 240049751243781094, + 239279055313859540, + 238509316770186335, + 237740533829919304, + 236972704714640198, + 236205827650340979, + 235439900867410161, + 234674922600619195, + 233910891089108910, + 233147804576376004, + 232385661310259579, + 231624459542927733, + 230864197530864197, + 230104873534855027, + 229346485819975339, + 228589032655576093, + 227832512315270935, + 227076923076923076, + 226322263222632226, + 225568531038721573, + 224815724815724815, + 224063842848373235, + 223312883435582822, + 222562844880441446, + 221813725490196078, + 221065523576240048, + 220318237454100367, + 219571865443425076, + 218826405867970660, + 218081857055589492, + 217338217338217338, + 216595485051860890, + 215853658536585365, + 215112736136502132, + 214372716199756394, + 213633597078514911, + 212895377128953771, + 212158054711246200, + 211421628189550425, + 210686095931997571, + 209951456310679611, + 209217707701637355, + 208484848484848484, + 207752877044215626, + 207021791767554479, + 206291591046581972, + 205562273276904474, + 204833836858006042, + 204106280193236714, + 203379601689800844, + 202653799758745476, + 201928872814948764, + 201204819277108433, + 200481637567730282, + 199759326113116726, + 199037883343355381, + 198317307692307692, + 197597597597597597, + 196878751500600240, + 196160767846430713, + 195443645083932853, + 194727381665668064, + 194011976047904191, + 193297426690604428, + 192583732057416267, + 191870890615660490, + 191158900836320191, + 190447761194029850, + 189737470167064439, + 189028026237328562, + 188319427890345649, + 187611673615247170, + 186904761904761904, + 186198691255205234, + 185493460166468489, + 184789067142008318, + 184085510688836104, + 183382789317507418, + 182680901542111506, + 181979845880260818, + 181279620853080568, + 180580224985198342, + 179881656804733727, + 179183914843287995, + 178486997635933806, + 177790903721204961, + 177095631641086186, + 176401179941002949, + 175707547169811320, + 175014731879787860, + 174322732626619552, + 173631547969393761, + 172941176470588235, + 172251616696061140, + 171562867215041128, + 170874926600117439, + 170187793427230046, + 169501466275659824, + 168815943728018757, + 168131224370240187, + 167447306791569086, + 166764189584552369, + 166081871345029239, + 165400350672121566, + 164719626168224299, + 164039696438995913, + 163360560093348891, + 162682215743440233, + 162004662004662004, + 161327897495631916, + 160651920838183934, + 159976730657358929, + 159302325581395348, + 158628704241719930, + 157955865272938443, + 157283807312826465, + 156612529002320185, + 155942028985507246, + 155272305909617612, + 154603358425014475, + 153935185185185185, + 153267784846732215, + 152601156069364161, + 151935297515886770, + 151270207852193995, + 150605885747259088, + 149942329873125720, + 149279538904899135, + 148617511520737327, + 147956246401842256, + 147295742232451093, + 146635997699827487, + 145977011494252873, + 145318782309017805, + 144661308840413318, + 144004589787722317, + 143348623853211009, + 142693409742120343, + 142038946162657502, + 141385231825987406, + 140732265446224256, + 140080045740423098, + 139428571428571428, + 138777841233580810, + 138127853881278538, + 137478608100399315, + 136830102622576966, + 136182336182336182, + 135535307517084282, + 134889015367103016, + 134243458475540386, + 133598635588402501, + 132954545454545454, + 132311186825667234, + 131668558456299659, + 131026659103800340, + 130385487528344671, + 129745042492917847, + 129105322763306908, + 128466327108092812, + 127828054298642533, + 127190503109101187, + 126553672316384180, + 125917560700169395, + 125282167042889390, + 124647490129723632, + 124013528748590755, + 123380281690140845, + 122747747747747747, + 122115925717501406, + 121484814398200224, + 120854412591343451, + 120224719101123595, + 119595732734418865, + 118967452300785634, + 118339876612450925, + 117713004484304932, + 117086834733893557, + 116461366181410974, + 115836597649692221, + 115212527964205816, + 114589155953046394, + 113966480446927374, + 113344500279173646, + 112723214285714285, + 112102621305075292, + 111482720178372352, + 110863509749303621, + 110244988864142538, + 109627156371730662, + 109010011123470522, + 108393551973318510, + 107777777777777777, + 107162687395891171, + 106548279689234184, + 105934553521907931, + 105321507760532150, + 104709141274238227, + 104097452934662236, + 103486441615938018, + 102876106194690265, + 102266445550027639, + 101657458563535911, + 101049144119271120, + 100441501103752759, + 99834528405956977, + 99228224917309812, + 98622589531680440, + 98017621145374449, + 97413318657127132, + 96809680968096809, + 96206706981858163, + 95604395604395604, + 95002745744096650, + 94401756311745334, + 93801426220515633, + 93201754385964912, + 92602739726027397, + 92004381161007667, + 91406677613574165, + 90809628008752735, + 90213231273920174, + 89617486338797814, + 89022392135445111, + 88427947598253275, + 87834151663938897, + 87241003271537622, + 86648501362397820, + 86056644880174291, + 85465432770821992, + 84874863982589771, + 84284937466014138, + 83695652173913043, + 83107007061379684, + 82519001085776330, + 81931633206728160, + 81344902386117136, + 80758807588075880, + 80173347778981581, + 79588521927449918, + 79004329004329004, + 78420767982693347, + 77837837837837837, + 77255537547271745, + 76673866090712742, + 76092822450080949, + 75512405609492988, + 74932614555256064, + 74353448275862068, + 73774905761981690, + 73196986006458557, + 72619688004303388, + 72043010752688172, + 71466953250940354, + 70891514500537056, + 70316693505099302, + 69742489270386266, + 69168900804289544, + 68595927116827438, + 68023567220139260, + 67451820128479657, + 66880684858212948, + 66310160427807486, + 65740245857830037, + 65170940170940170, + 64602242391884676, + 64034151547491995, + 63466666666666666, + 62899786780383795, + 62333510921683537, + 61767838125665601, + 61202767429483767, + 60638297872340425, + 60074428495481127, + 59511158342189160, + 58948486457780138, + 58386411889596602, + 57824933687002652, + 57264050901378579, + 56703762586115527, + 56144067796610169, + 55584965590259396, + 55026455026455026, + 54468535166578529, + 53911205073995771, + 53354463814051769, + 52798310454065469, + 52242744063324538, + 51687763713080168, + 51133368476541908, + 50579557428872497, + 50026329647182727, + 49473684210526315, + 48921620199894792, + 48370136698212407, + 47819232790331056, + 47268907563025210, + 46719160104986876, + 46169989506820566, + 45621394861038280, + 45073375262054507, + 44525929806181246, + 43979057591623036, + 43432757718472004, + 42887029288702928, + 42341871406168322, + 41797283176593521, + 41253263707571801, + 40709812108559498, + 40166927490871152, + 39624608967674661, + 39082855653986451, + 38541666666666666, + 38001041124414367, + 37460978147762747, + 36921476859074362, + 36382536382536382, + 35844155844155844, + 35306334371754932, + 34769071094966268, + 34232365145228215, + 33696215655780196, + 33160621761658031, + 32625582599689280, + 32091097308488612, + 31557165028453181, + 31023784901758014, + 30490956072351421, + 29958677685950413, + 29426948890036138, + 28895768833849329, + 28365136668385765, + 27835051546391752, + 27305512622359608, + 26776519052523171, + 26248069994853319, + 25720164609053497, + 25192802056555269, + 24665981500513874, + 24139702105803800, + 23613963039014373, + 23088763468445356, + 22564102564102564, + 22039979497693490, + 21516393442622950, + 20993343573988735, + 20470829068577277, + 19948849104859335, + 19427402862985685, + 18906489524782830, + 18386108273748723, + 17866258295048494, + 17346938775510204, + 16828148903620601, + 16309887869520897, + 15792154865002547, + 15274949083503054, + 14758269720101781, + 14242115971515768, + 13726487036095577, + 13211382113821138, + 12696800406297613, + 12182741116751269, + 11669203450025367, + 11156186612576064, + 10643689812468322, + 10131712259371833, + 9620253164556962, + 9109311740890688, + 8598887202832574, + 8088978766430738, + 7579585649317837, + 7070707070707070, + 6562342251388187, + 6054490413723511, + 5547150781643973, + 5040322580645161, + 4534005037783375, + 4028197381671701, + 3522898842476094, + 3018108651911468, + 2513826043237807, + 2010050251256281, + 1506780512305374, + 1004016064257028, + 501756146512794 + ] + }, + "continued": { + "": [ + 334001336005344021, + 333110814419225634, + 332221480987324883, + 331333333333333333, + 330446369087275149, + 329560585885486018, + 328675981370592149, + 327792553191489361, + 326910299003322259, + 326029216467463479, + 325149303251493032, + 324270557029177718, + 323392975480450629, + 322516556291390728, + 321641297154202514, + 320767195767195767, + 319894249834765366, + 319022457067371202, + 318151815181518151, + 317282321899736147, + 316413974950560316, + 315546772068511198, + 314680710994075049, + 313815789473684210, + 312952005259697567, + 312089356110381077, + 311227839789888378, + 310367454068241469, + 309508196721311475, + 308650065530799475, + 307793058284217419, + 306937172774869109, + 306082406801831262, + 305228758169934640, + 304376224689745264, + 303524804177545691, + 302674494455316373, + 301825293350717079, + 300977198697068403, + 300130208333333333, + 299284320104098893, + 298439531859557867, + 297595841455490578, + 296753246753246753, + 295911745619727449, + 295071335927367055, + 294232015554115359, + 293393782383419689, + 292556634304207119, + 291720569210866752, + 290885585003232062, + 290051679586563307, + 289218850871530019, + 288387096774193548, + 287556415215989684, + 286726804123711340, + 285898261429491307, + 285070785070785070, + 284244372990353697, + 283419023136246786, + 282594733461785484, + 281771501925545571, + 280949326491340602, + 280128205128205128, + 279308135810377962, + 278489116517285531, + 277671145233525271, + 276854219948849104, + 276038338658146964, + 275223499361430395, + 274409700063816209, + 273596938775510204, + 272785213511790949, + 271974522292993630, + 271164863144493952, + 270356234096692111, + 269548633184996821, + 268742058449809402, + 267936507936507936, + 267131979695431472, + 266328471781864299, + 265525982256020278, + 264724509183027232, + 263924050632911392, + 263124604680581910, + 262326169405815423, + 261528742893240682, + 260732323232323232, + 259936908517350157, + 259142496847414880, + 258349086326402016, + 257556675062972292, + 256765261170547514, + 255974842767295597, + 255185417976115650, + 254396984924623115, + 253609541745134965, + 252823086574654956, + 252037617554858934, + 251253132832080200, + 250469630557294927, + 249687108886107634, + 248905565978736710, + 248125000000000000, + 247970018738288569, + 247191011235955056, + 246412975670617592, + 245635910224438902, + 244859813084112149, + 244084682440846824, + 243310516490354698, + 242537313432835820, + 241765071472964574, + 240993788819875776, + 240223463687150837, + 239454094292803970, + 238685678859268443, + 237918215613382899, + 237151702786377708, + 236386138613861386, + 235621521335807050, + 234857849196538936, + 234095120444718962, + 233333333333333333, + 232572486119679210, + 231812577065351418, + 231053604436229205, + 230295566502463054, + 229538461538461538, + 228782287822878228, + 228027043638598647, + 227272727272727272, + 226519337016574585, + 225766871165644171, + 225015328019619865, + 224264705882352941, + 223515003061849357, + 222766217870257037, + 222018348623853211, + 221271393643031784, + 220525351252290775, + 219780219780219780, + 219035997559487492, + 218292682926829268, + 217550274223034734, + 216808769792935444, + 216068167985392574, + 215328467153284671, + 214589665653495440, + 213851761846901579, + 213114754098360655, + 212378640776699029, + 211643420254699818, + 210909090909090909, + 210175651120533010, + 209443099273607748, + 208711433756805807, + 207980652962515114, + 207250755287009063, + 206521739130434782, + 205793602896801448, + 205066344993968636, + 204339963833634719, + 203614457831325301, + 202889825406381697, + 202166064981949458, + 201443174984966927, + 200721153846153846, + 200000000000000000, + 199879951980792316, + 199160167966406718, + 198441247002398081, + 197723187537447573, + 197005988023952095, + 196289646918013165, + 195574162679425837, + 194859533771667662, + 194145758661887694, + 193432835820895522, + 192720763723150357, + 192009540846750149, + 191299165673420738, + 190589636688505062, + 189880952380952380, + 189173111243307555, + 188466111771700356, + 187759952465834818, + 187054631828978622, + 186350148367952522, + 185646500593119810, + 184943687018375815, + 184241706161137440, + 183540556542332741, + 182840236686390532, + 182140745121230041, + 181442080378250591, + 180744240992321323, + 180047225501770956, + 179351032448377581, + 178655660377358490, + 177961107837360047, + 177267373380447585, + 176574455562095350, + 175882352941176470, + 175191064079952968, + 174500587544065804, + 173810921902524955, + 173122065727699530, + 172434017595307917, + 171746776084407971, + 171060339777387229, + 170374707259953161, + 169689877121123464, + 169005847953216374, + 168322618351841028, + 167640186915887850, + 166958552247518972, + 166277712952158693, + 165597667638483965, + 164918414918414918, + 164239953407105416, + 163562281722933643, + 162885398487492728, + 162209302325581395, + 161533991865194654, + 160859465737514518, + 160185722576900754, + 159512761020881670, + 158840579710144927, + 158169177288528389, + 157498552403011001, + 156828703703703703, + 156159629843840370, + 155491329479768786, + 154823801270941652, + 154157043879907621, + 153491055972302365, + 152825836216839677, + 152161383285302593, + 151497695852534562, + 150834772596430627, + 150172612197928653, + 149511213341000575, + 148850574712643678, + 148190695002871912, + 147531572904707233, + 146873207114170969, + 146215596330275229, + 145558739255014326, + 144902634593356242, + 144247281053234115, + 143592677345537757, + 142938822184105202, + 142285714285714285, + 141633352370074243, + 140981735159817351, + 140330861380490587, + 139680729760547320, + 139031339031339031, + 138382687927107061, + 137734775184974388, + 137087599544937428, + 136441159749857873, + 135795454545454545, + 135150482680295286, + 134506242905788876, + 133862733976176971, + 133219954648526077, + 132577903682719546, + 131936579841449603, + 131295981890209394, + 130656108597285067, + 130016958733747880, + 129378531073446327, + 128740824392998306, + 128103837471783295, + 127467569091934574, + 126832018038331454, + 126197183098591549, + 125563063063063063, + 124929656724817107, + 124296962879640044, + 123664980326025857, + 123033707865168539, + 122403144300954519, + 121773288439955106, + 121144139091418956, + 120515695067264573, + 119887955182072829, + 119260918253079507, + 118634583100167879, + 118008948545861297, + 117384013415315818, + 116759776536312849, + 116136236739251814, + 115513392857142857, + 114891243725599553, + 114269788182831661, + 113649025069637883, + 113028953229398663, + 112409571508069003, + 111790878754171301, + 111172873818788215, + 110555555555555555, + 109938922820655191, + 109322974472807991, + 108707709373266777, + 108093126385809312, + 107479224376731301, + 106866002214839424, + 106253458771444382, + 105641592920353982, + 105030403537866224, + 104419889502762430, + 103810049696300386, + 103200883002207505, + 102592388306674020, + 101984564498346196, + 101377410468319559, + 100770925110132158, + 100165107319757842, + 99559955995599559, + 98955470038482682, + 98351648351648351, + 97748489840746842, + 97145993413830954, + 96544157981349424, + 95942982456140350, + 95342465753424657, + 94742606790799561, + 94143404488232074, + 93544857768052516, + 92946965554948059, + 92349726775956284, + 91753140360458765, + 91157205240174672, + 90561920349154391, + 89967284623773173, + 89373297002724795, + 88779956427015250, + 88187261839956450, + 87595212187159956, + 87003806416530723, + 86413043478260869, + 85822922324823465, + 85233441910966340, + 84644601193705914, + 84056399132321041, + 83468834688346883, + 82881906825568797, + 82295614510016242, + 81709956709956709, + 81124932395889670, + 80540540540540540, + 79956780118854673, + 79373650107991360, + 78791149487317862, + 78209277238403451, + 77628032345013477, + 77047413793103448, + 76467420570813139, + 75888051668460710, + 75309306078536847, + 74731182795698924, + 74153680816765180, + 73576799140708915, + 73000536768652710, + 72424892703862660, + 71849865951742627, + 71275455519828510, + 70701660417782538, + 70128479657387580, + 69555912252541466, + 68983957219251336, + 68412613575628006, + 67841880341880341, + 67271756540309663, + 66702241195304162, + 66133333333333333, + 65565031982942430, + 64997336174746936, + 64430244941427050, + 63863757317722192, + 63297872340425531, + 62732589048378522, + 62167906482465462, + 61603823685608072, + 61040339702760084, + 60477453580901856, + 59915164369034994, + 59353471118177000, + 58792372881355932, + 58231868713605082, + 57671957671957671, + 57112638815441565, + 56553911205073995, + 55995773903856312, + 55438225976768743, + 54881266490765171, + 54324894514767932, + 53769109119662625, + 53213909378292939, + 52659294365455502, + 52105263157894736, + 51551814834297738, + 50998948475289169, + 50446663163426169, + 49894957983193277, + 49343832020997375, + 48793284365162644, + 48243314105925537, + 47693920335429769, + 47145102147721320, + 46596858638743455, + 46049188906331763, + 45502092050209205, + 44955567171981181, + 44409613375130616, + 43864229765013054, + 43319415448851774, + 42775169535732916, + 42231491136600625, + 41688379364252214, + 41145833333333333, + 40603852160333159, + 40062434963579604, + 39521580863234529, + 38981288981288981, + 38441558441558441, + 37902388369678089, + 37363777893098079, + 36825726141078838, + 36288232244686365, + 35751295336787564, + 35214914552045572, + 34679089026915113, + 34143817899637868, + 33609100310237849, + 33074935400516795, + 32541322314049586, + 32008260196179659, + 31475748194014447, + 30943785456420835, + 30412371134020618, + 29881504379185986, + 29351184346035015, + 28821410190427174, + 28292181069958847, + 27763496143958868, + 27235354573484069, + 26707755521314843, + 26180698151950718, + 25654181631605951, + 25128205128205128, + 24602767811378780, + 24077868852459016, + 23553507424475166, + 23029682702149437, + 22506393861892583, + 21983640081799591, + 21461420541645375, + 20939734422880490, + 20418580908626850, + 19897959183673469, + 19377868434472208, + 18858307849133537, + 18339276617422312, + 17820773930753564, + 17302798982188295, + 16785350966429298, + 16268429079816980, + 15752032520325203, + 15236160487557135, + 14720812182741116, + 14205986808726534, + 13691683569979716, + 13177901672579827, + 12664640324214792, + 12151898734177215, + 11639676113360323, + 11127971674253920, + 10616784630940343, + 10106114199090449, + 9595959595959595, + 9086320040383644, + 8577194752774974, + 8068582955118507, + 7560483870967741, + 7052896725440806, + 6545820745216515, + 6039255158530447, + 5533199195171026, + 5027652086475615, + 4522613065326633, + 4018081366147664, + 3514056224899598, + 3010536879076768, + 2507522567703109, + 2005012531328320, + 1503006012024048, + 1001502253380070, + 500500500500500, + 500250125062531, + 500000000000000, + 499750124937531, + 499500499500499, + 499251123315027, + 499001996007984, + 498753117206982, + 498504486540378, + 498256103637269 + ] + } +} \ No newline at end of file diff --git a/src/test/integration/params.toml b/src/test/integration/params.toml new file mode 100644 index 0000000000..5f4b9310c9 --- /dev/null +++ b/src/test/integration/params.toml @@ -0,0 +1,12 @@ +printLast = 5 +printEvery = 1 +writeJSON = 0 + +prevDepositShares = 496 +iterations = 0 + +startDSF = 1000000000000000000 +startShares = 1 +startSharesToAdd = 2 +maxMagDecrease = 0 +contIterations = 3 \ No newline at end of file diff --git a/src/test/integration/plot.py b/src/test/integration/plot.py new file mode 100644 index 0000000000..990aa36a54 --- /dev/null +++ b/src/test/integration/plot.py @@ -0,0 +1,60 @@ +import json +import matplotlib.pyplot as plt +import matplotlib.ticker as ticker + +# Load data from JSON file +with open('iterations.json', 'r') as f: + data = json.load(f) + +# Compute percent decreases +percent_drops = [(data[i - 1] - data[i]) / data[i - 1] * 100 for i in range(1, len(data))] +x_values = list(range(1, len(data))) + +# Plotting +plt.figure(figsize=(10, 6)) +plt.plot(x_values, percent_drops, marker='o', linestyle='-', markersize=1) + +# Labels and title +plt.xlabel('iterations') +plt.ylabel('% decrease in DSF') +plt.title('Percent Decrease in DSF per Iteration') +plt.grid(True) + +cliff_index = 1000 # replace with actual index where plateau begins +dsf_value = data[cliff_index] + +# Format DSF in scientific notation +dsf_label = f'{dsf_value:.2e}' + +plt.axvline(x=cliff_index, color='red', linestyle='--', label=f'Cliff @ {cliff_index}') + +# Add vertical red text along the line +plt.text( + x=cliff_index + 2, # slight offset to avoid overlapping the line + y=max(percent_drops) * 0.9, # place vertically near the top + s=dsf_label, + color='red', + rotation=-90, + va='center', + ha='left', + fontsize=10, + bbox=dict(facecolor='white', edgecolor='red', boxstyle='round,pad=0.3') +) + +# Annotate iteration number at bottom +plt.text( + x=cliff_index, + y=-0.005, # a bit below the X-axis; tweak if needed + s=f'i = {cliff_index}', + color='red', + rotation=0, + va='top', + ha='center', + fontsize=7, + fontweight='bold', + transform=plt.gca().get_xaxis_transform() +) + +# Save the plot +plt.tight_layout() +plt.savefig('dsf_percent_deltas_plot4.png', dpi=300) diff --git a/src/test/integration/plot2.py b/src/test/integration/plot2.py new file mode 100644 index 0000000000..44ec98a4b3 --- /dev/null +++ b/src/test/integration/plot2.py @@ -0,0 +1,102 @@ +import json +import matplotlib.pyplot as plt +import matplotlib.ticker as ticker + +# Load data +with open('iterations2.json', 'r') as f: + data = json.load(f) + +x_values = [] +percent_drops = [] + +# Set up the figure before we draw vertical lines +plt.figure(figsize=(10, 6)) + +# Collect percent drops (skip increases) and draw red lines for increases +for i in range(1, len(data)): + if data[i] <= data[i - 1]: + drop = (data[i - 1] - data[i]) / data[i - 1] * 100 + percent_drops.append(drop) + x_values.append(i) + else: + # DSF increased — draw vertical red line and annotate + plt.axvline(x=i, color='red', linestyle='--', linewidth=2) + + prev_dsf = f'{data[i - 1]:.2e}' + new_dsf = f'{data[i]:.2e}' + label = f'{prev_dsf} → {new_dsf}' + + plt.text( + x=i + 2, + y=50*0.75, # temporary value, updated after max_drop is known + s=label, + color='red', + rotation=-90, + va='center', + ha='left', + fontsize=8, + bbox=dict(facecolor='white', edgecolor='red', boxstyle='round,pad=0.3'), + ) + + # Annotate iteration number at bottom + plt.text( + x=i, + y=-0.005, # a bit below the X-axis; tweak if needed + s=f'i = {i}', + color='red', + rotation=0, + va='top', + ha='center', + fontsize=7, + fontweight='bold', + transform=plt.gca().get_xaxis_transform() + ) + +# Plot the valid percent drops +plt.plot(x_values, percent_drops, marker='o', linestyle='-', markersize=1) + +# Axis labels and title +plt.xlabel('iterations') +plt.ylabel('% decrease in DSF') +plt.title('Percent Decrease in DSF per Iteration') +plt.grid(True) + +# Set Y-axis limit to max % decrease +max_drop = max(percent_drops) +plt.ylim(0, max_drop * 1.05) # 5% padding + +# Optional: highlight a known cliff +cliff_index = 1003 +dsf_value = data[cliff_index] +dsf_label = f'{dsf_value:.2e}' + +plt.axvline(x=cliff_index, color='red', linestyle='--', label=f'Cliff @ {cliff_index}') +plt.text( + x=cliff_index + 2, + y=max_drop * 0.75, + s=dsf_label, + color='red', + rotation=-90, + va='center', + ha='left', + fontsize=10, + bbox=dict(facecolor='white', edgecolor='red', boxstyle='round,pad=0.3') +) + +# Annotate iteration number at bottom +plt.text( + x=i, + y=-0.005, # a bit below the X-axis; tweak if needed + s=f'i = {cliff_index}', + color='red', + rotation=0, + va='top', + ha='center', + fontsize=7, + fontweight='bold', + transform=plt.gca().get_xaxis_transform() +) + +# Save plot +plt.tight_layout() +plt.savefig('dsf_percent_deltas_plot3.png', dpi=300) diff --git a/src/test/integration/tests/RoundingDeallocation.t.sol b/src/test/integration/tests/RoundingDeallocation.t.sol new file mode 100644 index 0000000000..074a78349b --- /dev/null +++ b/src/test/integration/tests/RoundingDeallocation.t.sol @@ -0,0 +1,609 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "@openzeppelin/contracts/utils/math/Math.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import "src/test/integration/IntegrationChecks.t.sol"; + +/// Not sure this test is actually useful, mostly used this to play around with the numbers. +/// The conclusion is self-evident from the replicated math... +contract Integration_Rounding_Deallocation is IntegrationCheckUtils { + + using ArrayLib for *; + using StdStyle for *; + using Strings for *; + using Math for *; + + struct Magnitude { + uint64 max; + uint64 cur; + uint64 available; + uint64 pendDealloc; + } + + enum ValueMod { + SUB, + NONE, + ADD + } + + struct Slash { + uint8 mantissa; + uint8 exponent; + ValueMod vMod; + } + + Magnitude mag; + Slash slash; + + using SlashingLib for *; + + DepositScalingFactor dsf; + + function test_DSF_Manip(uint scalingFactor, uint prevDepositShares, uint addedShares, uint slashingFactor) public rand(0) { + scalingFactor = bound(scalingFactor, 1, WAD); + prevDepositShares = bound(prevDepositShares, 0, uint(type(uint8).max)); + addedShares = bound(addedShares, 0, uint(type(uint8).max)); + slashingFactor = bound(slashingFactor, 1, 1e18); + + dsf._scalingFactor = scalingFactor; + // prevDepositShares = 2; + // addedShares = 2; + // slashingFactor = 628157962353078290; + + console.log("WAD: ", uint(1e18)); + console.log("PrevDepositShares: ", prevDepositShares); + console.log("AddedShares: ", addedShares); + console.log("slashingFactor: ", slashingFactor); + console.log("scalingFactor: ", dsf._scalingFactor); + + dsf.update(prevDepositShares, addedShares, slashingFactor); + + console.log("newScalingFactor: ", dsf._scalingFactor); + + assertTrue(dsf._scalingFactor >= scalingFactor, "scalingFactor decreased!"); + assertTrue(dsf._scalingFactor != 0, "scalingFactor hit 0!"); + } + + struct DSFState { + DepositScalingFactor dsf; + uint prevScalingFactor; + uint operatorMaxMag; + uint prevDepositShares; + uint addedShares; + } + + DSFState state; + DepositScalingFactor dummy; + + bool writeJSON = false; + + function _init() internal override { + string memory tomlRAW = cheats.readFile("src/test/integration/params.toml"); + + printLast = cheats.parseTomlUint(tomlRAW, ".printLast"); + printEvery = cheats.parseTomlUint(tomlRAW, ".printEvery"); + writeJSON = cheats.parseTomlUint(tomlRAW, ".writeJSON") == 1; + console.log("Printing final %d inputs", printLast); + console.log("Printing other inputs every %d iterations", printEvery); + console.log("Writing to file: %s", writeJSON ? "true" : "false"); + } + + uint[] DSFs; + + function test_DSF_DownToZero() public rand(0) { + (uint prevDepositShares, uint iterations) = _readTOML(); + finalIteration = iterations; + + console.log("Start Balance: %s (%d)", _pretty(prevDepositShares), prevDepositShares); + console.log("Iterations: %d", iterations); + + state.dsf._scalingFactor = WAD; + state.prevScalingFactor = state.dsf._scalingFactor; + state.operatorMaxMag = WAD-1; + state.addedShares = 1; + state.prevDepositShares = prevDepositShares; + + for (uint i = 0; i < iterations; i++) { + _print(i); + + state.prevScalingFactor = state.dsf._scalingFactor; + + state.dsf.update({ + prevDepositShares: state.prevDepositShares, + addedShares: state.addedShares, + slashingFactor: state.operatorMaxMag + }); + + DSFs.push(state.dsf._scalingFactor); + + state.prevDepositShares += state.addedShares; + } + + _print(iterations); + _writeJSON(".DTZ"); + + revert(); + } + + function test_DSF_FindOptimalIterations() public rand(0) { + ( + uint startDSF, + uint startShares, + uint startIteration, + uint contIterations + ) = _readFindContinuationTOML(); + finalIteration = startIteration + contIterations; + // printInputs = true; + + console.log("Start Balance: %s (%d)", _pretty(startShares), startShares); + // console.log("Iterations: %d", iterations); + + state.dsf._scalingFactor = startDSF; + state.prevScalingFactor = startDSF; + state.operatorMaxMag = WAD-1; + state.addedShares = 1; + state.prevDepositShares = startShares; + + for (uint i = startIteration; i < finalIteration; i++) { + _print(i); + + state.prevScalingFactor = state.dsf._scalingFactor; + + state.dsf.update({ + prevDepositShares: state.prevDepositShares, + addedShares: state.addedShares, + slashingFactor: state.operatorMaxMag + }); + + // if (i + 1 == 104) printInputs = true; + + // Iterate until decrease is around 50% + uint scaledDecrease = 1e5 - ((1e5 * state.dsf._scalingFactor) / state.prevScalingFactor); + if (scaledDecrease >= 49e3) { + console.log("Peak found at %d iterations!".green().bold(), i+1); + printInputs = true; + finalIteration = i + printLast; + } + + state.prevDepositShares += state.addedShares; + } + + _print(finalIteration); + + revert(); + } + + function test_DSF_ContinueIteration() public rand(0) { + ( + uint startDSF, + uint startShares, + uint startSharesToAdd, + uint maxMagDecrease, + uint startIteration, + uint contIterations + ) = _readContinueTOML(); + + { + state.dsf._scalingFactor = startDSF; + state.prevScalingFactor = startDSF; + state.operatorMaxMag = WAD - 1; + + // console.log("operatorMaxMag: %s (%d)", _pretty(state.operatorMaxMag), state.operatorMaxMag); + + state.prevDepositShares = startShares; + state.addedShares = startSharesToAdd; + console.log("prevDepositShares: %d", state.prevDepositShares); + + printInputs = true; + finalIteration = startIteration + contIterations; + } + + state.dsf.update({ + prevDepositShares: state.prevDepositShares, + addedShares: state.addedShares, + slashingFactor: state.operatorMaxMag + }); + + DSFs.push(state.dsf._scalingFactor); + + console.log("prevDepositShares: %d", state.prevDepositShares); + state.prevDepositShares += state.addedShares; + state.operatorMaxMag -= maxMagDecrease; + + bool peakFound; + for (uint i = startIteration; i < startIteration+contIterations; i++) { + _print(i); + if (peakFound) printInputs = false; + + state.addedShares = 1; + state.prevScalingFactor = state.dsf._scalingFactor; + + console.log("prevDepositShares: %d", state.prevDepositShares); + + state.dsf.update({ + prevDepositShares: state.prevDepositShares, + addedShares: state.addedShares, + slashingFactor: state.operatorMaxMag + }); + + DSFs.push(state.dsf._scalingFactor); + + // Print inputs until peak is found, then stop printing inputs + uint scaledDecrease = 1e5 - ((1e5 * state.dsf._scalingFactor) / state.prevScalingFactor); + if (scaledDecrease >= 49e3) { + console.log("Peak found at %d iterations".green().dim(), i+1); + peakFound = true; + } + + state.prevDepositShares += state.addedShares; + } + + _print(startIteration+contIterations); + _writeJSON(".continued"); + revert(); + } + + function _readTOML() internal returns (uint, uint) { + string memory tomlRAW = cheats.readFile("src/test/integration/params.toml"); + + return ( + cheats.parseTomlUint(tomlRAW, ".prevDepositShares"), + cheats.parseTomlUint(tomlRAW, ".iterations") + ); + } + + function _readFindContinuationTOML() internal returns (uint, uint, uint, uint) { + string memory tomlRAW = cheats.readFile("src/test/integration/params.toml"); + + return ( + cheats.parseTomlUint(tomlRAW, ".startDSF"), + cheats.parseTomlUint(tomlRAW, ".startShares"), + cheats.parseTomlUint(tomlRAW, ".iterations") + 1, + cheats.parseTomlUint(tomlRAW, ".contIterations") + ); + } + + function _readContinueTOML() internal returns (uint, uint, uint, uint, uint, uint) { + string memory tomlRAW = cheats.readFile("src/test/integration/params.toml"); + + return ( + cheats.parseTomlUint(tomlRAW, ".startDSF"), + cheats.parseTomlUint(tomlRAW, ".startShares"), + cheats.parseTomlUint(tomlRAW, ".startSharesToAdd"), + cheats.parseTomlUint(tomlRAW, ".maxMagDecrease"), + cheats.parseTomlUint(tomlRAW, ".iterations") + 1, + cheats.parseTomlUint(tomlRAW, ".contIterations") + ); + } + + function _writeJSON(string memory arrKey) internal { + if (!writeJSON) return; + + string memory outputJSON = cheats.serializeUint("", "", DSFs); + + cheats.writeJson(outputJSON, "src/test/integration/output.json", arrKey); + } + + /// Minimum: + /// + /// DSF: 999000999000999 + /// operatorMaxMag: 999999999999999999 + /// depositShares: 1001 + + /// Deposit-only method: + /// + /// numDeposits: 1000 + /// - optimalStart: 993 + /// - final DSF: 5.01e14 (501756146512794) + /// + /// numDeposits: 2000 + /// - optimalStart: 1993 + /// - final DSF: 2.50e14 (250438266967192) + /// + /// numDeposits: 3000 + /// - optimalStart: 2989 + /// - final DSF: 1.67e14 (166944908180300) + /// + /// numDeposits: 4000 + /// - optimalStart: 3989 + /// - final DSF: 1.25e14 (125172111653523) + + function test_DSF_SpecificUpdate() public rand(0) { + dummy._scalingFactor = 1; + dummy.update({ + prevDepositShares: WAD, + addedShares: 1, + slashingFactor: 1e18 - 1 + }); + + console.log("finalDSF: %s (%d)", _pretty(dummy._scalingFactor), dummy._scalingFactor); + assertTrue(dummy._scalingFactor != 0, "found 0"); + } + + uint finalIteration = type(uint).max; + uint printLast = 3; + uint printEvery = 100; + bool printInputs = false; + + function _print(uint iter) internal { + // print every 100 iterations, but also print the final 20 iterations + if (!printInputs && iter % printEvery != 0) { + if (printLast <= finalIteration && iter < finalIteration - printLast) { + return; + } + } + + // if (!printInputs && iter % 10000000 != 0 && iter < finalIteration - printLast) return; + + console.log("(%d)".dim(), iter); + + // if (printInputs || iter > finalIteration - printLast) { + if (true) { + console.log("==Inputs==".yellow()); + // console.log(" - prevDepositShares: %d".dim(), state.prevDepositShares - state.addedShares); + console.log(" - prevDepositShares: %d".dim(), state.prevDepositShares); + console.log(" - addedShares: %d".dim(), state.addedShares); + console.log(" - prevDSF: %s (%d)".dim(), _pretty(state.prevScalingFactor), state.prevScalingFactor); + + { + console.log("=currentShares=".yellow().dim()); + + // uint pDS = state.prevDepositShares - state.addedShares; + uint pDS = state.prevDepositShares; + uint pDSMulDSF = pDS * state.prevScalingFactor; + uint numerator = pDS.mulWad(state.prevScalingFactor) * state.operatorMaxMag; + uint currentShares = pDS.mulWad(state.prevScalingFactor).mulWad(state.operatorMaxMag); + + console.log(" - prevDepositShares*DSF: %s (%d)".dim(), _pretty(pDSMulDSF), pDSMulDSF); + console.log(" - numerator: %s (%d)".dim(), _pretty(numerator), numerator); + console.log(" - currentShares: %d".dim(), currentShares); + } + + console.log("=newDSF=".yellow().dim()); + } + + // uint totalDepositShares = state.prevDepositShares + state.addedShares; + // uint totalWithdrawable = state.dsf.calcWithdrawable(totalDepositShares, state.operatorMaxMag); + // console.log(" - totalDepositShares: %d", totalDepositShares); + // console.log(" - totalWithdrawable: %d", totalWithdrawable); + + // console.log(" - operatorMaxMag: %s (%d)", _pretty(state.operatorMaxMag), state.operatorMaxMag); + if (state.dsf._scalingFactor < 1e15) { + console.log( + " - DSF: %s (%d)".yellow(), + _pretty(state.dsf._scalingFactor), + state.dsf._scalingFactor + ); + } else if (state.dsf._scalingFactor < 1e12) { + console.log( + " - DSF: %s (%d)".red(), + _pretty(state.dsf._scalingFactor), + state.dsf._scalingFactor + ); + } else { + console.log( + " - DSF: %s (%d)".green(), + _pretty(state.dsf._scalingFactor), + state.dsf._scalingFactor + ); + } + + if (state.prevScalingFactor < state.dsf._scalingFactor) { + uint increase = state.dsf._scalingFactor - state.prevScalingFactor; + + console.log( + " -- increase: %s (%s)".green().dim(), + _prettyPerc({_old: state.dsf._scalingFactor, _new: state.prevScalingFactor}), + _pretty(increase) + ); + } else if (state.prevScalingFactor == state.dsf._scalingFactor) { + console.log(" -- no change".yellow().dim()); + } else { + uint decrease = state.prevScalingFactor - state.dsf._scalingFactor; + + console.log( + " -- decrease: %s (%s)".red().dim(), + _prettyPerc({_new: state.dsf._scalingFactor, _old: state.prevScalingFactor}), + _pretty(decrease) + ); + } + + // console.log(" - 1 WAD: %s (%d)".dim(), _pretty(WAD), WAD); + } + + /// Expresses a % decrease with 3 decimals; e.g: 99.999% + function _prettyPerc(uint _new, uint _old) internal view returns (string memory) { + // Scale by 1e5 so we can extract 3 decimals (e.g. 99999 = 99.999%) + uint scaled = 1e5 - ((1e5 * _new) / _old); + + uint whole = scaled / 1000; // 99 + uint decimal = scaled % 1000; // 999 + + // Pad decimal to 3 digits + string memory paddedDecimal; + if (decimal < 10) { + paddedDecimal = string(abi.encodePacked("00", decimal.toString())); + } else if (decimal < 100) { + paddedDecimal = string(abi.encodePacked("0", decimal.toString())); + } else { + paddedDecimal = decimal.toString(); + } + + return string( + abi.encodePacked( + whole.toString(), ".", + paddedDecimal, "%" + ) + ); + } + + // pretty print a wad-based value, e.g. "4.23e17" + function _pretty(uint value) internal view returns (string memory) { + if (value == 0) { + return "0.00e0"; + } + + uint temp = value; + uint digits = 0; + while (temp >= 10) { + temp /= 10; + digits++; + } + + // Extract first 5 significant digits (rounded down) + uint divisor = 10 ** (digits > 4 ? digits - 4 : 0); + uint leading = value / divisor; // e.g. 56789 for 56789112 + + // Format: x.yyyy + uint first = leading / 10000; // x + uint second = (leading / 1000) % 10; // y + uint third = (leading / 100) % 10; // y + uint fourth = (leading / 10) % 10; // y + uint fifth = leading % 10; // y + + return string( + abi.encodePacked( + first.toString(), ".", + second.toString(), + third.toString(), + fourth.toString(), + fifth.toString(), + "e", + digits.toString() + ) + ); + } + + /// @dev Mocks out math performed in AllocationManager.slashOperator. This examines precision drift + /// caused by slashing applied when the operator has a pending deallocation, as slashOperator applies + /// slashes equally to two differently sized values: + /// + /// uint64 slashedMagnitude = uint64(uint256(allocation.currentMagnitude).mulWadRoundUp(params.wadsToSlash[i])); + /// + /// vs + /// + /// uint64 slashedPending = + /// uint64(uint256(uint128(-allocation.pendingDiff)).mulWadRoundUp(params.wadsToSlash[i])); + /// + /// The goal was to determine how precision drift impacts an operator's max magnitude over time. In conclusion, + /// any precision drift/rounding that occurs causes the operator to have _less_ max magnitude than they should, + /// reducing the ability of an attacker to leverage magnitude for an attack. We can rule out pending deallocations + /// when considering slash/redistro attacks. + function test_deallocMath( + uint64 maxMag, + uint64 curMag, + uint64 pendDealloc, + uint8 slashMantissa, + uint8 slashExponent, + uint8 vMod + ) public rand(0) { + maxMag = uint64(bound(maxMag, 2, 1e18)); + curMag = uint64(bound(curMag, 1, maxMag)); + pendDealloc = uint64(bound(pendDealloc, 1, curMag)); + + // Slashes are XeY +/- 1 + slashMantissa = uint8(bound(slashMantissa, 1, 9)); + slashExponent = uint8(bound(slashExponent, 0, 17)); + vMod = uint8(bound(vMod, uint(type(ValueMod).min), uint(type(ValueMod).max))); + + mag = Magnitude({ + max: maxMag, + cur: curMag, + available: maxMag - curMag, + pendDealloc: pendDealloc + }); + + slash = Slash({ + mantissa: slashMantissa, + exponent: slashExponent, + vMod: ValueMod(vMod) + }); + + _printMagInfo(); + + for (uint i = slashExponent; i > 0; i--) { + _doSlash(); + _printMagInfo(); + + slash.exponent--; + } + + revert(); + } + + function _doSlash() internal { + console.log(""); + console.log("===Slash Info===".magenta()); + + uint wadsToSlash = uint(slash.mantissa) * 10 ** uint(slash.exponent); + if (slash.vMod == ValueMod.SUB && wadsToSlash > 1) { + wadsToSlash--; + console.log(" - wadsToSlash: %de%d-1 (%d)", slash.mantissa, slash.exponent, wadsToSlash); + } else if (slash.vMod == ValueMod.ADD && wadsToSlash < uint(WAD)) { + wadsToSlash++; + console.log(" - wadsToSlash: %de%d+1 (%d)", slash.mantissa, slash.exponent, wadsToSlash); + } else { + console.log(" - wadsToSlash: %de%d (%d)", slash.mantissa, slash.exponent, wadsToSlash); + } + + // Apply the same slashing to current allocation and pending deallocation + uint64 slashedMagnitude = uint64(SlashingLib.mulWadRoundUp(mag.cur, wadsToSlash)); + uint64 slashedPending = uint64(SlashingLib.mulWadRoundUp(mag.pendDealloc, wadsToSlash)); + + // Check to see if rounding occurred + bool sMRounding = SlashingLib.mulWad(mag.cur, wadsToSlash) != slashedMagnitude; + bool sPRounding = SlashingLib.mulWad(mag.pendDealloc, wadsToSlash) != slashedPending; + console.log(" - slashedMagnitude: %d (rounding: %s)", slashedMagnitude, sMRounding ? "true".magenta() : "false"); + console.log(" - slashedPending: %d (rounding: %s)", slashedPending, sPRounding ? "true".magenta() : "false"); + + // Update magnitude info according to slash + mag.max -= slashedMagnitude; + mag.cur -= slashedMagnitude; + mag.available = mag.max - mag.cur; + mag.pendDealloc -= slashedPending; + + // Simulate applying deallocation and guage how much magnitude the operator is now able to allocate + // uint64 newAvailable = mag.available + mag.pendDealloc; + // uint64 newCurMag = mag.cur - mag.pendDealloc; + // uint64 newMaxMag = newAvailable + newCurMag; + uint64 newCurMag = mag.cur - mag.pendDealloc; + uint64 newAvailable = mag.max - newCurMag; + uint64 effectiveMaxMag = newAvailable + newCurMag; + + console.log(" - after deallocation:".yellow()); + console.log(" -- new cur mag: ", newCurMag); + console.log(" -- new available: ", newAvailable); + + if (mag.max == effectiveMaxMag) { + console.log(" -- max mag loss: %s", "none".green()); + } else if (mag.max > effectiveMaxMag) { + console.log( + " -- max mag loss: %s (%d)", + "lost magnitude".yellow(), + mag.max - effectiveMaxMag + ); + + revert("lossy"); + } else { + console.log( + " -- max mag loss: %s (%d)", + "gained magnitude".red(), + effectiveMaxMag - mag.max + ); + + revert("gain"); + } + } + + function _printMagInfo() internal { + console.log(""); + console.log("===Magnitude Info===".cyan()); + + console.log(" - initial max mag: ", WAD); + console.log(" - max magnitude: ", mag.max); + console.log(" -- available: ", mag.available); + console.log(" -- allocated: ", mag.cur); + console.log(" -- pending dealloc: ", mag.pendDealloc); + } +} \ No newline at end of file From 4b3d165ff4fe7247fd210ec42579e934dda57836 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Wed, 25 Jun 2025 15:16:31 +0000 Subject: [PATCH 2/2] test(wip): scratch space for rounding analysis and plots --- foundry.toml | 2 +- src/test/integration/iterations.json | 1103 ---------- src/test/integration/iterations2.json | 1014 --------- src/test/integration/output-example.json | 21 + src/test/integration/output.json | 1936 ++++------------- src/test/integration/params.toml | 112 +- .../tests/RoundingDeallocation.t.sol | 1189 +++++++--- 7 files changed, 1468 insertions(+), 3909 deletions(-) delete mode 100644 src/test/integration/iterations.json delete mode 100644 src/test/integration/iterations2.json create mode 100644 src/test/integration/output-example.json diff --git a/foundry.toml b/foundry.toml index 62bce3cf12..ec7fffe2d1 100644 --- a/foundry.toml +++ b/foundry.toml @@ -81,7 +81,7 @@ fs_permissions = [{ access = "read-write", path = "./"}] gas_limit = "18446744073709551615" # 2^64-1 - memory_limit = 1073741824 + memory_limit = 9223372036854775807 # 2^63-1 [profile.default.fmt] # Single-line vs multi-line statement blocks diff --git a/src/test/integration/iterations.json b/src/test/integration/iterations.json deleted file mode 100644 index 05817a2aab..0000000000 --- a/src/test/integration/iterations.json +++ /dev/null @@ -1,1103 +0,0 @@ -[ - 998993963782696177, - 996984924623115577, - 994979919678714859, - 992978936810431293, - 990981963927855711, - 988988988988988988, - 987000000000000000, - 986013986013986013, - 984031936127744510, - 982053838484546360, - 980079681274900398, - 978109452736318407, - 976143141153081510, - 974180734856007944, - 972222222222222222, - 970267591674925668, - 968316831683168316, - 966369930761622156, - 964426877470355731, - 962487660414610069, - 960552268244575936, - 958620689655172413, - 956692913385826771, - 954768928220255653, - 952848722986247544, - 950932286555446516, - 949019607843137254, - 947110675808031341, - 945205479452054794, - 943304007820136852, - 941406250000000000, - 940487804878048780, - 938596491228070175, - 936708860759493670, - 934824902723735408, - 932944606413994169, - 931067961165048543, - 929194956353055286, - 927325581395348837, - 925459825750242013, - 923597678916827852, - 921739130434782608, - 919884169884169884, - 918032786885245901, - 916184971098265895, - 914340712223291626, - 912500000000000000, - 911623439000960614, - 909788867562380038, - 907957813998082454, - 906130268199233716, - 904306220095693779, - 902485659655831739, - 900668576886341929, - 898854961832061068, - 897044804575786463, - 895238095238095238, - 893434823977164605, - 891634980988593155, - 889838556505223171, - 888045540796963946, - 886255924170616113, - 884469696969696969, - 882686849574266792, - 880907372400756143, - 879131255901794145, - 877358490566037735, - 875589066918001885, - 873822975517890772, - 872060206961429915, - 870300751879699248, - 868544600938967136, - 866791744840525328, - 865042174320524835, - 863295880149812734, - 861552853133769878, - 859813084112149532, - 858076563958916900, - 856343283582089552, - 854613233923578751, - 852886405959031657, - 851162790697674418, - 849442379182156133, - 847725162488393686, - 846011131725417439, - 844300278035217794, - 842592592592592592, - 840888066604995374, - 839186691312384473, - 837488457987072945, - 835793357933579335, - 834101382488479262, - 832412523020257826, - 830726770929162833, - 829044117647058823, - 827364554637281910, - 825688073394495412, - 824014665444546287, - 822344322344322344, - 820677035681610247, - 819012797074954296, - 817351598173515981, - 815693430656934306, - 814038286235186873, - 812386156648451730, - 810737033666969972, - 809090909090909090, - 807447774750227066, - 805807622504537205, - 804170444242973708, - 802536231884057971, - 800904977375565610, - 799276672694394213, - 797651309846431797, - 796028880866425992, - 794409377817853922, - 792792792792792792, - 791179117911791179, - 789568345323741007, - 787960467205750224, - 786355475763016157, - 784753363228699551, - 783154121863799283, - 781557743957027752, - 779964221824686940, - 778373547810545129, - 776785714285714285, - 775200713648528099, - 773618538324420677, - 772039180765805877, - 770462633451957295, - 768888888888888888, - 767317939609236234, - 765749778172138420, - 764184397163120567, - 762621789193976970, - 761061946902654867, - 759504862953138815, - 757950530035335689, - 756398940864960282, - 754850088183421516, - 753303964757709251, - 751760563380281690, - 750219876868953386, - 748681898066783831, - 747146619841966637, - 745614035087719298, - 744084136722173531, - 742556917688266199, - 741032370953630796, - 739510489510489510, - 737991266375545851, - 736474694589877835, - 734960767218831734, - 733449477351916376, - 731940818102697998, - 730434782608695652, - 728931364031277150, - 727430555555555555, - 725932350390286209, - 724436741767764298, - 722943722943722943, - 721453287197231833, - 719965427830596369, - 718480138169257340, - 716997411561691113, - 715517241379310344, - 714039621016365202, - 712564543889845094, - 711092003439380911, - 709621993127147766, - 708154506437768240, - 706689536878216123, - 705227077977720651, - 703767123287671232, - 702309666381522668, - 700854700854700854, - 699402220324508966, - 697952218430034129, - 696504688832054560, - 695059625212947189, - 693617021276595744, - 692176870748299319, - 690739167374681393, - 689303904923599320, - 687871077184054283, - 686440677966101694, - 685012701100762066, - 683587140439932318, - 682163989856297548, - 680743243243243243, - 679324894514767932, - 677908937605396290, - 676495366470092670, - 675084175084175084, - 673675357443229604, - 672268907563025210, - 670864819479429051, - 669463087248322147, - 668063704945515507, - 666666666666666666, - 665271966527196652, - 663879598662207357, - 662489557226399331, - 661101836393989983, - 659716430358632193, - 658333333333333333, - 656952539550374687, - 655574043261231281, - 654197838736492103, - 652823920265780730, - 651452282157676348, - 650082918739635157, - 648715824357912178, - 647350993377483443, - 645988420181968569, - 644628099173553719, - 643270024772914946, - 641914191419141914, - 640560593569661995, - 639209225700164744, - 637860082304526748, - 636513157894736842, - 635168447000821692, - 633825944170771756, - 632485643970467596, - 631147540983606557, - 629811629811629811, - 628477905073649754, - 627146361406377759, - 625816993464052287, - 624489795918367346, - 623164763458401305, - 621841890790546047, - 620521172638436482, - 619202603742880390, - 617886178861788617, - 616571892770105605, - 615259740259740259, - 613949716139497161, - 612641815235008103, - 611336032388663967, - 610032362459546925, - 608730800323362974, - 607431340872374798, - 606133979015334947, - 604838709677419354, - 603545527800161160, - 602254428341384863, - 600965406275140788, - 599678456591639871, - 598393574297188755, - 597110754414125200, - 595829991980753809, - 594551282051282051, - 593274619695756605, - 592000000000000000, - 591526778577138289, - 590255591054313099, - 588986432561851556, - 587719298245614035, - 586454183266932270, - 585191082802547770, - 583929992044550517, - 582670906200317965, - 581413820492454328, - 580158730158730158, - 578905630452022204, - 577654516640253565, - 576405384006334125, - 575158227848101265, - 573913043478260869, - 572669826224328593, - 571428571428571428, - 570189274447949526, - 568951930654058313, - 567716535433070866, - 566483084185680566, - 565251572327044025, - 564021995286724273, - 562794348508634222, - 561568627450980392, - 560344827586206896, - 559122944400939702, - 557902973395931142, - 556684910086004691, - 555468750000000000, - 555035128805620608, - 553822152886115444, - 552611067809820732, - 551401869158878504, - 550194552529182879, - 548989113530326594, - 547785547785547785, - 546583850931677018, - 545384018619084561, - 544186046511627906, - 542989930286599535, - 541795665634674922, - 540603248259860788, - 539412673879443585, - 538223938223938223, - 537037037037037037, - 535851966075558982, - 534668721109399075, - 533487297921478060, - 532307692307692307, - 531129900076863950, - 529953917050691244, - 528779739063699155, - 527607361963190184, - 526436781609195402, - 525267993874425727, - 524100994644223412, - 522935779816513761, - 521772345301757066, - 520610687022900763, - 519450800915331807, - 518292682926829268, - 517136329017517136, - 515981735159817351, - 514828897338403041, - 513677811550151975, - 512528473804100227, - 511380880121396054, - 510235026535253980, - 509090909090909090, - 507948523845571536, - 506807866868381240, - 505668934240362811, - 504531722054380664, - 503396226415094339, - 502262443438914027, - 501130369253956292, - 500000000000000000, - 499623777276147479, - 498496240601503759, - 497370398196844477, - 496246246246246246, - 495123780945236309, - 494002998500749625, - 492883895131086142, - 491766467065868263, - 490650710545998504, - 489536621823617339, - 488424197162061239, - 487313432835820895, - 486204325130499627, - 485096870342771982, - 483991064780342516, - 482886904761904761, - 481784386617100371, - 480683506686478454, - 479584261321455085, - 478486646884272997, - 477390659747961452, - 476296296296296296, - 475203552923760177, - 474112426035502958, - 473022912047302291, - 471935007385524372, - 470848708487084870, - 469764011799410029, - 468680913780397936, - 467599410898379970, - 466519499632082413, - 465441176470588235, - 464364437913299044, - 463289280469897209, - 462215700660308143, - 461143695014662756, - 460073260073260073, - 459004392386530014, - 457937088514996342, - 456871345029239766, - 455807158509861212, - 454744525547445255, - 453683442742523705, - 452623906705539358, - 451565914056809905, - 450509461426491994, - 449454545454545454, - 448401162790697674, - 447349310094408133, - 446298984034833091, - 445250181290790427, - 444202898550724637, - 443157132512671976, - 442112879884225759, - 441070137382501807, - 440028901734104046, - 438989169675090252, - 437950937950937950, - 436914203316510454, - 435878962536023054, - 434845212383009359, - 433812949640287769, - 432782171099928109, - 431752873563218390, - 430725053840631730, - 429698708751793400, - 428673835125448028, - 427650429799426934, - 426628489620615604, - 425608011444921316, - 424588992137240886, - 423571428571428571, - 422555317630264097, - 421540656205420827, - 420527441197434069, - 419515669515669515, - 418505338078291814, - 417496443812233285, - 416488983653162757, - 415482954545454545, - 414478353442157558, - 413475177304964539, - 412473423104181431, - 411473087818696883, - 410474168435951875, - 409476661951909476, - 408480565371024734, - 407485875706214689, - 406492589978828510, - 405500705218617771, - 404510218463706835, - 403521126760563380, - 402533427163969035, - 401547116736990154, - 400562192550948699, - 399578651685393258, - 398596491228070175, - 397615708274894810, - 396636299929922915, - 395658263305322128, - 394681595521343596, - 393706293706293706, - 392732354996505939, - 391759776536312849, - 390788555478018143, - 389818688981868898, - 388850174216027874, - 387883008356545961, - 386917188587334725, - 385952712100139082, - 384989576094510076, - 384027777777777777, - 383067314365024288, - 382108183079056865, - 381150381150381150, - 380193905817174515, - 379238754325259515, - 378284923928077455, - 377332411886662059, - 376381215469613259, - 375431331953071083, - 374482758620689655, - 373535492763611302, - 372589531680440771, - 371644872677219545, - 370701513067400275, - 369759450171821305, - 368818681318681318, - 367879203843514070, - 366941015089163237, - 366004112405757368, - 365068493150684931, - 364134154688569472, - 363201094391244870, - 362269309637730690, - 361338797814207650, - 360409556313993174, - 359481582537517053, - 358554873892297205, - 357629427792915531, - 356705241660993873, - 355782312925170068, - 354860639021074099, - 353940217391304347, - 353021045485403937, - 352103120759837177, - 351186440677966101, - 350271002710027100, - 349356804333107650, - 348443843031123139, - 347532116294793779, - 346621621621621621, - 345712356515867656, - 344804318488529014, - 343897505057316250, - 342991913746630727, - 342087542087542087, - 341184387617765814, - 340282447881640887, - 339381720430107526, - 338482202820685023, - 337583892617449664, - 336686787391012743, - 335790884718498659, - 334896182183523107, - 334002677376171352, - 333110367892976588, - 332219251336898395, - 331329325317301269, - 330440587449933244, - 329553035356904603, - 328666666666666666, - 327781479013990672, - 326897470039946737, - 326014637391882900, - 325132978723404255, - 324252491694352159, - 323373173970783532, - 322495023224950232, - 321618037135278514, - 320742213386348575, - 319867549668874172, - 318994043679682329, - 318121693121693121, - 317250495703899537, - 316380449141347424, - 315511551155115511, - 314643799472295514, - 313777191825972313, - 312911725955204216, - 312047399605003291, - 311184210526315789, - 310322156476002629, - 309461235216819973, - 308601444517399868, - 307742782152230971, - 306885245901639344, - 306028833551769331, - 305173542894564505, - 304319371727748691, - 303466317854807063, - 302614379084967320, - 301763553233180927, - 300913838120104438, - 300065231572080887, - 299217731421121251, - 298371335504885993, - 297526041666666666, - 296681847755367599, - 295838751625487646, - 294996751137102014, - 294155844155844155, - 293316028552887735, - 292477302204928664, - 291639662994167206, - 290803108808290155, - 289967637540453074, - 289133247089262613, - 288299935358758888, - 287467700258397932, - 286636539703034215, - 285806451612903225, - 284977433913604126, - 284149484536082474, - 283322601416613007, - 282496782496782496, - 281672025723472668, - 280848329048843187, - 280025690430314707, - 279204107830551989, - 278383579217447081, - 277564102564102564, - 276745675848814862, - 275928297055057618, - 275111964171465131, - 274296675191815856, - 273482428115015974, - 272669220945083014, - 271857051691129546, - 271045918367346938, - 270235818992989165, - 269426751592356687, - 268618714194780394, - 267811704834605597, - 267005721551176096, - 266200762388818297, - 265396825396825396, - 264593908629441624, - 263792010145846544, - 262991128010139416, - 262191260291323622, - 261392405063291139, - 260594560404807084, - 259797724399494310, - 259001895135818066, - 258207070707070707, - 257413249211356466, - 256620428751576292, - 255828607435412728, - 255037783375314861, - 254247954688483322, - 253459119496855345, - 252671275927089880, - 251884422110552763, - 251098556183301946, - 250313676286072772, - 249529780564263322, - 248746867167919799, - 247964934251721978, - 247183979974968710, - 246404002501563477, - 245625000000000000, - 245471580262336039, - 244694132334581772, - 243917654398003742, - 243142144638403990, - 242367601246105919, - 241594022415940224, - 240821406347230864, - 240049751243781094, - 239279055313859540, - 238509316770186335, - 237740533829919304, - 236972704714640198, - 236205827650340979, - 235439900867410161, - 234674922600619195, - 233910891089108910, - 233147804576376004, - 232385661310259579, - 231624459542927733, - 230864197530864197, - 230104873534855027, - 229346485819975339, - 228589032655576093, - 227832512315270935, - 227076923076923076, - 226322263222632226, - 225568531038721573, - 224815724815724815, - 224063842848373235, - 223312883435582822, - 222562844880441446, - 221813725490196078, - 221065523576240048, - 220318237454100367, - 219571865443425076, - 218826405867970660, - 218081857055589492, - 217338217338217338, - 216595485051860890, - 215853658536585365, - 215112736136502132, - 214372716199756394, - 213633597078514911, - 212895377128953771, - 212158054711246200, - 211421628189550425, - 210686095931997571, - 209951456310679611, - 209217707701637355, - 208484848484848484, - 207752877044215626, - 207021791767554479, - 206291591046581972, - 205562273276904474, - 204833836858006042, - 204106280193236714, - 203379601689800844, - 202653799758745476, - 201928872814948764, - 201204819277108433, - 200481637567730282, - 199759326113116726, - 199037883343355381, - 198317307692307692, - 197597597597597597, - 196878751500600240, - 196160767846430713, - 195443645083932853, - 194727381665668064, - 194011976047904191, - 193297426690604428, - 192583732057416267, - 191870890615660490, - 191158900836320191, - 190447761194029850, - 189737470167064439, - 189028026237328562, - 188319427890345649, - 187611673615247170, - 186904761904761904, - 186198691255205234, - 185493460166468489, - 184789067142008318, - 184085510688836104, - 183382789317507418, - 182680901542111506, - 181979845880260818, - 181279620853080568, - 180580224985198342, - 179881656804733727, - 179183914843287995, - 178486997635933806, - 177790903721204961, - 177095631641086186, - 176401179941002949, - 175707547169811320, - 175014731879787860, - 174322732626619552, - 173631547969393761, - 172941176470588235, - 172251616696061140, - 171562867215041128, - 170874926600117439, - 170187793427230046, - 169501466275659824, - 168815943728018757, - 168131224370240187, - 167447306791569086, - 166764189584552369, - 166081871345029239, - 165400350672121566, - 164719626168224299, - 164039696438995913, - 163360560093348891, - 162682215743440233, - 162004662004662004, - 161327897495631916, - 160651920838183934, - 159976730657358929, - 159302325581395348, - 158628704241719930, - 157955865272938443, - 157283807312826465, - 156612529002320185, - 155942028985507246, - 155272305909617612, - 154603358425014475, - 153935185185185185, - 153267784846732215, - 152601156069364161, - 151935297515886770, - 151270207852193995, - 150605885747259088, - 149942329873125720, - 149279538904899135, - 148617511520737327, - 147956246401842256, - 147295742232451093, - 146635997699827487, - 145977011494252873, - 145318782309017805, - 144661308840413318, - 144004589787722317, - 143348623853211009, - 142693409742120343, - 142038946162657502, - 141385231825987406, - 140732265446224256, - 140080045740423098, - 139428571428571428, - 138777841233580810, - 138127853881278538, - 137478608100399315, - 136830102622576966, - 136182336182336182, - 135535307517084282, - 134889015367103016, - 134243458475540386, - 133598635588402501, - 132954545454545454, - 132311186825667234, - 131668558456299659, - 131026659103800340, - 130385487528344671, - 129745042492917847, - 129105322763306908, - 128466327108092812, - 127828054298642533, - 127190503109101187, - 126553672316384180, - 125917560700169395, - 125282167042889390, - 124647490129723632, - 124013528748590755, - 123380281690140845, - 122747747747747747, - 122115925717501406, - 121484814398200224, - 120854412591343451, - 120224719101123595, - 119595732734418865, - 118967452300785634, - 118339876612450925, - 117713004484304932, - 117086834733893557, - 116461366181410974, - 115836597649692221, - 115212527964205816, - 114589155953046394, - 113966480446927374, - 113344500279173646, - 112723214285714285, - 112102621305075292, - 111482720178372352, - 110863509749303621, - 110244988864142538, - 109627156371730662, - 109010011123470522, - 108393551973318510, - 107777777777777777, - 107162687395891171, - 106548279689234184, - 105934553521907931, - 105321507760532150, - 104709141274238227, - 104097452934662236, - 103486441615938018, - 102876106194690265, - 102266445550027639, - 101657458563535911, - 101049144119271120, - 100441501103752759, - 99834528405956977, - 99228224917309812, - 98622589531680440, - 98017621145374449, - 97413318657127132, - 96809680968096809, - 96206706981858163, - 95604395604395604, - 95002745744096650, - 94401756311745334, - 93801426220515633, - 93201754385964912, - 92602739726027397, - 92004381161007667, - 91406677613574165, - 90809628008752735, - 90213231273920174, - 89617486338797814, - 89022392135445111, - 88427947598253275, - 87834151663938897, - 87241003271537622, - 86648501362397820, - 86056644880174291, - 85465432770821992, - 84874863982589771, - 84284937466014138, - 83695652173913043, - 83107007061379684, - 82519001085776330, - 81931633206728160, - 81344902386117136, - 80758807588075880, - 80173347778981581, - 79588521927449918, - 79004329004329004, - 78420767982693347, - 77837837837837837, - 77255537547271745, - 76673866090712742, - 76092822450080949, - 75512405609492988, - 74932614555256064, - 74353448275862068, - 73774905761981690, - 73196986006458557, - 72619688004303388, - 72043010752688172, - 71466953250940354, - 70891514500537056, - 70316693505099302, - 69742489270386266, - 69168900804289544, - 68595927116827438, - 68023567220139260, - 67451820128479657, - 66880684858212948, - 66310160427807486, - 65740245857830037, - 65170940170940170, - 64602242391884676, - 64034151547491995, - 63466666666666666, - 62899786780383795, - 62333510921683537, - 61767838125665601, - 61202767429483767, - 60638297872340425, - 60074428495481127, - 59511158342189160, - 58948486457780138, - 58386411889596602, - 57824933687002652, - 57264050901378579, - 56703762586115527, - 56144067796610169, - 55584965590259396, - 55026455026455026, - 54468535166578529, - 53911205073995771, - 53354463814051769, - 52798310454065469, - 52242744063324538, - 51687763713080168, - 51133368476541908, - 50579557428872497, - 50026329647182727, - 49473684210526315, - 48921620199894792, - 48370136698212407, - 47819232790331056, - 47268907563025210, - 46719160104986876, - 46169989506820566, - 45621394861038280, - 45073375262054507, - 44525929806181246, - 43979057591623036, - 43432757718472004, - 42887029288702928, - 42341871406168322, - 41797283176593521, - 41253263707571801, - 40709812108559498, - 40166927490871152, - 39624608967674661, - 39082855653986451, - 38541666666666666, - 38001041124414367, - 37460978147762747, - 36921476859074362, - 36382536382536382, - 35844155844155844, - 35306334371754932, - 34769071094966268, - 34232365145228215, - 33696215655780196, - 33160621761658031, - 32625582599689280, - 32091097308488612, - 31557165028453181, - 31023784901758014, - 30490956072351421, - 29958677685950413, - 29426948890036138, - 28895768833849329, - 28365136668385765, - 27835051546391752, - 27305512622359608, - 26776519052523171, - 26248069994853319, - 25720164609053497, - 25192802056555269, - 24665981500513874, - 24139702105803800, - 23613963039014373, - 23088763468445356, - 22564102564102564, - 22039979497693490, - 21516393442622950, - 20993343573988735, - 20470829068577277, - 19948849104859335, - 19427402862985685, - 18906489524782830, - 18386108273748723, - 17866258295048494, - 17346938775510204, - 16828148903620601, - 16309887869520897, - 15792154865002547, - 15274949083503054, - 14758269720101781, - 14242115971515768, - 13726487036095577, - 13211382113821138, - 12696800406297613, - 12182741116751269, - 11669203450025367, - 11156186612576064, - 10643689812468322, - 10131712259371833, - 9620253164556962, - 9109311740890688, - 8598887202832574, - 8088978766430738, - 7579585649317837, - 7070707070707070, - 6562342251388187, - 6054490413723511, - 5547150781643973, - 5040322580645161, - 4534005037783375, - 4028197381671701, - 3522898842476094, - 3018108651911468, - 2513826043237807, - 2010050251256281, - 1506780512305374, - 1004016064257028, - 501756146512794, - 501504513540621, - 501253132832080, - 501002004008016, - 500751126690035, - 500500500500500, - 500250125062531, - 500000000000000, - 499750124937531, - 499500499500499, - 499251123315027, - 499001996007984, - 498753117206982, - 498504486540378, - 498256103637269, - 498007968127490, - 497760079641612, - 497512437810945, - 497265042267528, - 497017892644135, - 496770988574267, - 496524329692154, - 496277915632754, - 496031746031746, - 495785820525532, - 495540138751238, - 495294700346706, - 495049504950495, - 494804552201880, - 494559841740850, - 494315373208106, - 494071146245059, - 493827160493827, - 493583415597235, - 493339911198815, - 493096646942800, - 492853622474125, - 492610837438423, - 492368291482028, - 492125984251968, - 491883915395966, - 491642084562438, - 491400491400491, - 491159135559921, - 490918016691212, - 490677134445534, - 490436488474742, - 490196078431372, - 489955903968642, - 489715964740450, - 489476260401370, - 489236790606653, - 488997555012224, - 488758553274682, - 488519785051294, - 488281250000000, - 488042947779404, - 487804878048780, - 487567040468064, - 487329434697855, - 487092060399415, - 486854917234664, - 486618004866180, - 486381322957198, - 486144871171609, - 485908649173955, - 485672656629431, - 485436893203883, - 485201358563803, - 484966052376333, - 484730974309258, - 484496124031007, - 484261501210653, - 484027105517909, - 483792936623125, - 483558994197292, - 483325277912034, - 483091787439613, - 482858522452921, - 482625482625482, - 482392667631452, - 482160077145612, - 481927710843373, - 481695568400770, - 481463649494463, - 481231953801732, - 481000481000481, - 480769230769230, - 480538202787121, - 480307396733909, - 480076812289966, - 479846449136276, - 479616306954436, - 479386385426653, - 479156684235745, - 478927203065134, - 478697941598851, - 478468899521531, - 478240076518412, - 478011472275334, - 477783086478738, - 477554918815663 -] \ No newline at end of file diff --git a/src/test/integration/iterations2.json b/src/test/integration/iterations2.json deleted file mode 100644 index 6f8dc10e71..0000000000 --- a/src/test/integration/iterations2.json +++ /dev/null @@ -1,1014 +0,0 @@ -[ - 997987927565392354, - 993975903614457831, - 989979959919839679, - 986000000000000000, - 984031936127744510, - 980079681274900398, - 976143141153081510, - 972222222222222222, - 968316831683168316, - 964426877470355731, - 960552268244575936, - 956692913385826771, - 952848722986247544, - 949019607843137254, - 945205479452054794, - 941406250000000000, - 939571150097465886, - 935797665369649805, - 932038834951456310, - 928294573643410852, - 924564796905222437, - 920849420849420849, - 917148362235067437, - 913461538461538461, - 909788867562380038, - 906130268199233716, - 902485659655831739, - 898854961832061068, - 895238095238095238, - 891634980988593155, - 888045540796963946, - 884469696969696969, - 880907372400756143, - 877358490566037735, - 873822975517890772, - 870300751879699248, - 866791744840525328, - 863295880149812734, - 859813084112149532, - 856343283582089552, - 852886405959031657, - 849442379182156133, - 846011131725417439, - 842592592592592592, - 839186691312384473, - 835793357933579335, - 832412523020257826, - 829044117647058823, - 825688073394495412, - 822344322344322344, - 819012797074954296, - 815693430656934306, - 812386156648451730, - 809090909090909090, - 805807622504537205, - 802536231884057971, - 799276672694394213, - 796028880866425992, - 792792792792792792, - 789568345323741007, - 786355475763016157, - 783154121863799283, - 779964221824686940, - 776785714285714285, - 773618538324420677, - 770462633451957295, - 767317939609236234, - 764184397163120567, - 761061946902654867, - 757950530035335689, - 754850088183421516, - 751760563380281690, - 748681898066783831, - 745614035087719298, - 742556917688266199, - 739510489510489510, - 736474694589877835, - 733449477351916376, - 730434782608695652, - 727430555555555555, - 724436741767764298, - 721453287197231833, - 718480138169257340, - 715517241379310344, - 712564543889845094, - 709621993127147766, - 706689536878216123, - 703767123287671232, - 700854700854700854, - 697952218430034129, - 695059625212947189, - 692176870748299319, - 689303904923599320, - 686440677966101694, - 683587140439932318, - 680743243243243243, - 677908937605396290, - 675084175084175084, - 672268907563025210, - 669463087248322147, - 666666666666666666, - 663879598662207357, - 661101836393989983, - 658333333333333333, - 655574043261231281, - 652823920265780730, - 650082918739635157, - 647350993377483443, - 644628099173553719, - 641914191419141914, - 639209225700164744, - 636513157894736842, - 633825944170771756, - 631147540983606557, - 628477905073649754, - 625816993464052287, - 623164763458401305, - 620521172638436482, - 617886178861788617, - 615259740259740259, - 612641815235008103, - 610032362459546925, - 607431340872374798, - 604838709677419354, - 602254428341384863, - 599678456591639871, - 597110754414125200, - 594551282051282051, - 592000000000000000, - 591054313099041533, - 588516746411483253, - 585987261146496815, - 583465818759936406, - 580952380952380952, - 578446909667194928, - 575949367088607594, - 573459715639810426, - 570977917981072555, - 568503937007874015, - 566037735849056603, - 563579277864992150, - 561128526645768025, - 558685446009389671, - 556250000000000000, - 555382215288611544, - 552959501557632398, - 550544323483670295, - 548136645962732919, - 545736434108527131, - 543343653250773993, - 540958268933539412, - 538580246913580246, - 536209553158705701, - 533846153846153846, - 531490015360983102, - 529141104294478527, - 526799387442572741, - 524464831804281345, - 522137404580152671, - 519817073170731707, - 517503805175038051, - 515197568389057750, - 512898330804248861, - 510606060606060606, - 508320726172465960, - 506042296072507552, - 503770739064856711, - 501506024096385542, - 499248120300751879, - 496996996996996996, - 494752623688155922, - 492514970059880239, - 490284005979073243, - 488059701492537313, - 485842026825633383, - 483630952380952380, - 481426448736998514, - 479228486646884272, - 477037037037037037, - 474852071005917159, - 472673559822747415, - 470501474926253687, - 468335787923416789, - 466176470588235294, - 464023494860499265, - 461876832844574780, - 459736456808199121, - 457602339181286549, - 455474452554744525, - 453352769679300291, - 451237263464337700, - 449127906976744186, - 447024673439767779, - 444927536231884057, - 442836468885672937, - 440751445086705202, - 438672438672438672, - 436599423631123919, - 434532374100719424, - 432471264367816091, - 430416068866571018, - 428366762177650429, - 426323319027181688, - 424285714285714285, - 422253922967189728, - 420227920227920227, - 418207681365576102, - 416193181818181818, - 414184397163120567, - 412181303116147308, - 410183875530410183, - 408192090395480225, - 406205923836389280, - 404225352112676056, - 402250351617440225, - 400280898876404494, - 398316970546984572, - 396358543417366946, - 394405594405594405, - 392458100558659217, - 390516039051603905, - 388579387186629526, - 386648122392211404, - 384722222222222222, - 382801664355062413, - 380886426592797783, - 378976486860304287, - 377071823204419889, - 375172413793103448, - 373278236914600550, - 371389270976616231, - 369505494505494505, - 367626886145404663, - 365753424657534246, - 363885088919288645, - 362021857923497267, - 360163710777626193, - 358310626702997275, - 356462585034013605, - 354619565217391304, - 352781546811397557, - 350948509485094850, - 349120433017591339, - 347297297297297297, - 345479082321187584, - 343665768194070080, - 341857335127860026, - 340053763440860215, - 338255033557046979, - 336461126005361930, - 334672021419009370, - 332887700534759358, - 331108144192256341, - 329333333333333333, - 327563249001331557, - 325797872340425531, - 324037184594953519, - 322281167108753315, - 320529801324503311, - 318783068783068783, - 317040951122853368, - 315303430079155672, - 313570487483530961, - 311842105263157894, - 310118265440210249, - 308398950131233595, - 306684141546526867, - 304973821989528795, - 303267973856209150, - 301566579634464751, - 299869621903520208, - 298177083333333333, - 296488946684005201, - 294805194805194805, - 293125810635538261, - 291450777202072538, - 289780077619663648, - 288113695090439276, - 286451612903225806, - 284793814432989690, - 283140283140283140, - 281491002570694087, - 279845956354300385, - 278205128205128205, - 276568501920614596, - 274936061381074168, - 273307790549169859, - 271683673469387755, - 270063694267515923, - 268447837150127226, - 266836086404066073, - 265228426395939086, - 263624841571609632, - 262025316455696202, - 260429835651074589, - 258838383838383838, - 257250945775535939, - 255667506297229219, - 254088050314465408, - 252512562814070351, - 250941028858218318, - 249373433583959899, - 247809762202753441, - 246250000000000000, - 245942571785268414, - 244389027431421446, - 242839352428393524, - 241293532338308457, - 239751552795031055, - 238213399503722084, - 236679058240396530, - 235148514851485148, - 233621755253399258, - 232098765432098765, - 230579531442663378, - 229064039408866995, - 227552275522755227, - 226044226044226044, - 224539877300613496, - 223039215686274509, - 221542227662178702, - 220048899755501222, - 218559218559218559, - 217073170731707317, - 215590742996345919, - 214111922141119221, - 212636695018226002, - 211165048543689320, - 209696969696969696, - 208232445520581113, - 206771463119709794, - 205314009661835748, - 203860072376357056, - 202409638554216867, - 200962695547533092, - 199519230769230769, - 198079231692677070, - 196642685851318944, - 195209580838323353, - 193779904306220095, - 192353643966547192, - 190930787589498806, - 189511323003575685, - 188095238095238095, - 186682520808561236, - 185273159144893111, - 183867141162514827, - 182464454976303317, - 181065088757396449, - 179669030732860520, - 178276269185360094, - 176886792452830188, - 175500588928150765, - 174117647058823529, - 172737955346650998, - 171361502347417840, - 169988276670574443, - 168618266978922716, - 167251461988304093, - 165887850467289719, - 164527421236872812, - 163170163170163170, - 161816065192083818, - 160465116279069767, - 159117305458768873, - 157772621809744779, - 156431054461181923, - 155092592592592592, - 153757225433526011, - 152424942263279445, - 151095732410611303, - 149769585253456221, - 148446490218642117, - 147126436781609195, - 145809414466130884, - 144495412844036697, - 143184421534936998, - 141876430205949656, - 140571428571428571, - 139269406392694063, - 137970353477765108, - 136674259681093394, - 135381114903299203, - 134090909090909090, - 132803632236095346, - 131519274376417233, - 130237825594563986, - 128959276018099547, - 127683615819209039, - 126410835214446952, - 125140924464487034, - 123873873873873873, - 122609673790776152, - 121348314606741573, - 120089786756453423, - 118834080717488789, - 117581187010078387, - 116331096196868008, - 115083798882681564, - 113839285714285714, - 112597547380156075, - 111358574610244988, - 110122358175750834, - 108888888888888888, - 107658157602663706, - 106430155210643015, - 105204872646733111, - 103982300884955752, - 102762430939226519, - 101545253863134657, - 100330760749724366, - 99118942731277533, - 97909790979097909, - 96703296703296703, - 95499451152579582, - 94298245614035087, - 93099671412924424, - 91903719912472647, - 90710382513661202, - 89519650655021834, - 88331515812431842, - 87145969498910675, - 85963003264417845, - 84782608695652173, - 83604777415852334, - 82429501084598698, - 81256771397616468, - 80086580086580086, - 78918918918918918, - 77753779697624190, - 76591154261057173, - 75431034482758620, - 74273412271259418, - 73118279569892473, - 71965628356605800, - 70815450643776824, - 69667738478027867, - 68522483940042826, - 67379679144385026, - 66239316239316239, - 65101387406616862, - 63965884861407249, - 62832800851970181, - 61702127659574468, - 60573857598299681, - 59447983014861995, - 58324496288441145, - 57203389830508474, - 56084656084656084, - 54968287526427061, - 53854276663146779, - 52742616033755274, - 51633298208640674, - 50526315789473684, - 49421661409043112, - 48319327731092436, - 47219307450157397, - 46121593291404612, - 45026178010471204, - 43933054393305439, - 42842215256008359, - 41753653444676409, - 40667361835245046, - 39583333333333333, - 38501560874089490, - 37422037422037422, - 36344755970924195, - 35269709543568464, - 34196891191709844, - 33126293995859213, - 32057911065149948, - 30991735537190082, - 29927760577915376, - 28865979381443298, - 27806385169927909, - 26748971193415637, - 25693730729701952, - 24640657084188911, - 23589743589743589, - 22540983606557377, - 21494370522006141, - 20449897750511247, - 19407558733401430, - 18367346938775510, - 17329255861365953, - 16293279022403258, - 15259409969481180, - 14227642276422764, - 13197969543147208, - 12170385395537525, - 11144883485309017, - 10121457489878542, - 9100101112234580, - 8080808080808080, - 7063572149344096, - 6048387096774193, - 5035246727089627, - 4024144869215291, - 3015075376884422, - 2008032128514056, - 1003009027081243, - 334001336005344021, - 333110814419225634, - 332221480987324883, - 331333333333333333, - 330446369087275149, - 329560585885486018, - 328675981370592149, - 327792553191489361, - 326910299003322259, - 326029216467463479, - 325149303251493032, - 324270557029177718, - 323392975480450629, - 322516556291390728, - 321641297154202514, - 320767195767195767, - 319894249834765366, - 319022457067371202, - 318151815181518151, - 317282321899736147, - 316413974950560316, - 315546772068511198, - 314680710994075049, - 313815789473684210, - 312952005259697567, - 312089356110381077, - 311227839789888378, - 310367454068241469, - 309508196721311475, - 308650065530799475, - 307793058284217419, - 306937172774869109, - 306082406801831262, - 305228758169934640, - 304376224689745264, - 303524804177545691, - 302674494455316373, - 301825293350717079, - 300977198697068403, - 300130208333333333, - 299284320104098893, - 298439531859557867, - 297595841455490578, - 296753246753246753, - 295911745619727449, - 295071335927367055, - 294232015554115359, - 293393782383419689, - 292556634304207119, - 291720569210866752, - 290885585003232062, - 290051679586563307, - 289218850871530019, - 288387096774193548, - 287556415215989684, - 286726804123711340, - 285898261429491307, - 285070785070785070, - 284244372990353697, - 283419023136246786, - 282594733461785484, - 281771501925545571, - 280949326491340602, - 280128205128205128, - 279308135810377962, - 278489116517285531, - 277671145233525271, - 276854219948849104, - 276038338658146964, - 275223499361430395, - 274409700063816209, - 273596938775510204, - 272785213511790949, - 271974522292993630, - 271164863144493952, - 270356234096692111, - 269548633184996821, - 268742058449809402, - 267936507936507936, - 267131979695431472, - 266328471781864299, - 265525982256020278, - 264724509183027232, - 263924050632911392, - 263124604680581910, - 262326169405815423, - 261528742893240682, - 260732323232323232, - 259936908517350157, - 259142496847414880, - 258349086326402016, - 257556675062972292, - 256765261170547514, - 255974842767295597, - 255185417976115650, - 254396984924623115, - 253609541745134965, - 252823086574654956, - 252037617554858934, - 251253132832080200, - 250469630557294927, - 249687108886107634, - 248905565978736710, - 248125000000000000, - 247970018738288569, - 247191011235955056, - 246412975670617592, - 245635910224438902, - 244859813084112149, - 244084682440846824, - 243310516490354698, - 242537313432835820, - 241765071472964574, - 240993788819875776, - 240223463687150837, - 239454094292803970, - 238685678859268443, - 237918215613382899, - 237151702786377708, - 236386138613861386, - 235621521335807050, - 234857849196538936, - 234095120444718962, - 233333333333333333, - 232572486119679210, - 231812577065351418, - 231053604436229205, - 230295566502463054, - 229538461538461538, - 228782287822878228, - 228027043638598647, - 227272727272727272, - 226519337016574585, - 225766871165644171, - 225015328019619865, - 224264705882352941, - 223515003061849357, - 222766217870257037, - 222018348623853211, - 221271393643031784, - 220525351252290775, - 219780219780219780, - 219035997559487492, - 218292682926829268, - 217550274223034734, - 216808769792935444, - 216068167985392574, - 215328467153284671, - 214589665653495440, - 213851761846901579, - 213114754098360655, - 212378640776699029, - 211643420254699818, - 210909090909090909, - 210175651120533010, - 209443099273607748, - 208711433756805807, - 207980652962515114, - 207250755287009063, - 206521739130434782, - 205793602896801448, - 205066344993968636, - 204339963833634719, - 203614457831325301, - 202889825406381697, - 202166064981949458, - 201443174984966927, - 200721153846153846, - 200000000000000000, - 199879951980792316, - 199160167966406718, - 198441247002398081, - 197723187537447573, - 197005988023952095, - 196289646918013165, - 195574162679425837, - 194859533771667662, - 194145758661887694, - 193432835820895522, - 192720763723150357, - 192009540846750149, - 191299165673420738, - 190589636688505062, - 189880952380952380, - 189173111243307555, - 188466111771700356, - 187759952465834818, - 187054631828978622, - 186350148367952522, - 185646500593119810, - 184943687018375815, - 184241706161137440, - 183540556542332741, - 182840236686390532, - 182140745121230041, - 181442080378250591, - 180744240992321323, - 180047225501770956, - 179351032448377581, - 178655660377358490, - 177961107837360047, - 177267373380447585, - 176574455562095350, - 175882352941176470, - 175191064079952968, - 174500587544065804, - 173810921902524955, - 173122065727699530, - 172434017595307917, - 171746776084407971, - 171060339777387229, - 170374707259953161, - 169689877121123464, - 169005847953216374, - 168322618351841028, - 167640186915887850, - 166958552247518972, - 166277712952158693, - 165597667638483965, - 164918414918414918, - 164239953407105416, - 163562281722933643, - 162885398487492728, - 162209302325581395, - 161533991865194654, - 160859465737514518, - 160185722576900754, - 159512761020881670, - 158840579710144927, - 158169177288528389, - 157498552403011001, - 156828703703703703, - 156159629843840370, - 155491329479768786, - 154823801270941652, - 154157043879907621, - 153491055972302365, - 152825836216839677, - 152161383285302593, - 151497695852534562, - 150834772596430627, - 150172612197928653, - 149511213341000575, - 148850574712643678, - 148190695002871912, - 147531572904707233, - 146873207114170969, - 146215596330275229, - 145558739255014326, - 144902634593356242, - 144247281053234115, - 143592677345537757, - 142938822184105202, - 142285714285714285, - 141633352370074243, - 140981735159817351, - 140330861380490587, - 139680729760547320, - 139031339031339031, - 138382687927107061, - 137734775184974388, - 137087599544937428, - 136441159749857873, - 135795454545454545, - 135150482680295286, - 134506242905788876, - 133862733976176971, - 133219954648526077, - 132577903682719546, - 131936579841449603, - 131295981890209394, - 130656108597285067, - 130016958733747880, - 129378531073446327, - 128740824392998306, - 128103837471783295, - 127467569091934574, - 126832018038331454, - 126197183098591549, - 125563063063063063, - 124929656724817107, - 124296962879640044, - 123664980326025857, - 123033707865168539, - 122403144300954519, - 121773288439955106, - 121144139091418956, - 120515695067264573, - 119887955182072829, - 119260918253079507, - 118634583100167879, - 118008948545861297, - 117384013415315818, - 116759776536312849, - 116136236739251814, - 115513392857142857, - 114891243725599553, - 114269788182831661, - 113649025069637883, - 113028953229398663, - 112409571508069003, - 111790878754171301, - 111172873818788215, - 110555555555555555, - 109938922820655191, - 109322974472807991, - 108707709373266777, - 108093126385809312, - 107479224376731301, - 106866002214839424, - 106253458771444382, - 105641592920353982, - 105030403537866224, - 104419889502762430, - 103810049696300386, - 103200883002207505, - 102592388306674020, - 101984564498346196, - 101377410468319559, - 100770925110132158, - 100165107319757842, - 99559955995599559, - 98955470038482682, - 98351648351648351, - 97748489840746842, - 97145993413830954, - 96544157981349424, - 95942982456140350, - 95342465753424657, - 94742606790799561, - 94143404488232074, - 93544857768052516, - 92946965554948059, - 92349726775956284, - 91753140360458765, - 91157205240174672, - 90561920349154391, - 89967284623773173, - 89373297002724795, - 88779956427015250, - 88187261839956450, - 87595212187159956, - 87003806416530723, - 86413043478260869, - 85822922324823465, - 85233441910966340, - 84644601193705914, - 84056399132321041, - 83468834688346883, - 82881906825568797, - 82295614510016242, - 81709956709956709, - 81124932395889670, - 80540540540540540, - 79956780118854673, - 79373650107991360, - 78791149487317862, - 78209277238403451, - 77628032345013477, - 77047413793103448, - 76467420570813139, - 75888051668460710, - 75309306078536847, - 74731182795698924, - 74153680816765180, - 73576799140708915, - 73000536768652710, - 72424892703862660, - 71849865951742627, - 71275455519828510, - 70701660417782538, - 70128479657387580, - 69555912252541466, - 68983957219251336, - 68412613575628006, - 67841880341880341, - 67271756540309663, - 66702241195304162, - 66133333333333333, - 65565031982942430, - 64997336174746936, - 64430244941427050, - 63863757317722192, - 63297872340425531, - 62732589048378522, - 62167906482465462, - 61603823685608072, - 61040339702760084, - 60477453580901856, - 59915164369034994, - 59353471118177000, - 58792372881355932, - 58231868713605082, - 57671957671957671, - 57112638815441565, - 56553911205073995, - 55995773903856312, - 55438225976768743, - 54881266490765171, - 54324894514767932, - 53769109119662625, - 53213909378292939, - 52659294365455502, - 52105263157894736, - 51551814834297738, - 50998948475289169, - 50446663163426169, - 49894957983193277, - 49343832020997375, - 48793284365162644, - 48243314105925537, - 47693920335429769, - 47145102147721320, - 46596858638743455, - 46049188906331763, - 45502092050209205, - 44955567171981181, - 44409613375130616, - 43864229765013054, - 43319415448851774, - 42775169535732916, - 42231491136600625, - 41688379364252214, - 41145833333333333, - 40603852160333159, - 40062434963579604, - 39521580863234529, - 38981288981288981, - 38441558441558441, - 37902388369678089, - 37363777893098079, - 36825726141078838, - 36288232244686365, - 35751295336787564, - 35214914552045572, - 34679089026915113, - 34143817899637868, - 33609100310237849, - 33074935400516795, - 32541322314049586, - 32008260196179659, - 31475748194014447, - 30943785456420835, - 30412371134020618, - 29881504379185986, - 29351184346035015, - 28821410190427174, - 28292181069958847, - 27763496143958868, - 27235354573484069, - 26707755521314843, - 26180698151950718, - 25654181631605951, - 25128205128205128, - 24602767811378780, - 24077868852459016, - 23553507424475166, - 23029682702149437, - 22506393861892583, - 21983640081799591, - 21461420541645375, - 20939734422880490, - 20418580908626850, - 19897959183673469, - 19377868434472208, - 18858307849133537, - 18339276617422312, - 17820773930753564, - 17302798982188295, - 16785350966429298, - 16268429079816980, - 15752032520325203, - 15236160487557135, - 14720812182741116, - 14205986808726534, - 13691683569979716, - 13177901672579827, - 12664640324214792, - 12151898734177215, - 11639676113360323, - 11127971674253920, - 10616784630940343, - 10106114199090449, - 9595959595959595, - 9086320040383644, - 8577194752774974, - 8068582955118507, - 7560483870967741, - 7052896725440806, - 6545820745216515, - 6039255158530447, - 5533199195171026, - 5027652086475615, - 4522613065326633, - 4018081366147664, - 3514056224899598, - 3010536879076768, - 2507522567703109, - 2005012531328320, - 1503006012024048, - 1001502253380070, - 500500500500500, - 500250125062531, - 500000000000000, - 499750124937531, - 499500499500499, - 499251123315027, - 499001996007984, - 498753117206982, - 498504486540378, - 498256103637269 -] \ No newline at end of file diff --git a/src/test/integration/output-example.json b/src/test/integration/output-example.json new file mode 100644 index 0000000000..5149609cc4 --- /dev/null +++ b/src/test/integration/output-example.json @@ -0,0 +1,21 @@ +{ + "1e3_max_mag": { + "0%_in_withdrawal_queue": { + + }, + "00_001%_in_withdrawal_queue": { + + }, + "10%_in_withdrawal_queue": { + + }, + "50%_in_withdrawal_queue": { + + }, + "90%_in_withdrawal_queue": { + + }, + "99_999%_in_withdrawal_queue": {}, + "100%_in_withdrawal_queue": {} + } +} \ No newline at end of file diff --git a/src/test/integration/output.json b/src/test/integration/output.json index 2ddb6c640b..742fa38a35 100644 --- a/src/test/integration/output.json +++ b/src/test/integration/output.json @@ -1,1521 +1,421 @@ { - "DTZ": { - "": [ - 998993963782696177, - 996984924623115577, - 994979919678714859, - 992978936810431293, - 990981963927855711, - 988988988988988988, - 987000000000000000, - 986013986013986013, - 984031936127744510, - 982053838484546360, - 980079681274900398, - 978109452736318407, - 976143141153081510, - 974180734856007944, - 972222222222222222, - 970267591674925668, - 968316831683168316, - 966369930761622156, - 964426877470355731, - 962487660414610069, - 960552268244575936, - 958620689655172413, - 956692913385826771, - 954768928220255653, - 952848722986247544, - 950932286555446516, - 949019607843137254, - 947110675808031341, - 945205479452054794, - 943304007820136852, - 941406250000000000, - 940487804878048780, - 938596491228070175, - 936708860759493670, - 934824902723735408, - 932944606413994169, - 931067961165048543, - 929194956353055286, - 927325581395348837, - 925459825750242013, - 923597678916827852, - 921739130434782608, - 919884169884169884, - 918032786885245901, - 916184971098265895, - 914340712223291626, - 912500000000000000, - 911623439000960614, - 909788867562380038, - 907957813998082454, - 906130268199233716, - 904306220095693779, - 902485659655831739, - 900668576886341929, - 898854961832061068, - 897044804575786463, - 895238095238095238, - 893434823977164605, - 891634980988593155, - 889838556505223171, - 888045540796963946, - 886255924170616113, - 884469696969696969, - 882686849574266792, - 880907372400756143, - 879131255901794145, - 877358490566037735, - 875589066918001885, - 873822975517890772, - 872060206961429915, - 870300751879699248, - 868544600938967136, - 866791744840525328, - 865042174320524835, - 863295880149812734, - 861552853133769878, - 859813084112149532, - 858076563958916900, - 856343283582089552, - 854613233923578751, - 852886405959031657, - 851162790697674418, - 849442379182156133, - 847725162488393686, - 846011131725417439, - 844300278035217794, - 842592592592592592, - 840888066604995374, - 839186691312384473, - 837488457987072945, - 835793357933579335, - 834101382488479262, - 832412523020257826, - 830726770929162833, - 829044117647058823, - 827364554637281910, - 825688073394495412, - 824014665444546287, - 822344322344322344, - 820677035681610247, - 819012797074954296, - 817351598173515981, - 815693430656934306, - 814038286235186873, - 812386156648451730, - 810737033666969972, - 809090909090909090, - 807447774750227066, - 805807622504537205, - 804170444242973708, - 802536231884057971, - 800904977375565610, - 799276672694394213, - 797651309846431797, - 796028880866425992, - 794409377817853922, - 792792792792792792, - 791179117911791179, - 789568345323741007, - 787960467205750224, - 786355475763016157, - 784753363228699551, - 783154121863799283, - 781557743957027752, - 779964221824686940, - 778373547810545129, - 776785714285714285, - 775200713648528099, - 773618538324420677, - 772039180765805877, - 770462633451957295, - 768888888888888888, - 767317939609236234, - 765749778172138420, - 764184397163120567, - 762621789193976970, - 761061946902654867, - 759504862953138815, - 757950530035335689, - 756398940864960282, - 754850088183421516, - 753303964757709251, - 751760563380281690, - 750219876868953386, - 748681898066783831, - 747146619841966637, - 745614035087719298, - 744084136722173531, - 742556917688266199, - 741032370953630796, - 739510489510489510, - 737991266375545851, - 736474694589877835, - 734960767218831734, - 733449477351916376, - 731940818102697998, - 730434782608695652, - 728931364031277150, - 727430555555555555, - 725932350390286209, - 724436741767764298, - 722943722943722943, - 721453287197231833, - 719965427830596369, - 718480138169257340, - 716997411561691113, - 715517241379310344, - 714039621016365202, - 712564543889845094, - 711092003439380911, - 709621993127147766, - 708154506437768240, - 706689536878216123, - 705227077977720651, - 703767123287671232, - 702309666381522668, - 700854700854700854, - 699402220324508966, - 697952218430034129, - 696504688832054560, - 695059625212947189, - 693617021276595744, - 692176870748299319, - 690739167374681393, - 689303904923599320, - 687871077184054283, - 686440677966101694, - 685012701100762066, - 683587140439932318, - 682163989856297548, - 680743243243243243, - 679324894514767932, - 677908937605396290, - 676495366470092670, - 675084175084175084, - 673675357443229604, - 672268907563025210, - 670864819479429051, - 669463087248322147, - 668063704945515507, - 666666666666666666, - 665271966527196652, - 663879598662207357, - 662489557226399331, - 661101836393989983, - 659716430358632193, - 658333333333333333, - 656952539550374687, - 655574043261231281, - 654197838736492103, - 652823920265780730, - 651452282157676348, - 650082918739635157, - 648715824357912178, - 647350993377483443, - 645988420181968569, - 644628099173553719, - 643270024772914946, - 641914191419141914, - 640560593569661995, - 639209225700164744, - 637860082304526748, - 636513157894736842, - 635168447000821692, - 633825944170771756, - 632485643970467596, - 631147540983606557, - 629811629811629811, - 628477905073649754, - 627146361406377759, - 625816993464052287, - 624489795918367346, - 623164763458401305, - 621841890790546047, - 620521172638436482, - 619202603742880390, - 617886178861788617, - 616571892770105605, - 615259740259740259, - 613949716139497161, - 612641815235008103, - 611336032388663967, - 610032362459546925, - 608730800323362974, - 607431340872374798, - 606133979015334947, - 604838709677419354, - 603545527800161160, - 602254428341384863, - 600965406275140788, - 599678456591639871, - 598393574297188755, - 597110754414125200, - 595829991980753809, - 594551282051282051, - 593274619695756605, - 592000000000000000, - 591526778577138289, - 590255591054313099, - 588986432561851556, - 587719298245614035, - 586454183266932270, - 585191082802547770, - 583929992044550517, - 582670906200317965, - 581413820492454328, - 580158730158730158, - 578905630452022204, - 577654516640253565, - 576405384006334125, - 575158227848101265, - 573913043478260869, - 572669826224328593, - 571428571428571428, - 570189274447949526, - 568951930654058313, - 567716535433070866, - 566483084185680566, - 565251572327044025, - 564021995286724273, - 562794348508634222, - 561568627450980392, - 560344827586206896, - 559122944400939702, - 557902973395931142, - 556684910086004691, - 555468750000000000, - 555035128805620608, - 553822152886115444, - 552611067809820732, - 551401869158878504, - 550194552529182879, - 548989113530326594, - 547785547785547785, - 546583850931677018, - 545384018619084561, - 544186046511627906, - 542989930286599535, - 541795665634674922, - 540603248259860788, - 539412673879443585, - 538223938223938223, - 537037037037037037, - 535851966075558982, - 534668721109399075, - 533487297921478060, - 532307692307692307, - 531129900076863950, - 529953917050691244, - 528779739063699155, - 527607361963190184, - 526436781609195402, - 525267993874425727, - 524100994644223412, - 522935779816513761, - 521772345301757066, - 520610687022900763, - 519450800915331807, - 518292682926829268, - 517136329017517136, - 515981735159817351, - 514828897338403041, - 513677811550151975, - 512528473804100227, - 511380880121396054, - 510235026535253980, - 509090909090909090, - 507948523845571536, - 506807866868381240, - 505668934240362811, - 504531722054380664, - 503396226415094339, - 502262443438914027, - 501130369253956292, - 500000000000000000, - 499623777276147479, - 498496240601503759, - 497370398196844477, - 496246246246246246, - 495123780945236309, - 494002998500749625, - 492883895131086142, - 491766467065868263, - 490650710545998504, - 489536621823617339, - 488424197162061239, - 487313432835820895, - 486204325130499627, - 485096870342771982, - 483991064780342516, - 482886904761904761, - 481784386617100371, - 480683506686478454, - 479584261321455085, - 478486646884272997, - 477390659747961452, - 476296296296296296, - 475203552923760177, - 474112426035502958, - 473022912047302291, - 471935007385524372, - 470848708487084870, - 469764011799410029, - 468680913780397936, - 467599410898379970, - 466519499632082413, - 465441176470588235, - 464364437913299044, - 463289280469897209, - 462215700660308143, - 461143695014662756, - 460073260073260073, - 459004392386530014, - 457937088514996342, - 456871345029239766, - 455807158509861212, - 454744525547445255, - 453683442742523705, - 452623906705539358, - 451565914056809905, - 450509461426491994, - 449454545454545454, - 448401162790697674, - 447349310094408133, - 446298984034833091, - 445250181290790427, - 444202898550724637, - 443157132512671976, - 442112879884225759, - 441070137382501807, - 440028901734104046, - 438989169675090252, - 437950937950937950, - 436914203316510454, - 435878962536023054, - 434845212383009359, - 433812949640287769, - 432782171099928109, - 431752873563218390, - 430725053840631730, - 429698708751793400, - 428673835125448028, - 427650429799426934, - 426628489620615604, - 425608011444921316, - 424588992137240886, - 423571428571428571, - 422555317630264097, - 421540656205420827, - 420527441197434069, - 419515669515669515, - 418505338078291814, - 417496443812233285, - 416488983653162757, - 415482954545454545, - 414478353442157558, - 413475177304964539, - 412473423104181431, - 411473087818696883, - 410474168435951875, - 409476661951909476, - 408480565371024734, - 407485875706214689, - 406492589978828510, - 405500705218617771, - 404510218463706835, - 403521126760563380, - 402533427163969035, - 401547116736990154, - 400562192550948699, - 399578651685393258, - 398596491228070175, - 397615708274894810, - 396636299929922915, - 395658263305322128, - 394681595521343596, - 393706293706293706, - 392732354996505939, - 391759776536312849, - 390788555478018143, - 389818688981868898, - 388850174216027874, - 387883008356545961, - 386917188587334725, - 385952712100139082, - 384989576094510076, - 384027777777777777, - 383067314365024288, - 382108183079056865, - 381150381150381150, - 380193905817174515, - 379238754325259515, - 378284923928077455, - 377332411886662059, - 376381215469613259, - 375431331953071083, - 374482758620689655, - 373535492763611302, - 372589531680440771, - 371644872677219545, - 370701513067400275, - 369759450171821305, - 368818681318681318, - 367879203843514070, - 366941015089163237, - 366004112405757368, - 365068493150684931, - 364134154688569472, - 363201094391244870, - 362269309637730690, - 361338797814207650, - 360409556313993174, - 359481582537517053, - 358554873892297205, - 357629427792915531, - 356705241660993873, - 355782312925170068, - 354860639021074099, - 353940217391304347, - 353021045485403937, - 352103120759837177, - 351186440677966101, - 350271002710027100, - 349356804333107650, - 348443843031123139, - 347532116294793779, - 346621621621621621, - 345712356515867656, - 344804318488529014, - 343897505057316250, - 342991913746630727, - 342087542087542087, - 341184387617765814, - 340282447881640887, - 339381720430107526, - 338482202820685023, - 337583892617449664, - 336686787391012743, - 335790884718498659, - 334896182183523107, - 334002677376171352, - 333110367892976588, - 332219251336898395, - 331329325317301269, - 330440587449933244, - 329553035356904603, - 328666666666666666, - 327781479013990672, - 326897470039946737, - 326014637391882900, - 325132978723404255, - 324252491694352159, - 323373173970783532, - 322495023224950232, - 321618037135278514, - 320742213386348575, - 319867549668874172, - 318994043679682329, - 318121693121693121, - 317250495703899537, - 316380449141347424, - 315511551155115511, - 314643799472295514, - 313777191825972313, - 312911725955204216, - 312047399605003291, - 311184210526315789, - 310322156476002629, - 309461235216819973, - 308601444517399868, - 307742782152230971, - 306885245901639344, - 306028833551769331, - 305173542894564505, - 304319371727748691, - 303466317854807063, - 302614379084967320, - 301763553233180927, - 300913838120104438, - 300065231572080887, - 299217731421121251, - 298371335504885993, - 297526041666666666, - 296681847755367599, - 295838751625487646, - 294996751137102014, - 294155844155844155, - 293316028552887735, - 292477302204928664, - 291639662994167206, - 290803108808290155, - 289967637540453074, - 289133247089262613, - 288299935358758888, - 287467700258397932, - 286636539703034215, - 285806451612903225, - 284977433913604126, - 284149484536082474, - 283322601416613007, - 282496782496782496, - 281672025723472668, - 280848329048843187, - 280025690430314707, - 279204107830551989, - 278383579217447081, - 277564102564102564, - 276745675848814862, - 275928297055057618, - 275111964171465131, - 274296675191815856, - 273482428115015974, - 272669220945083014, - 271857051691129546, - 271045918367346938, - 270235818992989165, - 269426751592356687, - 268618714194780394, - 267811704834605597, - 267005721551176096, - 266200762388818297, - 265396825396825396, - 264593908629441624, - 263792010145846544, - 262991128010139416, - 262191260291323622, - 261392405063291139, - 260594560404807084, - 259797724399494310, - 259001895135818066, - 258207070707070707, - 257413249211356466, - 256620428751576292, - 255828607435412728, - 255037783375314861, - 254247954688483322, - 253459119496855345, - 252671275927089880, - 251884422110552763, - 251098556183301946, - 250313676286072772, - 249529780564263322, - 248746867167919799, - 247964934251721978, - 247183979974968710, - 246404002501563477, - 245625000000000000, - 245471580262336039, - 244694132334581772, - 243917654398003742, - 243142144638403990, - 242367601246105919, - 241594022415940224, - 240821406347230864, - 240049751243781094, - 239279055313859540, - 238509316770186335, - 237740533829919304, - 236972704714640198, - 236205827650340979, - 235439900867410161, - 234674922600619195, - 233910891089108910, - 233147804576376004, - 232385661310259579, - 231624459542927733, - 230864197530864197, - 230104873534855027, - 229346485819975339, - 228589032655576093, - 227832512315270935, - 227076923076923076, - 226322263222632226, - 225568531038721573, - 224815724815724815, - 224063842848373235, - 223312883435582822, - 222562844880441446, - 221813725490196078, - 221065523576240048, - 220318237454100367, - 219571865443425076, - 218826405867970660, - 218081857055589492, - 217338217338217338, - 216595485051860890, - 215853658536585365, - 215112736136502132, - 214372716199756394, - 213633597078514911, - 212895377128953771, - 212158054711246200, - 211421628189550425, - 210686095931997571, - 209951456310679611, - 209217707701637355, - 208484848484848484, - 207752877044215626, - 207021791767554479, - 206291591046581972, - 205562273276904474, - 204833836858006042, - 204106280193236714, - 203379601689800844, - 202653799758745476, - 201928872814948764, - 201204819277108433, - 200481637567730282, - 199759326113116726, - 199037883343355381, - 198317307692307692, - 197597597597597597, - 196878751500600240, - 196160767846430713, - 195443645083932853, - 194727381665668064, - 194011976047904191, - 193297426690604428, - 192583732057416267, - 191870890615660490, - 191158900836320191, - 190447761194029850, - 189737470167064439, - 189028026237328562, - 188319427890345649, - 187611673615247170, - 186904761904761904, - 186198691255205234, - 185493460166468489, - 184789067142008318, - 184085510688836104, - 183382789317507418, - 182680901542111506, - 181979845880260818, - 181279620853080568, - 180580224985198342, - 179881656804733727, - 179183914843287995, - 178486997635933806, - 177790903721204961, - 177095631641086186, - 176401179941002949, - 175707547169811320, - 175014731879787860, - 174322732626619552, - 173631547969393761, - 172941176470588235, - 172251616696061140, - 171562867215041128, - 170874926600117439, - 170187793427230046, - 169501466275659824, - 168815943728018757, - 168131224370240187, - 167447306791569086, - 166764189584552369, - 166081871345029239, - 165400350672121566, - 164719626168224299, - 164039696438995913, - 163360560093348891, - 162682215743440233, - 162004662004662004, - 161327897495631916, - 160651920838183934, - 159976730657358929, - 159302325581395348, - 158628704241719930, - 157955865272938443, - 157283807312826465, - 156612529002320185, - 155942028985507246, - 155272305909617612, - 154603358425014475, - 153935185185185185, - 153267784846732215, - 152601156069364161, - 151935297515886770, - 151270207852193995, - 150605885747259088, - 149942329873125720, - 149279538904899135, - 148617511520737327, - 147956246401842256, - 147295742232451093, - 146635997699827487, - 145977011494252873, - 145318782309017805, - 144661308840413318, - 144004589787722317, - 143348623853211009, - 142693409742120343, - 142038946162657502, - 141385231825987406, - 140732265446224256, - 140080045740423098, - 139428571428571428, - 138777841233580810, - 138127853881278538, - 137478608100399315, - 136830102622576966, - 136182336182336182, - 135535307517084282, - 134889015367103016, - 134243458475540386, - 133598635588402501, - 132954545454545454, - 132311186825667234, - 131668558456299659, - 131026659103800340, - 130385487528344671, - 129745042492917847, - 129105322763306908, - 128466327108092812, - 127828054298642533, - 127190503109101187, - 126553672316384180, - 125917560700169395, - 125282167042889390, - 124647490129723632, - 124013528748590755, - 123380281690140845, - 122747747747747747, - 122115925717501406, - 121484814398200224, - 120854412591343451, - 120224719101123595, - 119595732734418865, - 118967452300785634, - 118339876612450925, - 117713004484304932, - 117086834733893557, - 116461366181410974, - 115836597649692221, - 115212527964205816, - 114589155953046394, - 113966480446927374, - 113344500279173646, - 112723214285714285, - 112102621305075292, - 111482720178372352, - 110863509749303621, - 110244988864142538, - 109627156371730662, - 109010011123470522, - 108393551973318510, - 107777777777777777, - 107162687395891171, - 106548279689234184, - 105934553521907931, - 105321507760532150, - 104709141274238227, - 104097452934662236, - 103486441615938018, - 102876106194690265, - 102266445550027639, - 101657458563535911, - 101049144119271120, - 100441501103752759, - 99834528405956977, - 99228224917309812, - 98622589531680440, - 98017621145374449, - 97413318657127132, - 96809680968096809, - 96206706981858163, - 95604395604395604, - 95002745744096650, - 94401756311745334, - 93801426220515633, - 93201754385964912, - 92602739726027397, - 92004381161007667, - 91406677613574165, - 90809628008752735, - 90213231273920174, - 89617486338797814, - 89022392135445111, - 88427947598253275, - 87834151663938897, - 87241003271537622, - 86648501362397820, - 86056644880174291, - 85465432770821992, - 84874863982589771, - 84284937466014138, - 83695652173913043, - 83107007061379684, - 82519001085776330, - 81931633206728160, - 81344902386117136, - 80758807588075880, - 80173347778981581, - 79588521927449918, - 79004329004329004, - 78420767982693347, - 77837837837837837, - 77255537547271745, - 76673866090712742, - 76092822450080949, - 75512405609492988, - 74932614555256064, - 74353448275862068, - 73774905761981690, - 73196986006458557, - 72619688004303388, - 72043010752688172, - 71466953250940354, - 70891514500537056, - 70316693505099302, - 69742489270386266, - 69168900804289544, - 68595927116827438, - 68023567220139260, - 67451820128479657, - 66880684858212948, - 66310160427807486, - 65740245857830037, - 65170940170940170, - 64602242391884676, - 64034151547491995, - 63466666666666666, - 62899786780383795, - 62333510921683537, - 61767838125665601, - 61202767429483767, - 60638297872340425, - 60074428495481127, - 59511158342189160, - 58948486457780138, - 58386411889596602, - 57824933687002652, - 57264050901378579, - 56703762586115527, - 56144067796610169, - 55584965590259396, - 55026455026455026, - 54468535166578529, - 53911205073995771, - 53354463814051769, - 52798310454065469, - 52242744063324538, - 51687763713080168, - 51133368476541908, - 50579557428872497, - 50026329647182727, - 49473684210526315, - 48921620199894792, - 48370136698212407, - 47819232790331056, - 47268907563025210, - 46719160104986876, - 46169989506820566, - 45621394861038280, - 45073375262054507, - 44525929806181246, - 43979057591623036, - 43432757718472004, - 42887029288702928, - 42341871406168322, - 41797283176593521, - 41253263707571801, - 40709812108559498, - 40166927490871152, - 39624608967674661, - 39082855653986451, - 38541666666666666, - 38001041124414367, - 37460978147762747, - 36921476859074362, - 36382536382536382, - 35844155844155844, - 35306334371754932, - 34769071094966268, - 34232365145228215, - 33696215655780196, - 33160621761658031, - 32625582599689280, - 32091097308488612, - 31557165028453181, - 31023784901758014, - 30490956072351421, - 29958677685950413, - 29426948890036138, - 28895768833849329, - 28365136668385765, - 27835051546391752, - 27305512622359608, - 26776519052523171, - 26248069994853319, - 25720164609053497, - 25192802056555269, - 24665981500513874, - 24139702105803800, - 23613963039014373, - 23088763468445356, - 22564102564102564, - 22039979497693490, - 21516393442622950, - 20993343573988735, - 20470829068577277, - 19948849104859335, - 19427402862985685, - 18906489524782830, - 18386108273748723, - 17866258295048494, - 17346938775510204, - 16828148903620601, - 16309887869520897, - 15792154865002547, - 15274949083503054, - 14758269720101781, - 14242115971515768, - 13726487036095577, - 13211382113821138, - 12696800406297613, - 12182741116751269, - 11669203450025367, - 11156186612576064, - 10643689812468322, - 10131712259371833, - 9620253164556962, - 9109311740890688, - 8598887202832574, - 8088978766430738, - 7579585649317837, - 7070707070707070, - 6562342251388187, - 6054490413723511, - 5547150781643973, - 5040322580645161, - 4534005037783375, - 4028197381671701, - 3522898842476094, - 3018108651911468, - 2513826043237807, - 2010050251256281, - 1506780512305374, - 1004016064257028, - 501756146512794 - ] - }, - "continued": { - "": [ - 334001336005344021, - 333110814419225634, - 332221480987324883, - 331333333333333333, - 330446369087275149, - 329560585885486018, - 328675981370592149, - 327792553191489361, - 326910299003322259, - 326029216467463479, - 325149303251493032, - 324270557029177718, - 323392975480450629, - 322516556291390728, - 321641297154202514, - 320767195767195767, - 319894249834765366, - 319022457067371202, - 318151815181518151, - 317282321899736147, - 316413974950560316, - 315546772068511198, - 314680710994075049, - 313815789473684210, - 312952005259697567, - 312089356110381077, - 311227839789888378, - 310367454068241469, - 309508196721311475, - 308650065530799475, - 307793058284217419, - 306937172774869109, - 306082406801831262, - 305228758169934640, - 304376224689745264, - 303524804177545691, - 302674494455316373, - 301825293350717079, - 300977198697068403, - 300130208333333333, - 299284320104098893, - 298439531859557867, - 297595841455490578, - 296753246753246753, - 295911745619727449, - 295071335927367055, - 294232015554115359, - 293393782383419689, - 292556634304207119, - 291720569210866752, - 290885585003232062, - 290051679586563307, - 289218850871530019, - 288387096774193548, - 287556415215989684, - 286726804123711340, - 285898261429491307, - 285070785070785070, - 284244372990353697, - 283419023136246786, - 282594733461785484, - 281771501925545571, - 280949326491340602, - 280128205128205128, - 279308135810377962, - 278489116517285531, - 277671145233525271, - 276854219948849104, - 276038338658146964, - 275223499361430395, - 274409700063816209, - 273596938775510204, - 272785213511790949, - 271974522292993630, - 271164863144493952, - 270356234096692111, - 269548633184996821, - 268742058449809402, - 267936507936507936, - 267131979695431472, - 266328471781864299, - 265525982256020278, - 264724509183027232, - 263924050632911392, - 263124604680581910, - 262326169405815423, - 261528742893240682, - 260732323232323232, - 259936908517350157, - 259142496847414880, - 258349086326402016, - 257556675062972292, - 256765261170547514, - 255974842767295597, - 255185417976115650, - 254396984924623115, - 253609541745134965, - 252823086574654956, - 252037617554858934, - 251253132832080200, - 250469630557294927, - 249687108886107634, - 248905565978736710, - 248125000000000000, - 247970018738288569, - 247191011235955056, - 246412975670617592, - 245635910224438902, - 244859813084112149, - 244084682440846824, - 243310516490354698, - 242537313432835820, - 241765071472964574, - 240993788819875776, - 240223463687150837, - 239454094292803970, - 238685678859268443, - 237918215613382899, - 237151702786377708, - 236386138613861386, - 235621521335807050, - 234857849196538936, - 234095120444718962, - 233333333333333333, - 232572486119679210, - 231812577065351418, - 231053604436229205, - 230295566502463054, - 229538461538461538, - 228782287822878228, - 228027043638598647, - 227272727272727272, - 226519337016574585, - 225766871165644171, - 225015328019619865, - 224264705882352941, - 223515003061849357, - 222766217870257037, - 222018348623853211, - 221271393643031784, - 220525351252290775, - 219780219780219780, - 219035997559487492, - 218292682926829268, - 217550274223034734, - 216808769792935444, - 216068167985392574, - 215328467153284671, - 214589665653495440, - 213851761846901579, - 213114754098360655, - 212378640776699029, - 211643420254699818, - 210909090909090909, - 210175651120533010, - 209443099273607748, - 208711433756805807, - 207980652962515114, - 207250755287009063, - 206521739130434782, - 205793602896801448, - 205066344993968636, - 204339963833634719, - 203614457831325301, - 202889825406381697, - 202166064981949458, - 201443174984966927, - 200721153846153846, - 200000000000000000, - 199879951980792316, - 199160167966406718, - 198441247002398081, - 197723187537447573, - 197005988023952095, - 196289646918013165, - 195574162679425837, - 194859533771667662, - 194145758661887694, - 193432835820895522, - 192720763723150357, - 192009540846750149, - 191299165673420738, - 190589636688505062, - 189880952380952380, - 189173111243307555, - 188466111771700356, - 187759952465834818, - 187054631828978622, - 186350148367952522, - 185646500593119810, - 184943687018375815, - 184241706161137440, - 183540556542332741, - 182840236686390532, - 182140745121230041, - 181442080378250591, - 180744240992321323, - 180047225501770956, - 179351032448377581, - 178655660377358490, - 177961107837360047, - 177267373380447585, - 176574455562095350, - 175882352941176470, - 175191064079952968, - 174500587544065804, - 173810921902524955, - 173122065727699530, - 172434017595307917, - 171746776084407971, - 171060339777387229, - 170374707259953161, - 169689877121123464, - 169005847953216374, - 168322618351841028, - 167640186915887850, - 166958552247518972, - 166277712952158693, - 165597667638483965, - 164918414918414918, - 164239953407105416, - 163562281722933643, - 162885398487492728, - 162209302325581395, - 161533991865194654, - 160859465737514518, - 160185722576900754, - 159512761020881670, - 158840579710144927, - 158169177288528389, - 157498552403011001, - 156828703703703703, - 156159629843840370, - 155491329479768786, - 154823801270941652, - 154157043879907621, - 153491055972302365, - 152825836216839677, - 152161383285302593, - 151497695852534562, - 150834772596430627, - 150172612197928653, - 149511213341000575, - 148850574712643678, - 148190695002871912, - 147531572904707233, - 146873207114170969, - 146215596330275229, - 145558739255014326, - 144902634593356242, - 144247281053234115, - 143592677345537757, - 142938822184105202, - 142285714285714285, - 141633352370074243, - 140981735159817351, - 140330861380490587, - 139680729760547320, - 139031339031339031, - 138382687927107061, - 137734775184974388, - 137087599544937428, - 136441159749857873, - 135795454545454545, - 135150482680295286, - 134506242905788876, - 133862733976176971, - 133219954648526077, - 132577903682719546, - 131936579841449603, - 131295981890209394, - 130656108597285067, - 130016958733747880, - 129378531073446327, - 128740824392998306, - 128103837471783295, - 127467569091934574, - 126832018038331454, - 126197183098591549, - 125563063063063063, - 124929656724817107, - 124296962879640044, - 123664980326025857, - 123033707865168539, - 122403144300954519, - 121773288439955106, - 121144139091418956, - 120515695067264573, - 119887955182072829, - 119260918253079507, - 118634583100167879, - 118008948545861297, - 117384013415315818, - 116759776536312849, - 116136236739251814, - 115513392857142857, - 114891243725599553, - 114269788182831661, - 113649025069637883, - 113028953229398663, - 112409571508069003, - 111790878754171301, - 111172873818788215, - 110555555555555555, - 109938922820655191, - 109322974472807991, - 108707709373266777, - 108093126385809312, - 107479224376731301, - 106866002214839424, - 106253458771444382, - 105641592920353982, - 105030403537866224, - 104419889502762430, - 103810049696300386, - 103200883002207505, - 102592388306674020, - 101984564498346196, - 101377410468319559, - 100770925110132158, - 100165107319757842, - 99559955995599559, - 98955470038482682, - 98351648351648351, - 97748489840746842, - 97145993413830954, - 96544157981349424, - 95942982456140350, - 95342465753424657, - 94742606790799561, - 94143404488232074, - 93544857768052516, - 92946965554948059, - 92349726775956284, - 91753140360458765, - 91157205240174672, - 90561920349154391, - 89967284623773173, - 89373297002724795, - 88779956427015250, - 88187261839956450, - 87595212187159956, - 87003806416530723, - 86413043478260869, - 85822922324823465, - 85233441910966340, - 84644601193705914, - 84056399132321041, - 83468834688346883, - 82881906825568797, - 82295614510016242, - 81709956709956709, - 81124932395889670, - 80540540540540540, - 79956780118854673, - 79373650107991360, - 78791149487317862, - 78209277238403451, - 77628032345013477, - 77047413793103448, - 76467420570813139, - 75888051668460710, - 75309306078536847, - 74731182795698924, - 74153680816765180, - 73576799140708915, - 73000536768652710, - 72424892703862660, - 71849865951742627, - 71275455519828510, - 70701660417782538, - 70128479657387580, - 69555912252541466, - 68983957219251336, - 68412613575628006, - 67841880341880341, - 67271756540309663, - 66702241195304162, - 66133333333333333, - 65565031982942430, - 64997336174746936, - 64430244941427050, - 63863757317722192, - 63297872340425531, - 62732589048378522, - 62167906482465462, - 61603823685608072, - 61040339702760084, - 60477453580901856, - 59915164369034994, - 59353471118177000, - 58792372881355932, - 58231868713605082, - 57671957671957671, - 57112638815441565, - 56553911205073995, - 55995773903856312, - 55438225976768743, - 54881266490765171, - 54324894514767932, - 53769109119662625, - 53213909378292939, - 52659294365455502, - 52105263157894736, - 51551814834297738, - 50998948475289169, - 50446663163426169, - 49894957983193277, - 49343832020997375, - 48793284365162644, - 48243314105925537, - 47693920335429769, - 47145102147721320, - 46596858638743455, - 46049188906331763, - 45502092050209205, - 44955567171981181, - 44409613375130616, - 43864229765013054, - 43319415448851774, - 42775169535732916, - 42231491136600625, - 41688379364252214, - 41145833333333333, - 40603852160333159, - 40062434963579604, - 39521580863234529, - 38981288981288981, - 38441558441558441, - 37902388369678089, - 37363777893098079, - 36825726141078838, - 36288232244686365, - 35751295336787564, - 35214914552045572, - 34679089026915113, - 34143817899637868, - 33609100310237849, - 33074935400516795, - 32541322314049586, - 32008260196179659, - 31475748194014447, - 30943785456420835, - 30412371134020618, - 29881504379185986, - 29351184346035015, - 28821410190427174, - 28292181069958847, - 27763496143958868, - 27235354573484069, - 26707755521314843, - 26180698151950718, - 25654181631605951, - 25128205128205128, - 24602767811378780, - 24077868852459016, - 23553507424475166, - 23029682702149437, - 22506393861892583, - 21983640081799591, - 21461420541645375, - 20939734422880490, - 20418580908626850, - 19897959183673469, - 19377868434472208, - 18858307849133537, - 18339276617422312, - 17820773930753564, - 17302798982188295, - 16785350966429298, - 16268429079816980, - 15752032520325203, - 15236160487557135, - 14720812182741116, - 14205986808726534, - 13691683569979716, - 13177901672579827, - 12664640324214792, - 12151898734177215, - 11639676113360323, - 11127971674253920, - 10616784630940343, - 10106114199090449, - 9595959595959595, - 9086320040383644, - 8577194752774974, - 8068582955118507, - 7560483870967741, - 7052896725440806, - 6545820745216515, - 6039255158530447, - 5533199195171026, - 5027652086475615, - 4522613065326633, - 4018081366147664, - 3514056224899598, - 3010536879076768, - 2507522567703109, - 2005012531328320, - 1503006012024048, - 1001502253380070, - 500500500500500, - 500250125062531, - 500000000000000, - 499750124937531, - 499500499500499, - 499251123315027, - 499001996007984, - 498753117206982, - 498504486540378, - 498256103637269 - ] + "1e3_max_mag": { + "0%_in_withdrawal_queue": { + "dataX": [ + 9900990099009900, + 19801980198019801, + 29702970297029702, + 39603960396039603, + 49504950495049504, + 59405940594059405, + 69306930693069306, + 79207920792079207, + 89108910891089108, + 99009900990099009, + 108910891089108910, + 118811881188118811, + 128712871287128712, + 138613861386138613, + 148514851485148514, + 158415841584158415, + 168316831683168316, + 178217821782178217, + 188118811881188118, + 198019801980198019, + 207920792079207920, + 217821782178217821, + 227722772277227722, + 237623762376237623, + 247524752475247524, + 257425742574257425, + 267326732673267326, + 277227722772277227, + 287128712871287128, + 297029702970297029, + 306930693069306930, + 316831683168316831, + 326732673267326732, + 336633663366336633, + 346534653465346534, + 356435643564356435, + 366336633663366336, + 376237623762376237, + 386138613861386138, + 396039603960396039, + 405940594059405940, + 415841584158415841, + 425742574257425742, + 435643564356435643, + 445544554455445544, + 455445544554455445, + 465346534653465346, + 475247524752475247, + 485148514851485148, + 495049504950495049, + 504950495049504950, + 514851485148514851, + 524752475247524752, + 534653465346534653, + 544554455445544554, + 554455445544554455, + 564356435643564356, + 574257425742574257, + 584158415841584158, + 594059405940594059, + 603960396039603960, + 613861386138613861, + 623762376237623762, + 633663366336633663, + 643564356435643564, + 653465346534653465, + 663366336633663366, + 673267326732673267, + 683168316831683168, + 693069306930693069, + 702970297029702970, + 712871287128712871, + 722772277227722772, + 732673267326732673, + 742574257425742574, + 752475247524752475, + 762376237623762376, + 772277227722772277, + 782178217821782178, + 792079207920792079, + 801980198019801980, + 811881188118811881, + 821782178217821782, + 831683168316831683, + 841584158415841584, + 851485148514851485, + 861386138613861386, + 871287128712871287, + 881188118811881188, + 891089108910891089, + 900990099009900990, + 910891089108910891, + 920792079207920792, + 930693069306930693, + 940594059405940594, + 950495049504950495, + 960396039603960396, + 970297029702970297, + 980198019801980198, + 990099009900990099 + ], + "dataY": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99 + ] + }, + "00_001%_in_withdrawal_queue": {}, + "10%_in_withdrawal_queue": {}, + "50%_in_withdrawal_queue": {}, + "90%_in_withdrawal_queue": {}, + "99_999%_in_withdrawal_queue": {}, + "100%_in_withdrawal_queue": { + "dataX": [ + 9900990099009900, + 19801980198019801, + 29702970297029702, + 39603960396039603, + 49504950495049504, + 59405940594059405, + 69306930693069306, + 79207920792079207, + 89108910891089108, + 99009900990099009, + 108910891089108910, + 118811881188118811, + 128712871287128712, + 138613861386138613, + 148514851485148514, + 158415841584158415, + 168316831683168316, + 178217821782178217, + 188118811881188118, + 198019801980198019, + 207920792079207920, + 217821782178217821, + 227722772277227722, + 237623762376237623, + 247524752475247524, + 257425742574257425, + 267326732673267326, + 277227722772277227, + 287128712871287128, + 297029702970297029, + 306930693069306930, + 316831683168316831, + 326732673267326732, + 336633663366336633, + 346534653465346534, + 356435643564356435, + 366336633663366336, + 376237623762376237, + 386138613861386138, + 396039603960396039, + 405940594059405940, + 415841584158415841, + 425742574257425742, + 435643564356435643, + 445544554455445544, + 455445544554455445, + 465346534653465346, + 475247524752475247, + 485148514851485148, + 495049504950495049, + 504950495049504950, + 514851485148514851, + 524752475247524752, + 534653465346534653, + 544554455445544554, + 554455445544554455, + 564356435643564356, + 574257425742574257, + 584158415841584158, + 594059405940594059, + 603960396039603960, + 613861386138613861, + 623762376237623762, + 633663366336633663, + 643564356435643564, + 653465346534653465, + 663366336633663366, + 673267326732673267, + 683168316831683168, + 693069306930693069, + 702970297029702970, + 712871287128712871, + 722772277227722772, + 732673267326732673, + 742574257425742574, + 752475247524752475, + 762376237623762376, + 772277227722772277, + 782178217821782178, + 792079207920792079, + 801980198019801980, + 811881188118811881, + 821782178217821782, + 831683168316831683, + 841584158415841584, + 851485148514851485, + 861386138613861386, + 871287128712871287, + 881188118811881188, + 891089108910891089, + 900990099009900990, + 910891089108910891, + 920792079207920792, + 930693069306930693, + 940594059405940594, + 950495049504950495, + 960396039603960396, + 970297029702970297, + 980198019801980198, + 990099009900990099 + ], + "dataY": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99 + ] + } } } \ No newline at end of file diff --git a/src/test/integration/params.toml b/src/test/integration/params.toml index 5f4b9310c9..7351a6cf0e 100644 --- a/src/test/integration/params.toml +++ b/src/test/integration/params.toml @@ -1,12 +1,110 @@ -printLast = 5 -printEvery = 1 -writeJSON = 0 +# 1e18 = 1000000000000000000 -prevDepositShares = 496 +## max extract +# operatorShares = 10000000000000000000000000 # 1e18 +operatorSharesExp = 32 +# wadsToSlash = 1000000000000000000 # 1e18 +# wadsToSlash = 950000000000000000 +# wadsToSlash = 1000000000 # 1e9 +wadsToSlash = 500000000000000000 + + +## scratch +numIterations = 100000 +# 0: _randomS +# 1: _randomD +# 2: _contrivedS +# 3: _contrivedD +genMethod = 3 +contrivedShares = 1000000000000000000 # 1e18 +contrivedDiff = 900000000000000000 # 9e17 + +prevDepositShares = 10 iterations = 0 startDSF = 1000000000000000000 -startShares = 1 -startSharesToAdd = 2 +startShares = 100 +startSharesToAdd = 1 maxMagDecrease = 0 -contIterations = 3 \ No newline at end of file +contIterations = 1000 + +fuzzRuns = 100000 +sequenceLength = 106 + +seqStartDSF = 1000000000000000000 +seqStartShares = 1000000 + +# Operations: +# 0 -> deposit `amount` shares +# 1 -> queue withdrawal `amount` shares +# 2 -> continue previous operation `amount` times +# 3 -> continue previous two operations `amount` times +## Original +[[sequence]] +amount = 1 +operation = 0 + +[[sequence]] +amount = 1000011 +operation = 2 + +[[sequence]] +amount = 1 +operation = 0 + +[[sequence]] +amount = 1 +operation = 0 + +[[sequence]] +amount = 1 +operation = 0 + +[[sequence]] +amount = 1 +operation = 0 + +[[sequence]] +amount = 1 +operation = 0 + +# output instructions for all tests +[init] +printEvery = 3 +printLast = 4 +writeJSON = true +writeLocation = "src/test/integration/output.json" + +# prefaced a_, b_, because foundry's TOML -> struct conversion depends on alphabetical order + +[generate] +a_totalShares = 100 +b_wadsInWithdrawalQueue = 1000000000000000000 +# b_wadsInWithdrawalQueue = 0 +c_maxMagnitudeExp = 18 +d_numDataPoints = 100 + +# Plot/Line/Labels +m_plotName = "1e3_max_mag" +n_lineLabel = "100%_in_withdrawal_queue" + +# File IO +t_writeToFile = true +u_writeLocationBase = "src/test/integration/" +v_fileName = "output.json" + +# 00_001 run +# [generate] +# a_totalShares = 1000000000000000000 # 1e18 +# b_wadsInWithdrawalQueue = 1000 +# c_maxMagnitudeExp = 3 +# d_numDataPoints = 10 + +# # Plot/Line/Labels +# m_plotName = "1e3_max_mag" +# n_lineLabel = "00_001%_in_withdrawal_queue" + +# # File IO +# t_writeToFile = true +# u_writeLocationBase = "src/test/integration/" +# v_fileName = "output.json" \ No newline at end of file diff --git a/src/test/integration/tests/RoundingDeallocation.t.sol b/src/test/integration/tests/RoundingDeallocation.t.sol index 074a78349b..337843971f 100644 --- a/src/test/integration/tests/RoundingDeallocation.t.sol +++ b/src/test/integration/tests/RoundingDeallocation.t.sol @@ -13,83 +13,621 @@ contract Integration_Rounding_Deallocation is IntegrationCheckUtils { using StdStyle for *; using Strings for *; using Math for *; + using SlashingLib for *; + + uint printLast = 3; + uint printEvery = 100; + bool writeJSON = false; + string writeLocation = "src/test/integration/output.json"; - struct Magnitude { - uint64 max; - uint64 cur; - uint64 available; - uint64 pendDealloc; + struct InitTOML { + uint printEvery; + uint printLast; + bool writeJSON; + string writeLocation; } - enum ValueMod { - SUB, - NONE, - ADD + function _init() internal override { + string memory tomlRAW = cheats.readFile("src/test/integration/params.toml"); + bytes memory data = vm.parseToml(tomlRAW, ".init"); + InitTOML memory it = abi.decode(data, (InitTOML)); + + printLast = it.printLast; + printEvery = it.printEvery; + writeJSON = it.writeJSON; + writeLocation = it.writeLocation; + + console.log(""); + console.log("==Init==".magenta()); + + // console.log(" - printing final %d inputs", printLast); + // console.log(" - printing other inputs every %d iterations", printEvery); + if (writeJSON) { + console.log(" - writing to file: %s".green(), writeLocation); + } else { + console.log(" - writing to file: false"); + } } - struct Slash { - uint8 mantissa; - uint8 exponent; - ValueMod vMod; + struct GenerateSettings { + // Initial run params + uint totalShares; + uint wadsInWithdrawalQueue; + uint64 maxMagnitude; + uint numDataPoints; + + // Derived params + uint depositSharesToWithdraw; + uint operatorShares; + uint scaledShares; + + // Plot/Line/Labels + string plotName; + string lineLabel; + + // File IO + bool writeToFile; + string writeLocation; } - Magnitude mag; - Slash slash; + struct GenerateOutput { + uint[] x; + uint[] y; + } - using SlashingLib for *; + function test_Generate() public rand(0) { + GenerateSettings memory settings = _readGenerateTOML(); + + GenerateOutput memory data = GenerateOutput({ + x: new uint[](settings.numDataPoints), + y: new uint[](settings.numDataPoints) + }); + + for (uint i = 0; i < settings.numDataPoints; i++) { + /// 3. Calc how much to slash, proportional to the number of + uint wadsToSlash = (i + 1).mulDiv(WAD, settings.numDataPoints + 1); + + /// 4. Commit offense and get slashed + uint64 slashedMagnitude = uint64(uint(settings.maxMagnitude).mulWadRoundUp(wadsToSlash)); + uint64 newMaxMag = settings.maxMagnitude - slashedMagnitude; + + /// 5. How much gets redistributed? + // From operator shares... + uint amountOpShares = settings.operatorShares.calcSlashedAmount({ + prevMaxMagnitude: settings.maxMagnitude, + newMaxMagnitude: newMaxMag + }); + // From withdrawal queue... + uint amountWQShares = settings.scaledShares.scaleForBurning({ + prevMaxMagnitude: settings.maxMagnitude, + newMaxMagnitude: newMaxMag + }); + // Total: + uint totalRedistributed = amountOpShares + amountWQShares; + if (totalRedistributed > settings.totalShares) { + revert("minted shares!!".red().bold()); + } + + // 6. Add points to data + data.x[i] = uint(slashedMagnitude); + data.y[i] = totalRedistributed; + } + + _writeGenerateJSON(settings, data); + + revert("finished".green().bold()); + } + + struct GenerateTOML { + uint totalShares; + uint wadsInWithdrawalQueue; + uint maxMagnitudeExp; + uint numDataPoints; + string plotName; + string lineLabel; + bool writeToFile; + string writeLocationBase; + string fileName; + } + + function _readGenerateTOML() internal returns (GenerateSettings memory settings) { + string memory tomlRAW = cheats.readFile("src/test/integration/params.toml"); + bytes memory data = vm.parseToml(tomlRAW, ".generate"); + GenerateTOML memory gt = abi.decode(data, (GenerateTOML)); + + settings = GenerateSettings({ + totalShares: gt.totalShares, + wadsInWithdrawalQueue: gt.wadsInWithdrawalQueue, + maxMagnitude: uint64(10 ** gt.maxMagnitudeExp), + numDataPoints: gt.numDataPoints, + depositSharesToWithdraw: 0, + operatorShares: 0, + scaledShares: 0, + plotName: gt.plotName, + lineLabel: gt.lineLabel, + writeToFile: gt.writeToFile, + writeLocation: string.concat(gt.writeLocationBase, gt.fileName) + }); + + // Adjust/calculate + if (settings.numDataPoints > uint(settings.maxMagnitude)) { + settings.numDataPoints = uint(settings.maxMagnitude); + } + + console.log(""); + console.log("==Generate Settings==".magenta()); + + console.log(" plot: '%s'".yellow(), settings.plotName); + console.log(" line: '%s'".yellow(), settings.lineLabel); + if (settings.writeToFile) { + console.log(" - writing to file: %s".green(), settings.writeLocation); + } else { + console.log(" - writing to file: false".green().dim()); + } + + console.log(""); + console.log("==Run Info==".magenta()); + + /// 1. depositIntoStrategy: Simulate a deposit of totalShares into operator with given magnitude + scratchDSF.reset(); + scratchDSF.update({ + prevDepositShares: 0, + addedShares: settings.totalShares, + slashingFactor: settings.maxMagnitude + }); + + /// 2. queueWithdrawal: Queue a proportion of deposit shares for withdrawal + // Amount of deposit shares to withdraw + settings.depositSharesToWithdraw = settings.totalShares.mulWad(settings.wadsInWithdrawalQueue); + // Amount to reduce operator's shares by + uint withdrawable_Mid = scratchDSF.calcWithdrawable(settings.depositSharesToWithdraw, settings.maxMagnitude); + settings.operatorShares = settings.totalShares - withdrawable_Mid; + // Scaled shares added to the withdrawal queue + settings.scaledShares = scratchDSF.scaleForQueueWithdrawal(settings.depositSharesToWithdraw); + + + // console.log(" -- depositSh. to queue: %s (%d)".dim().yellow().italic(), _pretty(settings.depositSharesToWithdraw), settings.depositSharesToWithdraw); + console.log(" - numDataPoints: %d".dim().yellow(), settings.numDataPoints); + console.log(" - maxMagnitude: %s (%d)".dim().yellow(), _pretty(settings.maxMagnitude), settings.maxMagnitude); + console.log(" - totalShares: %s (%d)".dim().yellow(), _pretty(settings.totalShares), settings.totalShares); + console.log(" -- % in withdrawal queue: %s (raw wads: %d)".dim().yellow(), _prettyPerc(gt.wadsInWithdrawalQueue, 1e18), gt.wadsInWithdrawalQueue); + console.log(" -- operatorShares: %s (%d)".dim().yellow(), _pretty(settings.operatorShares), settings.operatorShares); + console.log(" -- queuedShares (scaled): %s (%d)".dim().yellow(), _pretty(settings.scaledShares), settings.scaledShares); + + console.log(""); + + return settings; + } + + function _writeGenerateJSON( + GenerateSettings memory settings, + GenerateOutput memory output + ) internal { + require(output.x.length == output.y.length, "length err"); + + if (!settings.writeToFile) return; + + console.log(""); + console.log(" writing output to file: %s...".green().dim(), settings.writeLocation); + + // Serialize x and y points + string memory data = cheats.serializeUint(settings.lineLabel, "dataX", output.x); + data = cheats.serializeUint(settings.lineLabel, "dataY", output.y); + + // Get key for which data will be replaced + string memory valueKey = string.concat(".", settings.plotName, ".", settings.lineLabel); + console.log(" overwriting existing value for key: %s".green().dim(), valueKey); + + // Write to file + cheats.writeJson(data, settings.writeLocation, valueKey); + console.log(" done!\n".green()); + } + + function test_WTF(uint8 sharesExp, uint64 diff) public rand(0) { + // prevMM = uint64(bound(prevMM, 1, WAD)); + // newMM = prevMM == 1 ? 0 : uint64(bound(newMM, 0, prevMM-1)); + diff = uint64(bound(diff, 1, WAD)); + // uint shares = uint(WAD / diff); + // shares > 2 ? shares-- : shares; + sharesExp = uint8(bound(sharesExp, 1, 32)); + // uint shares = bound(shares, 10, 1e18); + uint shares = 10 ** sharesExp; + + uint64 prevMM = WAD; + uint64 newMM = prevMM - uint64(diff); + + console.log(" - shares: %s (%d)", _pretty(shares), shares); + console.log(" - prevMM: %s (%d)", _pretty(prevMM), prevMM); + console.log(" - newMM: %s (%d)", _pretty(newMM), newMM); + + uint opShares = shares.calcSlashedAmount(prevMM, newMM); + uint wqShares = shares.scaleForBurning(prevMM, newMM); + + console.log(" - opShares: %s (%d)", _pretty(opShares), opShares); + console.log(" - wqShares: %s (%d)", _pretty(wqShares), wqShares); + + assertEq(opShares, wqShares, "fail".green().bold()); + } + + uint OPERATOR_SHARES; + uint WADS_TO_SLASH; + + struct Params { + // Random: + uint64 prevMM; + uint wadsInWQ; + // Derived: + uint64 newMM; + uint depositSharesToWithdraw; + uint operatorShares; + uint scaledShares; + + // Derived - withdrawable: + uint dsf; + uint withdrawableStart; + + // Results: + uint expectedRedistribution; + uint amountRedistributed; + uint completeWithdrawal; + uint withdrawRemaining; + uint completeExit; + uint totalWithdrawn; + uint totalMissing; + uint abs_Error; + } + + DepositScalingFactor scratchDSF; + Params[] points; + + uint min_Amt = type(uint).max; + uint max_Amt = 0; + + function test_MaxExtract() public rand(0) { + _readExtractTOML(); + + // 3 different strategies to explore: + // + // 1. Minimize the amount the AVS can redistribute + // 2. Maximize the amount the operator can recover via queued withdrawals + // 3. Minimize the amount the operator can recover via queued withdrawals + // -- this last one is to simulate "operator griefing stakers" + // + // The idea is that "the operator expects a 10% slash", and sets up: + // - prevMM (their allocation) + // -- Might want to parameterize this somewhat, assuming AVSs don't accept + // allocations below some size (MINIMUM_MAGNITUDE_ACCEPTED) + // - the amount of their assets in the withdrawal queue vs out (operatorShares vs queuedShares) + // - their DSF !? + // -- we can lower this pretty easily... (but this would apply to 2, not 3) + // -- what if this starts with intentionally slashing themselves and depositing to get a positive DSF? + + Params memory params; + + for (uint i = 0; i < NUM_ITERATIONS; i++) { + scratchDSF.reset(); + + // Generate random params: + params.prevMM = uint64(cheats.randomUint(1, WAD)); + params.wadsInWQ = cheats.randomUint(1, WAD); + + { + /// Calc derived params: + + /// 1. Deposit OPERATOR_SHARES into operator with max mag == prevMM + scratchDSF.update({ + prevDepositShares: 0, + addedShares: OPERATOR_SHARES, + slashingFactor: params.prevMM + }); + params.dsf = scratchDSF._scalingFactor; + params.withdrawableStart = scratchDSF.calcWithdrawable(OPERATOR_SHARES, params.prevMM); + + /// 2. Queue a proportion of the shares for withdrawal + params.depositSharesToWithdraw = OPERATOR_SHARES.mulWad(params.wadsInWQ); + // Amount to reduce operator's shares by + uint withdrawable_Mid = scratchDSF.calcWithdrawable(params.depositSharesToWithdraw, params.prevMM); + params.operatorShares = OPERATOR_SHARES - withdrawable_Mid; + // Amount we add to withdrawal queue (and withdrawal object) + params.scaledShares = scratchDSF.scaleForQueueWithdrawal(params.depositSharesToWithdraw); + + /// 3. Commit offense and get slashed + uint64 slashedMagnitude = uint64(uint(params.prevMM).mulWadRoundUp(WADS_TO_SLASH)); + params.newMM = params.prevMM - slashedMagnitude; + params.expectedRedistribution = OPERATOR_SHARES.calcSlashedAmount(params.prevMM, params.newMM); + } + + { + // How much actually gets redistributed? + uint amountOpShares = params.operatorShares.calcSlashedAmount(params.prevMM, params.newMM); + uint amountWQShares = params.scaledShares.scaleForBurning(params.prevMM, params.newMM); + + params.amountRedistributed = amountOpShares + amountWQShares; + } - DepositScalingFactor dsf; + { + // How much can the operator withdraw by completing their existing withdrawal + params.completeWithdrawal = params.scaledShares.scaleForCompleteWithdrawal(params.newMM); + } - function test_DSF_Manip(uint scalingFactor, uint prevDepositShares, uint addedShares, uint slashingFactor) public rand(0) { - scalingFactor = bound(scalingFactor, 1, WAD); - prevDepositShares = bound(prevDepositShares, 0, uint(type(uint8).max)); - addedShares = bound(addedShares, 0, uint(type(uint8).max)); - slashingFactor = bound(slashingFactor, 1, 1e18); + { + // How much can the operator withdraw by withdrawing the remainder of their deposit shares? + uint remainingDepositShares = OPERATOR_SHARES - params.depositSharesToWithdraw; + uint scaleQWD = scratchDSF.scaleForQueueWithdrawal(remainingDepositShares); - dsf._scalingFactor = scalingFactor; - // prevDepositShares = 2; - // addedShares = 2; - // slashingFactor = 628157962353078290; + params.withdrawRemaining = scaleQWD.scaleForCompleteWithdrawal(params.newMM); + } - console.log("WAD: ", uint(1e18)); - console.log("PrevDepositShares: ", prevDepositShares); - console.log("AddedShares: ", addedShares); - console.log("slashingFactor: ", slashingFactor); - console.log("scalingFactor: ", dsf._scalingFactor); + { + /// Calculate totals + // 1. Amount exited by the operator + params.completeExit = params.completeWithdrawal + params.withdrawRemaining; + // 2. Amount withdrawn (redistribution + operator exit) + params.totalWithdrawn = params.amountRedistributed + params.completeExit; + require(params.totalWithdrawn <= OPERATOR_SHARES, "end > start"); + // 3. Amount missing after all's said and done + params.totalMissing = OPERATOR_SHARES - params.totalWithdrawn; + } - dsf.update(prevDepositShares, addedShares, slashingFactor); + // Error in amountRedistributed + if (params.amountRedistributed < params.expectedRedistribution) { + params.abs_Error = params.expectedRedistribution - params.amountRedistributed; + } else { + params.abs_Error = params.amountRedistributed - params.expectedRedistribution; + } - console.log("newScalingFactor: ", dsf._scalingFactor); + // Check results - if we have a new local min/max, push to results list + // if (params.abs_Error > max_Amt) { + // max_Amt = params.abs_Error; + // points.push(params); + // } + + // if (params.amountRedistributed > max_Amt) { + // max_Amt = params.amountRedistributed; + // points.push(params); + // } + + if (params.amountRedistributed < min_Amt) { + min_Amt = params.amountRedistributed; + points.push(params); + } + } - assertTrue(dsf._scalingFactor >= scalingFactor, "scalingFactor decreased!"); - assertTrue(dsf._scalingFactor != 0, "scalingFactor hit 0!"); + // Print results: + for (uint i = 0; i < points.length; i++) { + params = points[i]; + + console.log(""); + console.log("(point %d)".dim().italic(), i); + + console.log(" - prevMM => newMM %s => %s".dim(), _pretty(params.prevMM), _pretty(params.newMM)); + console.log(" - prev | new %d | %d".dim(), params.prevMM, params.newMM); + console.log(" - % in withdrawal queue: %s".dim(), _prettyPerc(WAD - params.wadsInWQ, WAD)); + + // Deposit info + console.log(" - Deposit Shares: ".dim().yellow()); + uint remainingDepositShares = OPERATOR_SHARES - params.depositSharesToWithdraw; + console.log(" -- queued deposit shares: %s (%d)".dim().italic(), _pretty(params.depositSharesToWithdraw), params.depositSharesToWithdraw); + console.log(" -- remaining deposit shares: %s (%d)".dim().italic(), _pretty(remainingDepositShares), remainingDepositShares); + + // Operator/Queue info + console.log(" - Operator/Queue Shares: ".dim().yellow()); + console.log(" -- new operator shares: %s (%d)".dim().italic(), _pretty(params.operatorShares), params.operatorShares); + console.log(" -- scaledShares (queued): %s (%d)".dim().italic(), _pretty(params.scaledShares), params.scaledShares); + + // Results: + console.log(" - Results: ".dim().magenta()); + console.log(" -- expected redistribution: %s (%d)".green(), _pretty(params.expectedRedistribution), params.expectedRedistribution); + console.log(" -- redistributed (avs): %s (%d)".yellow(), _pretty(params.amountRedistributed), params.amountRedistributed); + console.log(" -- withdrawn (operator): %s (%d)".yellow(), _pretty(params.completeExit), params.completeExit); + console.log(" -- total assets (end): %s (%d)".yellow(), _pretty(params.totalWithdrawn), params.totalWithdrawn); + // Where'd the rounding error go? + int excessRedistribution = int(params.amountRedistributed) - int(params.expectedRedistribution); + if (excessRedistribution > 0) { + console.log(" -- avs gets extra: %s (%d)".magenta(), _pretty(uint(excessRedistribution)), uint(excessRedistribution)); + } else { + console.log(" -- dust lost: %s (%d)".cyan(), _pretty(uint(-excessRedistribution)), uint(-excessRedistribution)); + } + console.log(" -- missing assets: %s (%d)".red(), _pretty(params.totalMissing), params.totalMissing); + console.log(" -- absolute error: %s (%d)".red(), _pretty(params.abs_Error), params.abs_Error); + } + + console.log(""); + console.log("==Setup==".green()); + console.log(" - NUM_ITERATIONS: %d", NUM_ITERATIONS); + console.log(" - START ASSETS: %s (%d)", _pretty(OPERATOR_SHARES), OPERATOR_SHARES); + console.log(" - SLASH PERCENT: %s", _prettyPerc(WAD - WADS_TO_SLASH, WAD)); + + // console.log(" - EXPECTED REDISTRIBUTION: %s (%d)".green(), _pretty(expectedRedistribution), expectedRedistribution); + + revert("finished".green()); + } + + uint NUM_ITERATIONS = 0; + uint GENERATE_METHOD = 0; + uint C_NUM_SHARES = 0; + uint C_MAG_DIFF = 0; + + struct MaxInput { + uint slashedFromOpShares; + + uint shares; + uint64 prevMM; + uint64 newMM; + } + + function _randomS() internal returns (uint shares, uint diff) { + shares = cheats.randomUint(1, WAD); + + diff = uint(WAD) / shares; + require(shares * diff < uint(WAD), "condition not met"); + } + + function _randomD() internal returns (uint shares, uint diff) { + diff = cheats.randomUint(1, WAD); + + shares = uint(WAD) / diff; + require(shares * diff < uint(WAD), "condition not met"); + } + + function _contrivedS() internal returns (uint shares, uint diff) { + shares = C_NUM_SHARES; + + diff = uint(WAD) / shares; + require(shares * diff < uint(WAD), "condition not met"); + } + + function _contrivedD() internal returns (uint shares, uint diff) { + diff = C_MAG_DIFF; + + shares = uint(WAD) / diff; + if (shares * diff == uint(WAD)) shares--; + + require(shares * diff < uint(WAD), "condition not met"); + } + + function _genInputs() internal returns (uint, uint) { + return + GENERATE_METHOD == 0 ? _randomS() : + GENERATE_METHOD == 1 ? _randomD() : + GENERATE_METHOD == 2 ? _contrivedS() : + GENERATE_METHOD == 3 ? _contrivedD() : + (0, 0); + } + + function test_Temp() public rand(0) { + uint operatorShares = 3; + uint withdrawalQueueShares = 7; + + uint64 prevMaxMag = 3; + uint64 newMaxMag = 2; + + uint slashFromOpShares = operatorShares.calcSlashedAmount(prevMaxMag, newMaxMag); + uint slashFromWQ = withdrawalQueueShares.scaleForBurning(prevMaxMag, newMaxMag); + + console.log("slashFromOP: %d", slashFromOpShares); + console.log("slashFromWQ: %d", slashFromWQ); + + revert(); + } + + function test_Scratch() public rand(0) { + _readScratchTOML(); + + uint idx; + MaxInput[] memory max = new MaxInput[](NUM_ITERATIONS); + + // Generate shares, prevMM, and newMM s.t. + // + // shares * (prevMM - newMM) < WAD + // + // Given scaleForBurning, this should guarantee that shares slashed from withdrawal queue + // are zero. + // + // ... then we check how much is slashed from the operator's shares in the same scenario. + // The maximum slashed from the operator's shares is the maximum amount we can "avoid" + // slashing by queueing a withdrawal. + for (uint i = 0; i < NUM_ITERATIONS; i++) { + (uint shares, uint diff) = _genInputs(); + + // uint64 prevMM = WAD; + // uint64 newMM = WAD - uint64(diff); + + uint64 prevMM = diff == WAD ? uint64(diff) : uint64(cheats.randomUint(diff, WAD)); + uint64 newMM = prevMM - uint64(diff); + + // uint64 prevMM = diff == 1 ? 1 : uint64(cheats.randomUint(1, diff)); + // uint64 newMM = prevMM == 1 ? 0 : uint64(cheats.randomUint(0, prevMM-1)); + + uint slashedFromOpShares = shares.calcSlashedAmount(prevMM, newMM); + uint slashedFromWQueue = shares.scaleForBurning(prevMM, newMM); + require(slashedFromWQueue == 0, "slashed nonzero amt from wq"); + + if (slashedFromOpShares > max[idx].slashedFromOpShares) { + idx++; + max[idx].slashedFromOpShares = slashedFromOpShares; + max[idx].shares = shares; + max[idx].prevMM = prevMM; + max[idx].newMM = newMM; + } + } + + // Manually correct length before printing max inputs + assembly { mstore(max, add(1, idx)) } + + for (uint i = 0; i < max.length; i++) { + MaxInput memory m = max[i]; + uint64 diff = m.prevMM - m.newMM; + + console.log(""); + console.log("(# %d)".dim().italic(), i); + console.log("Max slashed from op shares: %s (%d)".yellow(), _pretty(m.slashedFromOpShares), m.slashedFromOpShares); + console.log(" - input shares: %s (%d)".dim(), _pretty(m.shares), m.shares); + console.log(" - magnitude diff: %s (%d)".dim(), _pretty(diff), diff); + console.log(" -- prevMM: %s (%d)".dim().italic(), _pretty(m.prevMM), m.prevMM); + console.log(" -- newMM: %s (%d)".dim().italic(), _pretty(m.newMM), m.newMM); + } + + revert("finished".green().bold()); + } + + function _readExtractTOML() internal { + string memory tomlRAW = cheats.readFile("src/test/integration/params.toml"); + + NUM_ITERATIONS = cheats.parseTomlUint(tomlRAW, ".numIterations"); + // OPERATOR_SHARES = cheats.parseTomlUint(tomlRAW, ".operatorShares"); + OPERATOR_SHARES = (10 ** cheats.parseTomlUint(tomlRAW, ".operatorSharesExp")); + WADS_TO_SLASH = cheats.parseTomlUint(tomlRAW, ".wadsToSlash"); + } + + function _readScratchTOML() internal { + string memory tomlRAW = cheats.readFile("src/test/integration/params.toml"); + + NUM_ITERATIONS = cheats.parseTomlUint(tomlRAW, ".numIterations"); + GENERATE_METHOD = cheats.parseTomlUint(tomlRAW, ".genMethod"); + C_NUM_SHARES = cheats.parseTomlUint(tomlRAW, ".contrivedShares"); + C_MAG_DIFF = cheats.parseTomlUint(tomlRAW, ".contrivedDiff"); + + console.log(""); + console.log("==Setup==".green()); + console.log(" - NUM_ITERATIONS: %d", NUM_ITERATIONS); + console.log(" - GENERATE_METHOD: %d", GENERATE_METHOD); + + if (GENERATE_METHOD == 2) { + console.log(" -- CONTRIVED_SHARES: %s (%d)", _pretty(C_NUM_SHARES), C_NUM_SHARES); + } else if (GENERATE_METHOD == 3) { + console.log(" -- CONTRIVED_DIFF: %s (%d)", _pretty(C_MAG_DIFF), C_MAG_DIFF); + } } struct DSFState { DepositScalingFactor dsf; - uint prevScalingFactor; + uint depositShares; uint operatorMaxMag; + + uint prevScalingFactor; uint prevDepositShares; uint addedShares; } DSFState state; - DepositScalingFactor dummy; - bool writeJSON = false; + uint[] DSFs; - function _init() internal override { - string memory tomlRAW = cheats.readFile("src/test/integration/params.toml"); + enum Operation { + DEPOSIT, + WITHDRAW, + REPEAT_PREV, + REPEAT_PREV2 + } - printLast = cheats.parseTomlUint(tomlRAW, ".printLast"); - printEvery = cheats.parseTomlUint(tomlRAW, ".printEvery"); - writeJSON = cheats.parseTomlUint(tomlRAW, ".writeJSON") == 1; - console.log("Printing final %d inputs", printLast); - console.log("Printing other inputs every %d iterations", printEvery); - console.log("Writing to file: %s", writeJSON ? "true" : "false"); + struct Action { + uint amount; + Operation op; } - uint[] DSFs; + Action prev; + Action prevprev; function test_DSF_DownToZero() public rand(0) { (uint prevDepositShares, uint iterations) = _readTOML(); @@ -127,36 +665,18 @@ contract Integration_Rounding_Deallocation is IntegrationCheckUtils { } function test_DSF_FindOptimalIterations() public rand(0) { - ( - uint startDSF, - uint startShares, - uint startIteration, - uint contIterations - ) = _readFindContinuationTOML(); - finalIteration = startIteration + contIterations; - // printInputs = true; - - console.log("Start Balance: %s (%d)", _pretty(startShares), startShares); - // console.log("Iterations: %d", iterations); + uint contIterations = _readFindOptimalTOML(); - state.dsf._scalingFactor = startDSF; - state.prevScalingFactor = startDSF; - state.operatorMaxMag = WAD-1; - state.addedShares = 1; - state.prevDepositShares = startShares; - - for (uint i = startIteration; i < finalIteration; i++) { - _print(i); - - state.prevScalingFactor = state.dsf._scalingFactor; - - state.dsf.update({ - prevDepositShares: state.prevDepositShares, - addedShares: state.addedShares, - slashingFactor: state.operatorMaxMag + for (uint i = 0; i < finalIteration; i++) { + Action memory action = Action({ + op: Operation.DEPOSIT, + amount: 1 }); + + state.prevScalingFactor = state.dsf._scalingFactor; + state.prevDepositShares = state.depositShares; - // if (i + 1 == 104) printInputs = true; + _applyAction(action); // Iterate until decrease is around 50% uint scaledDecrease = 1e5 - ((1e5 * state.dsf._scalingFactor) / state.prevScalingFactor); @@ -166,14 +686,133 @@ contract Integration_Rounding_Deallocation is IntegrationCheckUtils { finalIteration = i + printLast; } - state.prevDepositShares += state.addedShares; + _print(action, i+1); } - _print(finalIteration); - revert(); } + function test_DSF_FuzzOptimalSequence() public rand(0) { + ( + DSFState memory startState, + uint fuzzRuns, + uint sequenceLength + ) = _readFuzzSequenceTOML(); + + uint minDSF_Overall = WAD; + Action[] memory best = new Action[](sequenceLength); + + Action[] memory actions = new Action[](sequenceLength); + uint finalActionIdx; + + for (uint i = 0; i < fuzzRuns; i++) { + // One full run: + + // Reset start state + state.dsf._scalingFactor = startState.dsf._scalingFactor; + state.depositShares = startState.depositShares; + state.operatorMaxMag = startState.operatorMaxMag; + + state.prevScalingFactor = startState.prevScalingFactor; + state.prevDepositShares = startState.prevDepositShares; + + // Track lowest DSF within a given run, in case the final iterations kill a good run + uint minDSF_WithinRun = state.dsf._scalingFactor; + uint minDSF_Location = 0; + + for (uint j = 0; j < actions.length; j++) { + state.prevScalingFactor = state.dsf._scalingFactor; + state.prevDepositShares = state.depositShares; + + // Select [DEPOSIT,WITHDRAW] + // - Start with a deposit + // - Never withdraw twice in a row (pointless expansion of search space) + // - Only withdraw up to the amount previously deposited - 1 + // + // TODO - consider making withdraw a 1:4? + // I have no idea what ratio would be good... maybe we do exhaustive rather than fuzzing? + actions[j].op = Operation.DEPOSIT; + // if (j == 0 || prev.amount >= 2 || prev.op == Operation.WITHDRAW) { + // actions[j].op = Operation.DEPOSIT; + // } else { + // actions[j].op = cheats.randomBool() ? Operation.DEPOSIT : Operation.WITHDRAW; + // } + + // Select AMOUNT + // - deposit amounts less than sequence length + // - withdraw amounts less than total balance + actions[j].amount = cheats.randomUint(1, 2); + // if (actions[j].op == Operation.DEPOSIT) { + // actions[j].amount = sequenceLength == 1 ? 1 : cheats.randomUint(1, sequenceLength-j); + // } else { + // actions[j].amount = prev.amount == 1 ? 1 : cheats.randomUint(1, prev.amount-1); + // } + + // Apply selected action, updating DSF + _applyAction(actions[j]); + + if (state.dsf._scalingFactor < minDSF_WithinRun) { + minDSF_WithinRun = state.dsf._scalingFactor; + minDSF_Location = j; + } + + prev = actions[j]; + } + + // If we found a new low, update + if (minDSF_WithinRun < minDSF_Overall) { + minDSF_Overall = minDSF_WithinRun; + console.log("Found new minimum DSF: %s (%d)".dim(), _pretty(minDSF_Overall), minDSF_Overall); + console.log("- Iterations: %d".dim().italic(), minDSF_Location+1); + _copySeq({ from: actions, to: best, finalActionIdx: minDSF_Location }); + finalActionIdx = minDSF_Location; + // _printSeq(best, minDSF_Location, minDSF_WithinRun); + } else if (minDSF_WithinRun == minDSF_Overall && minDSF_Location < finalActionIdx) { + minDSF_Overall = minDSF_WithinRun; + console.log("Found faster DSF drop for DSF: %s (%d)".dim(), _pretty(minDSF_Overall), minDSF_Overall); + console.log("- (%d => %d)".dim().italic(), finalActionIdx+1, minDSF_Location+1); + _copySeq({ from: actions, to: best, finalActionIdx: minDSF_Location }); + finalActionIdx = minDSF_Location; + // _printSeq(best, minDSF_Location, minDSF_WithinRun); + } + } + + _printSeq(best, finalActionIdx, minDSF_Overall); + + revert("finished"); + } + + function _printSeq(Action[] memory actions, uint finalActionIdx, uint minDSF) internal { + console.log("==Best Sequence==".yellow()); + console.log("- iterations: %d".dim(), finalActionIdx+1); + console.log("- DSF: %s (%d)", _pretty(minDSF), minDSF); + for (uint i = 0; i <= finalActionIdx; i++) { + _logDepositOrWithdraw(actions[i]); + } + } + + function _copySeq(Action[] memory from, Action[] memory to, uint finalActionIdx) internal pure { + require(from.length == to.length && finalActionIdx < from.length); + for (uint i = 0; i <= finalActionIdx; i++) { + to[i].amount = from[i].amount; + to[i].op = from[i].op; + } + } + + function _applyAction(Action memory action) internal { + if (action.op == Operation.DEPOSIT) { + state.dsf.update({ + prevDepositShares: state.depositShares, + addedShares: action.amount, + slashingFactor: state.operatorMaxMag + }); + + state.depositShares += action.amount; + } else if (action.op == Operation.WITHDRAW) { + state.depositShares -= action.amount; + } + } + function test_DSF_ContinueIteration() public rand(0) { ( uint startDSF, @@ -207,7 +846,7 @@ contract Integration_Rounding_Deallocation is IntegrationCheckUtils { DSFs.push(state.dsf._scalingFactor); - console.log("prevDepositShares: %d", state.prevDepositShares); + // console.log("prevDepositShares: %d", state.prevDepositShares); state.prevDepositShares += state.addedShares; state.operatorMaxMag -= maxMagDecrease; @@ -219,7 +858,7 @@ contract Integration_Rounding_Deallocation is IntegrationCheckUtils { state.addedShares = 1; state.prevScalingFactor = state.dsf._scalingFactor; - console.log("prevDepositShares: %d", state.prevDepositShares); + // console.log("prevDepositShares: %d", state.prevDepositShares); state.dsf.update({ prevDepositShares: state.prevDepositShares, @@ -244,6 +883,71 @@ contract Integration_Rounding_Deallocation is IntegrationCheckUtils { revert(); } + function test_DSF_Sequence() public rand(0) { + Action[] memory actions = _readSequenceTOML(); + + uint iterations = 0; + for (uint i = 0; i < actions.length; i++) { + Action memory mainAction = actions[i]; + if (i == 0) { + require(mainAction.op != Operation.REPEAT_PREV && mainAction.op != Operation.REPEAT_PREV2); + } else if (i == 1) { + require(mainAction.op != Operation.REPEAT_PREV2); + } + + // number of times to apply action + uint applyTimes = + mainAction.op == Operation.REPEAT_PREV ? mainAction.amount : + mainAction.op == Operation.REPEAT_PREV2 ? 2 * mainAction.amount : + 1; + + state.prevScalingFactor = state.dsf._scalingFactor; + state.prevDepositShares = state.depositShares; + + for (uint j = 0; j < applyTimes; j++) { + // Cursed switch syntax determines if we're doing the main action or repeating a prev + Action memory action = + mainAction.op == Operation.REPEAT_PREV ? prev : + mainAction.op == Operation.REPEAT_PREV2 ? + (j % 2 == 0 ? prevprev : prev) : + mainAction; + + _applyAction(action); + + + } + + iterations += applyTimes; + _print(mainAction, iterations); + + prevprev = prev; + prev = mainAction; + } + + revert(); + } + + function _readSequenceTOML() internal returns (Action[] memory actions) { + string memory tomlRAW = cheats.readFile("src/test/integration/params.toml"); + bytes memory data = vm.parseToml(tomlRAW, ".sequence"); + actions = abi.decode(data, (Action[])); + + // Also setup start state + state.dsf._scalingFactor = cheats.parseTomlUint(tomlRAW, ".seqStartDSF"); + state.depositShares = cheats.parseTomlUint(tomlRAW, ".seqStartShares"); + state.operatorMaxMag = WAD - 1; + + state.prevScalingFactor = state.dsf._scalingFactor; + state.prevDepositShares = state.depositShares; + + printInputs = true; + finalIteration = actions.length; + + _printStartState(); + + return actions; + } + function _readTOML() internal returns (uint, uint) { string memory tomlRAW = cheats.readFile("src/test/integration/params.toml"); @@ -253,14 +957,56 @@ contract Integration_Rounding_Deallocation is IntegrationCheckUtils { ); } - function _readFindContinuationTOML() internal returns (uint, uint, uint, uint) { + function _readFindOptimalTOML() internal returns (uint) { string memory tomlRAW = cheats.readFile("src/test/integration/params.toml"); + // Setup start state + state.dsf._scalingFactor = cheats.parseTomlUint(tomlRAW, ".startDSF"); + state.depositShares = cheats.parseTomlUint(tomlRAW, ".startShares"); + state.operatorMaxMag = WAD - 1; + + state.prevScalingFactor = state.dsf._scalingFactor; + state.prevDepositShares = state.depositShares; + + printInputs = true; + finalIteration = cheats.parseTomlUint(tomlRAW, ".contIterations"); + + _printStartState(); + return ( - cheats.parseTomlUint(tomlRAW, ".startDSF"), - cheats.parseTomlUint(tomlRAW, ".startShares"), - cheats.parseTomlUint(tomlRAW, ".iterations") + 1, - cheats.parseTomlUint(tomlRAW, ".contIterations") + finalIteration + ); + } + + function _readFuzzSequenceTOML() internal returns (DSFState memory startState, uint, uint) { + string memory tomlRAW = cheats.readFile("src/test/integration/params.toml"); + + // Setup start state + startState.dsf._scalingFactor = cheats.parseTomlUint(tomlRAW, ".seqStartDSF"); + startState.depositShares = cheats.parseTomlUint(tomlRAW, ".seqStartShares"); + startState.operatorMaxMag = WAD - 1; + + startState.prevScalingFactor = startState.dsf._scalingFactor; + startState.prevDepositShares = startState.depositShares; + + // Reset start state + state.dsf._scalingFactor = startState.dsf._scalingFactor; + state.depositShares = startState.depositShares; + state.operatorMaxMag = startState.operatorMaxMag; + + state.prevScalingFactor = startState.prevScalingFactor; + state.prevDepositShares = startState.prevDepositShares; + + _printStartState(); + + // printInputs = true; + // finalIteration = cheats.parseTomlUint(tomlRAW, ".contIterations"); + // _printStartState(); + + return ( + startState, + cheats.parseTomlUint(tomlRAW, ".fuzzRuns"), + cheats.parseTomlUint(tomlRAW, ".sequenceLength") ); } @@ -285,46 +1031,91 @@ contract Integration_Rounding_Deallocation is IntegrationCheckUtils { cheats.writeJson(outputJSON, "src/test/integration/output.json", arrKey); } - /// Minimum: - /// - /// DSF: 999000999000999 - /// operatorMaxMag: 999999999999999999 - /// depositShares: 1001 - - /// Deposit-only method: - /// - /// numDeposits: 1000 - /// - optimalStart: 993 - /// - final DSF: 5.01e14 (501756146512794) - /// - /// numDeposits: 2000 - /// - optimalStart: 1993 - /// - final DSF: 2.50e14 (250438266967192) - /// - /// numDeposits: 3000 - /// - optimalStart: 2989 - /// - final DSF: 1.67e14 (166944908180300) - /// - /// numDeposits: 4000 - /// - optimalStart: 3989 - /// - final DSF: 1.25e14 (125172111653523) - - function test_DSF_SpecificUpdate() public rand(0) { - dummy._scalingFactor = 1; - dummy.update({ - prevDepositShares: WAD, - addedShares: 1, - slashingFactor: 1e18 - 1 - }); + uint finalIteration = type(uint).max; + bool printInputs = false; + + function _printStartState() internal { + console.log(""); + console.log("==StartState==".yellow()); + + console.log(" - startDSF: %s (%d)".dim(), _pretty(state.dsf._scalingFactor), state.dsf._scalingFactor); + console.log(" - startDepositShares: %d".dim(), state.prevDepositShares); + console.log(" - startOpMaxMag: %s (%d)".dim(), _pretty(state.operatorMaxMag), state.operatorMaxMag); - console.log("finalDSF: %s (%d)", _pretty(dummy._scalingFactor), dummy._scalingFactor); - assertTrue(dummy._scalingFactor != 0, "found 0"); + console.log(""); } - uint finalIteration = type(uint).max; - uint printLast = 3; - uint printEvery = 100; - bool printInputs = false; + function _print(Action memory action, uint iter) internal { + _printIteration(action, iter); + + if (action.op == Operation.DEPOSIT) { + if (printInputs) { + console.log("==Inputs==".yellow()); + + console.log(" - prevDepositShares: %s (%d)".dim(), _pretty(state.prevDepositShares), state.prevDepositShares); + console.log(" - addedShares: %d".dim(), action.amount); + console.log(" - prevDSF: %s (%d)".dim(), _pretty(state.prevScalingFactor), state.prevScalingFactor); + + console.log("=currentShares=".yellow().dim()); + + uint pDS = state.prevDepositShares; + uint pDSMulDSF = pDS * state.prevScalingFactor; + uint numerator = pDS.mulWad(state.prevScalingFactor) * state.operatorMaxMag; + uint currentShares = pDS.mulWad(state.prevScalingFactor).mulWad(state.operatorMaxMag); + + console.log(" - prevDepositShares*DSF: %s (%d)".dim(), _pretty(pDSMulDSF), pDSMulDSF); + console.log(" - numerator: %s (%d)".dim(), _pretty(numerator), numerator); + console.log(" - currentShares: %d".dim(), currentShares); + } + + _prettyDSFDelta(); + } else if (action.op == Operation.WITHDRAW) { + + } else { + _prettyDSFDelta(); + } + + console.log("=newDepositShares=".yellow().dim()); + console.log(" - depositShares: %s (%d)".dim(), _pretty(state.depositShares), state.depositShares); + + console.log(""); + } + + // Ex: + // [iter: 5] + // - deposited shares: 0e01 (1) + function _printIteration(Action memory action, uint iter) internal { + console.log("[iter: %d]".dim(), iter); + + if (action.op == Operation.DEPOSIT) { + _logDepositOrWithdraw(action); + } else if (action.op == Operation.WITHDRAW) { + _logDepositOrWithdraw(action); + } else if (action.op == Operation.REPEAT_PREV) { + console.log("Repeated last action %d times:".dim(), action.amount); + _logDepositOrWithdraw(prev); + } else if (action.op == Operation.REPEAT_PREV2) { + console.log("Repeated last two actions %d times:".dim(), action.amount); + _logDepositOrWithdraw(prevprev); + _logDepositOrWithdraw(prev); + } + } + + function _logDepositOrWithdraw(Action memory action) internal { + if (action.op == Operation.DEPOSIT) { + console.log( + "-- deposited shares: %s (%d)".dim().italic(), + _pretty(action.amount), + action.amount + ); + } else if (action.op == Operation.WITHDRAW) { + console.log( + "-- withdrew shares: %s (%d)".dim().italic(), + _pretty(action.amount), + action.amount + ); + } + } function _print(uint iter) internal { // print every 100 iterations, but also print the final 20 iterations @@ -341,16 +1132,16 @@ contract Integration_Rounding_Deallocation is IntegrationCheckUtils { // if (printInputs || iter > finalIteration - printLast) { if (true) { console.log("==Inputs==".yellow()); - // console.log(" - prevDepositShares: %d".dim(), state.prevDepositShares - state.addedShares); - console.log(" - prevDepositShares: %d".dim(), state.prevDepositShares); + console.log(" - prevDepositShares: %d".dim(), state.prevDepositShares - state.addedShares); + // console.log(" - prevDepositShares: %d".dim(), state.prevDepositShares); console.log(" - addedShares: %d".dim(), state.addedShares); console.log(" - prevDSF: %s (%d)".dim(), _pretty(state.prevScalingFactor), state.prevScalingFactor); { console.log("=currentShares=".yellow().dim()); - // uint pDS = state.prevDepositShares - state.addedShares; - uint pDS = state.prevDepositShares; + uint pDS = state.prevDepositShares - state.addedShares; + // uint pDS = state.prevDepositShares; uint pDSMulDSF = pDS * state.prevScalingFactor; uint numerator = pDS.mulWad(state.prevScalingFactor) * state.operatorMaxMag; uint currentShares = pDS.mulWad(state.prevScalingFactor).mulWad(state.operatorMaxMag); @@ -359,16 +1150,16 @@ contract Integration_Rounding_Deallocation is IntegrationCheckUtils { console.log(" - numerator: %s (%d)".dim(), _pretty(numerator), numerator); console.log(" - currentShares: %d".dim(), currentShares); } - - console.log("=newDSF=".yellow().dim()); } - // uint totalDepositShares = state.prevDepositShares + state.addedShares; - // uint totalWithdrawable = state.dsf.calcWithdrawable(totalDepositShares, state.operatorMaxMag); - // console.log(" - totalDepositShares: %d", totalDepositShares); - // console.log(" - totalWithdrawable: %d", totalWithdrawable); + _prettyDSFDelta(); + } + + // Print DSF as red under 1e12, yellow under 1e15, green otherwise + // Print decrease/increase/no change with % + function _prettyDSFDelta() internal { + console.log("=newDSF=".yellow().dim()); - // console.log(" - operatorMaxMag: %s (%d)", _pretty(state.operatorMaxMag), state.operatorMaxMag); if (state.dsf._scalingFactor < 1e15) { console.log( " - DSF: %s (%d)".yellow(), @@ -408,8 +1199,6 @@ contract Integration_Rounding_Deallocation is IntegrationCheckUtils { _pretty(decrease) ); } - - // console.log(" - 1 WAD: %s (%d)".dim(), _pretty(WAD), WAD); } /// Expresses a % decrease with 3 decimals; e.g: 99.999% @@ -474,136 +1263,4 @@ contract Integration_Rounding_Deallocation is IntegrationCheckUtils { ) ); } - - /// @dev Mocks out math performed in AllocationManager.slashOperator. This examines precision drift - /// caused by slashing applied when the operator has a pending deallocation, as slashOperator applies - /// slashes equally to two differently sized values: - /// - /// uint64 slashedMagnitude = uint64(uint256(allocation.currentMagnitude).mulWadRoundUp(params.wadsToSlash[i])); - /// - /// vs - /// - /// uint64 slashedPending = - /// uint64(uint256(uint128(-allocation.pendingDiff)).mulWadRoundUp(params.wadsToSlash[i])); - /// - /// The goal was to determine how precision drift impacts an operator's max magnitude over time. In conclusion, - /// any precision drift/rounding that occurs causes the operator to have _less_ max magnitude than they should, - /// reducing the ability of an attacker to leverage magnitude for an attack. We can rule out pending deallocations - /// when considering slash/redistro attacks. - function test_deallocMath( - uint64 maxMag, - uint64 curMag, - uint64 pendDealloc, - uint8 slashMantissa, - uint8 slashExponent, - uint8 vMod - ) public rand(0) { - maxMag = uint64(bound(maxMag, 2, 1e18)); - curMag = uint64(bound(curMag, 1, maxMag)); - pendDealloc = uint64(bound(pendDealloc, 1, curMag)); - - // Slashes are XeY +/- 1 - slashMantissa = uint8(bound(slashMantissa, 1, 9)); - slashExponent = uint8(bound(slashExponent, 0, 17)); - vMod = uint8(bound(vMod, uint(type(ValueMod).min), uint(type(ValueMod).max))); - - mag = Magnitude({ - max: maxMag, - cur: curMag, - available: maxMag - curMag, - pendDealloc: pendDealloc - }); - - slash = Slash({ - mantissa: slashMantissa, - exponent: slashExponent, - vMod: ValueMod(vMod) - }); - - _printMagInfo(); - - for (uint i = slashExponent; i > 0; i--) { - _doSlash(); - _printMagInfo(); - - slash.exponent--; - } - - revert(); - } - - function _doSlash() internal { - console.log(""); - console.log("===Slash Info===".magenta()); - - uint wadsToSlash = uint(slash.mantissa) * 10 ** uint(slash.exponent); - if (slash.vMod == ValueMod.SUB && wadsToSlash > 1) { - wadsToSlash--; - console.log(" - wadsToSlash: %de%d-1 (%d)", slash.mantissa, slash.exponent, wadsToSlash); - } else if (slash.vMod == ValueMod.ADD && wadsToSlash < uint(WAD)) { - wadsToSlash++; - console.log(" - wadsToSlash: %de%d+1 (%d)", slash.mantissa, slash.exponent, wadsToSlash); - } else { - console.log(" - wadsToSlash: %de%d (%d)", slash.mantissa, slash.exponent, wadsToSlash); - } - - // Apply the same slashing to current allocation and pending deallocation - uint64 slashedMagnitude = uint64(SlashingLib.mulWadRoundUp(mag.cur, wadsToSlash)); - uint64 slashedPending = uint64(SlashingLib.mulWadRoundUp(mag.pendDealloc, wadsToSlash)); - - // Check to see if rounding occurred - bool sMRounding = SlashingLib.mulWad(mag.cur, wadsToSlash) != slashedMagnitude; - bool sPRounding = SlashingLib.mulWad(mag.pendDealloc, wadsToSlash) != slashedPending; - console.log(" - slashedMagnitude: %d (rounding: %s)", slashedMagnitude, sMRounding ? "true".magenta() : "false"); - console.log(" - slashedPending: %d (rounding: %s)", slashedPending, sPRounding ? "true".magenta() : "false"); - - // Update magnitude info according to slash - mag.max -= slashedMagnitude; - mag.cur -= slashedMagnitude; - mag.available = mag.max - mag.cur; - mag.pendDealloc -= slashedPending; - - // Simulate applying deallocation and guage how much magnitude the operator is now able to allocate - // uint64 newAvailable = mag.available + mag.pendDealloc; - // uint64 newCurMag = mag.cur - mag.pendDealloc; - // uint64 newMaxMag = newAvailable + newCurMag; - uint64 newCurMag = mag.cur - mag.pendDealloc; - uint64 newAvailable = mag.max - newCurMag; - uint64 effectiveMaxMag = newAvailable + newCurMag; - - console.log(" - after deallocation:".yellow()); - console.log(" -- new cur mag: ", newCurMag); - console.log(" -- new available: ", newAvailable); - - if (mag.max == effectiveMaxMag) { - console.log(" -- max mag loss: %s", "none".green()); - } else if (mag.max > effectiveMaxMag) { - console.log( - " -- max mag loss: %s (%d)", - "lost magnitude".yellow(), - mag.max - effectiveMaxMag - ); - - revert("lossy"); - } else { - console.log( - " -- max mag loss: %s (%d)", - "gained magnitude".red(), - effectiveMaxMag - mag.max - ); - - revert("gain"); - } - } - - function _printMagInfo() internal { - console.log(""); - console.log("===Magnitude Info===".cyan()); - - console.log(" - initial max mag: ", WAD); - console.log(" - max magnitude: ", mag.max); - console.log(" -- available: ", mag.available); - console.log(" -- allocated: ", mag.cur); - console.log(" -- pending dealloc: ", mag.pendDealloc); - } } \ No newline at end of file