diff --git a/pkg/source/uniswapv3/pool_simulator.go b/pkg/source/uniswapv3/pool_simulator.go index 236d5d879..c651e4b75 100644 --- a/pkg/source/uniswapv3/pool_simulator.go +++ b/pkg/source/uniswapv3/pool_simulator.go @@ -1,11 +1,15 @@ package uniswapv3 import ( - "encoding/json" "errors" "fmt" "math/big" "strings" + "unsafe" + + "encoding/json" + + gojson "github.com/goccy/go-json" "github.com/KyberNetwork/logger" coreEntities "github.com/daoleno/uniswap-sdk-core/entities" @@ -33,7 +37,12 @@ type PoolSimulator struct { } func NewPoolSimulator(entityPool entity.Pool, chainID valueobject.ChainID) (*PoolSimulator, error) { - var extra Extra + var extra struct { + Liquidity *big.Int `json:"liquidity"` + SqrtPriceX96 *big.Int `json:"sqrtPriceX96"` + Tick *big.Int `json:"tick"` + Ticks []Tick `json:"ticks"` + } if err := json.Unmarshal([]byte(entityPool.Extra), &extra); err != nil { return nil, err } @@ -119,6 +128,97 @@ func NewPoolSimulator(entityPool entity.Pool, chainID valueobject.ChainID) (*Poo }, nil } +type PoolSimulatorV2 struct { + PoolSimulator + extra struct { + Liquidity *big.Int `json:"liquidity"` + SqrtPriceX96 *big.Int `json:"sqrtPriceX96"` + Tick *big.Int `json:"tick"` + Ticks []TickGob `json:"ticksGob"` + } +} + +func NewPoolSimulatorV2(entityPool entity.Pool, chainID valueobject.ChainID) (*PoolSimulatorV2, error) { + p := &PoolSimulatorV2{} + err := InitPoolSimulatorV2(entityPool, p, chainID) + return p, err +} + +type v3TickList []v3Entities.Tick + +func InitPoolSimulatorV2(entityPool entity.Pool, p *PoolSimulatorV2, chainID valueobject.ChainID) error { + // we'll unmarshal directly into `p.extra` to reuse the allocated tick array there + if err := gojson.Unmarshal([]byte(entityPool.Extra), &p.extra); err != nil { + return err + } + + if p.extra.Tick == nil { + return ErrTickNil + } + + token0 := coreEntities.NewToken(uint(chainID), common.HexToAddress(entityPool.Tokens[0].Address), uint(entityPool.Tokens[0].Decimals), entityPool.Tokens[0].Symbol, entityPool.Tokens[0].Name) + token1 := coreEntities.NewToken(uint(chainID), common.HexToAddress(entityPool.Tokens[1].Address), uint(entityPool.Tokens[1].Decimals), entityPool.Tokens[1].Symbol, entityPool.Tokens[1].Name) + + swapFeeFl := big.NewFloat(entityPool.SwapFee) + swapFee, _ := swapFeeFl.Int(nil) + tokens := make([]string, 2) + reserves := make([]*big.Int, 2) + if len(entityPool.Reserves) == 2 && len(entityPool.Tokens) == 2 { + tokens[0] = entityPool.Tokens[0].Address + reserves[0] = NewBig10(entityPool.Reserves[0]) + tokens[1] = entityPool.Tokens[1].Address + reserves[1] = NewBig10(entityPool.Reserves[1]) + } + + // TickGob should be fully compatible with v3Entities.Tick (GobBigInt is just a wrapper around bigInt) + // this should always be checked with a unit test + // also, uninitialized tick should be ignored at pool-tracker/tick-based-worker already, so no need to check here + v3Ticks := *(*v3TickList)(unsafe.Pointer(&p.extra.Ticks)) + + // if the tick list is empty, the pool should be ignored + if len(v3Ticks) == 0 { + return ErrV3TicksEmpty + } + + ticks, err := v3Entities.NewTickListDataProvider(v3Ticks, constants.TickSpacings[constants.FeeAmount(entityPool.SwapFee)]) + if err != nil { + fmt.Println("tick err", entityPool.Address, err) + return err + } + + p.V3Pool, err = v3Entities.NewPool( + token0, + token1, + constants.FeeAmount(entityPool.SwapFee), + p.extra.SqrtPriceX96, + p.extra.Liquidity, + int(p.extra.Tick.Int64()), + ticks, + ) + + if err != nil { + return err + } + + tickMin := v3Ticks[0].Index + tickMax := v3Ticks[len(v3Ticks)-1].Index + + p.Pool.Info.Address = strings.ToLower(entityPool.Address) + p.Pool.Info.ReserveUsd = entityPool.ReserveUsd + p.Pool.Info.SwapFee = swapFee + p.Pool.Info.Exchange = entityPool.Exchange + p.Pool.Info.Type = entityPool.Type + p.Pool.Info.Tokens = tokens + p.Pool.Info.Reserves = reserves + p.Pool.Info.Checked = false + + p.gas = defaultGas + p.tickMin = tickMin + p.tickMax = tickMax + + return nil +} + /** * getSqrtPriceLimit get the price limit of pool based on the initialized ticks that this pool has */ diff --git a/pkg/source/uniswapv3/pool_simulator_test.go b/pkg/source/uniswapv3/pool_simulator_test.go new file mode 100644 index 000000000..4031d5b75 --- /dev/null +++ b/pkg/source/uniswapv3/pool_simulator_test.go @@ -0,0 +1,153 @@ +package uniswapv3 + +import ( + "encoding/json" + "fmt" + "math/big" + "testing" + "unsafe" + + v3Entities "github.com/daoleno/uniswapv3-sdk/entities" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/KyberNetwork/kyberswap-dex-lib/pkg/entity" + "github.com/KyberNetwork/kyberswap-dex-lib/pkg/source/pool" + "github.com/KyberNetwork/kyberswap-dex-lib/pkg/util/bignumber" + "github.com/KyberNetwork/kyberswap-dex-lib/pkg/valueobject" +) + +var poolRedisTmpl = `{ + "address": "0x82c427adfdf2d245ec51d8046b41c4ee87f0d29c", + "reserveUsd": 655881.9392181232, + "amplifiedTvl": 9.50886572174149e52, + "swapFee": 3000, + "exchange": "uniswapv3", + "type": "uniswapv3", + "timestamp": 1705028005, + "reserves": ["148078669711237814932", "2285503757428512802257"], + "tokens": [ + { "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "name": "Wrapped Ether", "symbol": "WETH", "decimals": 18, "weight": 50, "swappable": true }, + { "address": "0xf1b99e3e573a1a9c5e6b2ce818b617f0e664e86b", "name": "Opyn Squeeth", "symbol": "oSQTH", "decimals": 18, "weight": 50, "swappable": true } + ], + "extra": "%s", + "staticExtra": "{\"poolId\":\"0x82c427adfdf2d245ec51d8046b41c4ee87f0d29c\"}", + "blockNumber": 18987966 +}` + +var poolExtra = `{"liquidity":1768557010563536833397,"sqrtPriceX96":307728010760542456554610335257,"tick":27139,"ticks":[{"index":-887220,"liquidityGross":186566528155316561807,"liquidityNet":186566528155316561807},{"index":-138180,"liquidityGross":531020253298985077,"liquidityNet":531020253298985077},{"index":-46080,"liquidityGross":388146244541030,"liquidityNet":388146244541030},{"index":-23100,"liquidityGross":37290468063373685,"liquidityNet":-37290468063373685},{"index":-23040,"liquidityGross":579811205737667601,"liquidityNet":-517776627113792689},{"index":-22980,"liquidityGross":55799517600399575,"liquidityNet":-55799517600399575},{"index":-16080,"liquidityGross":27610256661846682,"liquidityNet":-27610256661846682},{"index":-12060,"liquidityGross":469521714073621,"liquidityNet":469521714073621},{"index":-6960,"liquidityGross":1849581270522676,"liquidityNet":1849581270522676},{"index":-3540,"liquidityGross":24843425138503250,"liquidityNet":24843425138503250},{"index":0,"liquidityGross":116986754355740093,"liquidityNet":116986754355740093},{"index":2580,"liquidityGross":73960505140866196,"liquidityNet":73960505140866196},{"index":3000,"liquidityGross":232275989916033622,"liquidityNet":232275989916033622},{"index":3480,"liquidityGross":115374150983090013,"liquidityNet":115374150983090013},{"index":3600,"liquidityGross":79331825529224265,"liquidityNet":79331825529224265},{"index":3660,"liquidityGross":115572702976827263,"liquidityNet":115572702976827263},{"index":3780,"liquidityGross":536028252626531046,"liquidityNet":536028252626531046},{"index":3840,"liquidityGross":116725674847373000,"liquidityNet":116725674847373000},{"index":3960,"liquidityGross":595746826315901835,"liquidityNet":595746826315901835},{"index":4200,"liquidityGross":203844215379498273,"liquidityNet":203844215379498273},{"index":4260,"liquidityGross":25589851503658608,"liquidityNet":25589851503658608},{"index":4440,"liquidityGross":527103341304546321,"liquidityNet":527103341304546321},{"index":4500,"liquidityGross":200550351629618573,"liquidityNet":200550351629618573},{"index":4740,"liquidityGross":120408505604942635,"liquidityNet":120408505604942635},{"index":4860,"liquidityGross":319119646348760286,"liquidityNet":319119646348760286},{"index":5100,"liquidityGross":11109655509593210104,"liquidityNet":11109655509593210104},{"index":5280,"liquidityGross":20987386575371612294,"liquidityNet":20987386575371612294},{"index":5520,"liquidityGross":306902440073550403,"liquidityNet":306902440073550403},{"index":5640,"liquidityGross":108704825821598196,"liquidityNet":108704825821598196},{"index":5820,"liquidityGross":180881415998511955,"liquidityNet":180881415998511955},{"index":5880,"liquidityGross":163662273297142147,"liquidityNet":163662273297142147},{"index":5940,"liquidityGross":645903152916293469,"liquidityNet":645903152916293469},{"index":6000,"liquidityGross":2280187661781049213,"liquidityNet":2280187661781049213},{"index":6060,"liquidityGross":1118783771881935097,"liquidityNet":1118783771881935097},{"index":6120,"liquidityGross":457635030483768885,"liquidityNet":457635030483768885},{"index":6180,"liquidityGross":557244494148105024,"liquidityNet":557244494148105024},{"index":6240,"liquidityGross":62012018590109504,"liquidityNet":62012018590109504},{"index":6300,"liquidityGross":401847422661721675,"liquidityNet":401847422661721675},{"index":6360,"liquidityGross":120107093377538869,"liquidityNet":120107093377538869},{"index":6420,"liquidityGross":139987406297830236,"liquidityNet":139987406297830236},{"index":6480,"liquidityGross":1189432085941771067,"liquidityNet":1189432085941771067},{"index":6540,"liquidityGross":344082615078188266,"liquidityNet":344082615078188266},{"index":6600,"liquidityGross":430443448566078925,"liquidityNet":430443448566078925},{"index":6660,"liquidityGross":435583796523768375,"liquidityNet":435583796523768375},{"index":6720,"liquidityGross":256838432658823394,"liquidityNet":256838432658823394},{"index":6780,"liquidityGross":547093320036910921,"liquidityNet":547093320036910921},{"index":6840,"liquidityGross":121805050215621055,"liquidityNet":121805050215621055},{"index":6900,"liquidityGross":1166370266789480185,"liquidityNet":1166370266789480185},{"index":6960,"liquidityGross":3193303561346777761,"liquidityNet":3193303561346777761},{"index":7020,"liquidityGross":1088985919439402515,"liquidityNet":1088985919439402515},{"index":7080,"liquidityGross":78515585167432371,"liquidityNet":78515585167432371},{"index":7140,"liquidityGross":331921677524579797,"liquidityNet":331921677524579797},{"index":7200,"liquidityGross":69219720102024561,"liquidityNet":69219720102024561},{"index":7260,"liquidityGross":60357530618428086,"liquidityNet":60357530618428086},{"index":7320,"liquidityGross":1739976818398714810,"liquidityNet":1739976818398714810},{"index":7380,"liquidityGross":1476922169144287597,"liquidityNet":1476922169144287597},{"index":7440,"liquidityGross":256300538766222802,"liquidityNet":256300538766222802},{"index":7500,"liquidityGross":962861318737404444,"liquidityNet":962861318737404444},{"index":7560,"liquidityGross":582096801991411027,"liquidityNet":582096801991411027},{"index":7620,"liquidityGross":419408724834489757,"liquidityNet":419408724834489757},{"index":7680,"liquidityGross":467746801159678776,"liquidityNet":467746801159678776},{"index":7740,"liquidityGross":1260675905419890423,"liquidityNet":1260675905419890423},{"index":7800,"liquidityGross":661379888774074252,"liquidityNet":661379888774074252},{"index":7920,"liquidityGross":592778254113641492,"liquidityNet":592778254113641492},{"index":7980,"liquidityGross":1086176304976211727,"liquidityNet":1086176304976211727},{"index":8040,"liquidityGross":63873144458900804,"liquidityNet":63873144458900804},{"index":8100,"liquidityGross":2112801914269661272,"liquidityNet":2112801914269661272},{"index":8160,"liquidityGross":327940431833309145,"liquidityNet":327940431833309145},{"index":8220,"liquidityGross":261629276146022759,"liquidityNet":261629276146022759},{"index":8280,"liquidityGross":596199378353644034,"liquidityNet":596199378353644034},{"index":8340,"liquidityGross":4450555630425564115,"liquidityNet":4450555630425564115},{"index":8400,"liquidityGross":788052361106222795,"liquidityNet":788052361106222795},{"index":8460,"liquidityGross":384572699032012532,"liquidityNet":384572699032012532},{"index":8520,"liquidityGross":713302023185589878,"liquidityNet":713302023185589878},{"index":8580,"liquidityGross":745209311413602575,"liquidityNet":745209311413602575},{"index":8640,"liquidityGross":144637784578945068,"liquidityNet":144637784578945068},{"index":8760,"liquidityGross":86654615578536545,"liquidityNet":86654615578536545},{"index":8820,"liquidityGross":2719584097690040,"liquidityNet":2719584097690040},{"index":8880,"liquidityGross":18512690055771063610,"liquidityNet":18512690055771063610},{"index":9000,"liquidityGross":2313417276578653913,"liquidityNet":2313417276578653913},{"index":9060,"liquidityGross":3122026626458007,"liquidityNet":3122026626458007},{"index":9120,"liquidityGross":11237239386319880,"liquidityNet":11237239386319880},{"index":9180,"liquidityGross":3482409039351566654,"liquidityNet":3482409039351566654},{"index":9240,"liquidityGross":4132165968178445639,"liquidityNet":4132165968178445639},{"index":9300,"liquidityGross":1511732145184089,"liquidityNet":1511732145184089},{"index":9360,"liquidityGross":38570375032061548,"liquidityNet":38570375032061548},{"index":9420,"liquidityGross":70895946898184064,"liquidityNet":70895946898184064},{"index":9540,"liquidityGross":2444092667155970190,"liquidityNet":2444092667155970190},{"index":9600,"liquidityGross":92102246755840784,"liquidityNet":92102246755840784},{"index":9660,"liquidityGross":386007547852658293,"liquidityNet":386007547852658293},{"index":9720,"liquidityGross":12938688370669540,"liquidityNet":12938688370669540},{"index":9780,"liquidityGross":449078512331239943,"liquidityNet":449078512331239943},{"index":9900,"liquidityGross":523020993548174816,"liquidityNet":523020993548174816},{"index":9960,"liquidityGross":2260089924753883998,"liquidityNet":2260089924753883998},{"index":10020,"liquidityGross":131828879109435889,"liquidityNet":131828879109435889},{"index":10080,"liquidityGross":533829370150773548,"liquidityNet":533829370150773548},{"index":10200,"liquidityGross":800867189263660074,"liquidityNet":800867189263660074},{"index":10260,"liquidityGross":269559195516693716,"liquidityNet":269559195516693716},{"index":10440,"liquidityGross":537529924783436191,"liquidityNet":537529924783436191},{"index":10500,"liquidityGross":118189864112284509,"liquidityNet":118189864112284509},{"index":10560,"liquidityGross":1259973960019255645,"liquidityNet":1259973960019255645},{"index":10620,"liquidityGross":404761501639058871,"liquidityNet":-404761501639058871},{"index":10680,"liquidityGross":251948410475816038,"liquidityNet":251948410475816038},{"index":10740,"liquidityGross":442958873425570617,"liquidityNet":442958873425570617},{"index":10800,"liquidityGross":627129745367402727,"liquidityNet":627129745367402727},{"index":10860,"liquidityGross":648625161529980608,"liquidityNet":648625161529980608},{"index":10920,"liquidityGross":1698342735701105749,"liquidityNet":1698342735701105749},{"index":10980,"liquidityGross":305858651868955109,"liquidityNet":305858651868955109},{"index":11100,"liquidityGross":101206234738261827,"liquidityNet":101206234738261827},{"index":11160,"liquidityGross":19472935300469301,"liquidityNet":19472935300469301},{"index":11220,"liquidityGross":15683464766283470,"liquidityNet":15683464766283470},{"index":11280,"liquidityGross":260359615201006599,"liquidityNet":260359615201006599},{"index":11340,"liquidityGross":405026984348287273,"liquidityNet":405026984348287273},{"index":11400,"liquidityGross":373073271235373420,"liquidityNet":373073271235373420},{"index":11520,"liquidityGross":78820660475104094,"liquidityNet":78820660475104094},{"index":11580,"liquidityGross":220369994161711598,"liquidityNet":211967011472630032},{"index":11640,"liquidityGross":251752475378649340,"liquidityNet":251752475378649340},{"index":11700,"liquidityGross":121221616451408333,"liquidityNet":121221616451408333},{"index":11760,"liquidityGross":108125439135358022,"liquidityNet":108125439135358022},{"index":11820,"liquidityGross":1477523770302194483,"liquidityNet":1477523770302194483},{"index":11880,"liquidityGross":234740649488925226,"liquidityNet":234740649488925226},{"index":12000,"liquidityGross":696343077259702456,"liquidityNet":696343077259702456},{"index":12060,"liquidityGross":678698060233522893,"liquidityNet":678698060233522893},{"index":12120,"liquidityGross":638176274108164736,"liquidityNet":638176274108164736},{"index":12240,"liquidityGross":182039412971257050,"liquidityNet":182039412971257050},{"index":12300,"liquidityGross":44578449296586245,"liquidityNet":44578449296586245},{"index":12360,"liquidityGross":1636238222956518297,"liquidityNet":1636238222956518297},{"index":12420,"liquidityGross":364967838299083174,"liquidityNet":364967838299083174},{"index":12480,"liquidityGross":175404804395560035,"liquidityNet":175404804395560035},{"index":12540,"liquidityGross":1589549424197112490,"liquidityNet":1589549424197112490},{"index":12600,"liquidityGross":2431324661658685033,"liquidityNet":2431324661658685033},{"index":12660,"liquidityGross":718340350509073808,"liquidityNet":718340350509073808},{"index":12720,"liquidityGross":143445507561588498,"liquidityNet":143445507561588498},{"index":12780,"liquidityGross":1671129868108121401,"liquidityNet":1671129868108121401},{"index":12840,"liquidityGross":1184953426171253406,"liquidityNet":1184953426171253406},{"index":12900,"liquidityGross":106660297047277773,"liquidityNet":106660297047277773},{"index":12960,"liquidityGross":19336171289184006566,"liquidityNet":-17689208822358120654},{"index":13020,"liquidityGross":4060100300756405871,"liquidityNet":-3968302522084903137},{"index":13080,"liquidityGross":379279508059050042,"liquidityNet":379279508059050042},{"index":13140,"liquidityGross":199590429975345972,"liquidityNet":199590429975345972},{"index":13200,"liquidityGross":1099228898320102394,"liquidityNet":1099228898320102394},{"index":13260,"liquidityGross":1906861108071003759,"liquidityNet":1906861108071003759},{"index":13320,"liquidityGross":371724325768916527,"liquidityNet":371724325768916527},{"index":13380,"liquidityGross":1199899718677549117,"liquidityNet":1199899718677549117},{"index":13500,"liquidityGross":183552256725926805,"liquidityNet":183552256725926805},{"index":13560,"liquidityGross":164757264539029396,"liquidityNet":164757264539029396},{"index":13620,"liquidityGross":80984065225506635,"liquidityNet":80984065225506635},{"index":13680,"liquidityGross":1607590632524987268,"liquidityNet":1607590632524987268},{"index":13740,"liquidityGross":732228737773727436,"liquidityNet":405261463177897404},{"index":13860,"liquidityGross":8507755667102935919,"liquidityNet":8507755667102935919},{"index":13920,"liquidityGross":1157346909722380165,"liquidityNet":912663230391405265},{"index":13980,"liquidityGross":915187752352769785,"liquidityNet":915187752352769785},{"index":14040,"liquidityGross":244400726270500700,"liquidityNet":244400726270500700},{"index":14100,"liquidityGross":563377447073170739,"liquidityNet":-563377447073170739},{"index":14160,"liquidityGross":1622895392454739327,"liquidityNet":-520065752955662767},{"index":14220,"liquidityGross":251188372656311235,"liquidityNet":94157202321446493},{"index":14280,"liquidityGross":274574490769691270,"liquidityNet":-254228130095971610},{"index":14340,"liquidityGross":3684681520680549931,"liquidityNet":3684681520680549931},{"index":14400,"liquidityGross":115950866475381705,"liquidityNet":115950866475381705},{"index":14460,"liquidityGross":1474223284567654352,"liquidityNet":1474223284567654352},{"index":14520,"liquidityGross":5851320501623517913,"liquidityNet":5851320501623517913},{"index":14580,"liquidityGross":2874281706239295114,"liquidityNet":2409729726407227870},{"index":14640,"liquidityGross":186460020888501051,"liquidityNet":152013141219769475},{"index":14700,"liquidityGross":799943715082240252,"liquidityNet":-547330611997144716},{"index":14760,"liquidityGross":2905708615686622345,"liquidityNet":2498020184927625799},{"index":14820,"liquidityGross":3039776612470707755,"liquidityNet":1121904931759065399},{"index":14880,"liquidityGross":1698201821588619576,"liquidityNet":1698201821588619576},{"index":15000,"liquidityGross":886199927889147036,"liquidityNet":-185336654978157240},{"index":15060,"liquidityGross":1300282633584515602,"liquidityNet":975119773070714358},{"index":15120,"liquidityGross":820017110656613328,"liquidityNet":-770647446776814458},{"index":15180,"liquidityGross":2313417276578653913,"liquidityNet":-2313417276578653913},{"index":15240,"liquidityGross":1277440599754283328,"liquidityNet":1277440599754283328},{"index":15300,"liquidityGross":305030506267699840,"liquidityNet":-305030506267699840},{"index":15360,"liquidityGross":380105228515336643,"liquidityNet":-255121743602871483},{"index":15420,"liquidityGross":3690162319071775187,"liquidityNet":-3384904914711595667},{"index":15480,"liquidityGross":2823547246261913556,"liquidityNet":1639355631473047956},{"index":15540,"liquidityGross":564855165945399851,"liquidityNet":115921713805775791},{"index":15600,"liquidityGross":885337904119883442,"liquidityNet":-675160485885919730},{"index":15660,"liquidityGross":52739644539634462,"liquidityNet":26862267798295382},{"index":15720,"liquidityGross":3809599410061127586,"liquidityNet":-3809599410061127586},{"index":15780,"liquidityGross":184576760545186254,"liquidityNet":184576760545186254},{"index":15840,"liquidityGross":950161662430627687,"liquidityNet":-947859500959932115},{"index":16020,"liquidityGross":165754179474489638,"liquidityNet":165754179474489638},{"index":16080,"liquidityGross":1057707100397538659,"liquidityNet":1055437335621536623},{"index":16140,"liquidityGross":3127503008000428904,"liquidityNet":-1659940188721570340},{"index":16200,"liquidityGross":109104239119543973,"liquidityNet":109104239119543973},{"index":16260,"liquidityGross":74124277644770501,"liquidityNet":74124277644770501},{"index":16380,"liquidityGross":256744360783109458,"liquidityNet":256744360783109458},{"index":16440,"liquidityGross":181996060586652450,"liquidityNet":34075050304920058},{"index":16500,"liquidityGross":292662490473036874,"liquidityNet":292662490473036874},{"index":16560,"liquidityGross":506072148626231770,"liquidityNet":506072148626231770},{"index":16620,"liquidityGross":358347507577344960,"liquidityNet":-218002099470119526},{"index":16680,"liquidityGross":2097267855818897417,"liquidityNet":2097267855818897417},{"index":16740,"liquidityGross":3233442710863123945,"liquidityNet":3233442710863123945},{"index":16800,"liquidityGross":468712257852511052,"liquidityNet":468712257852511052},{"index":16860,"liquidityGross":391856187720045688,"liquidityNet":391856187720045688},{"index":16920,"liquidityGross":269298291361631845,"liquidityNet":269298291361631845},{"index":16980,"liquidityGross":1919658011042211824,"liquidityNet":-1477027460359999674},{"index":17040,"liquidityGross":3672233914734529813,"liquidityNet":-321729479769800999},{"index":17100,"liquidityGross":415069633822367924,"liquidityNet":415069633822367924},{"index":17160,"liquidityGross":2379384083943996736,"liquidityNet":1338581813281242164},{"index":17220,"liquidityGross":1040304040488739880,"liquidityNet":799487029278854610},{"index":17280,"liquidityGross":4915946853988758296,"liquidityNet":4915946853988758296},{"index":17340,"liquidityGross":367068519130387460,"liquidityNet":367068519130387460},{"index":17400,"liquidityGross":325836288386104269,"liquidityNet":325836288386104269},{"index":17460,"liquidityGross":2186843812538777566,"liquidityNet":2186843812538777566},{"index":17520,"liquidityGross":583940020395473791,"liquidityNet":194130963383370735},{"index":17580,"liquidityGross":2105596186493224584,"liquidityNet":654108841920267058},{"index":17640,"liquidityGross":1212558118615838715,"liquidityNet":465664473876577867},{"index":17700,"liquidityGross":1494117848120401866,"liquidityNet":-314474547995096478},{"index":17760,"liquidityGross":730787361736973180,"liquidityNet":730787361736973180},{"index":17820,"liquidityGross":883894044099716127,"liquidityNet":883894044099716127},{"index":17880,"liquidityGross":4870889592708063010,"liquidityNet":4870889592708063010},{"index":17940,"liquidityGross":6208434798367644191,"liquidityNet":6208434798367644191},{"index":18000,"liquidityGross":2254789644839233857,"liquidityNet":282541295192135675},{"index":18060,"liquidityGross":901125216577164485,"liquidityNet":881847449537523861},{"index":18120,"liquidityGross":1463590067474914578,"liquidityNet":825350774777394006},{"index":18180,"liquidityGross":684624895967592364,"liquidityNet":260262361966599190},{"index":18240,"liquidityGross":525216341292564960,"liquidityNet":-525216341292564960},{"index":18300,"liquidityGross":181287938245467017,"liquidityNet":22274564064091883},{"index":18360,"liquidityGross":1645323901358930722,"liquidityNet":1645323901358930722},{"index":18420,"liquidityGross":36626211051790761,"liquidityNet":36626211051790761},{"index":18480,"liquidityGross":3483233900072856545,"liquidityNet":2792682072148210809},{"index":18540,"liquidityGross":1177539248757684970,"liquidityNet":-993798788313089928},{"index":18600,"liquidityGross":13520780527402466736,"liquidityNet":12473586004026106380},{"index":18660,"liquidityGross":358777918454968638,"liquidityNet":358777918454968638},{"index":18720,"liquidityGross":743441012107358610,"liquidityNet":-598991240642870942},{"index":18780,"liquidityGross":1660488727732788020,"liquidityNet":-1128210715219421770},{"index":18840,"liquidityGross":1208064705077106228,"liquidityNet":1208064705077106228},{"index":18900,"liquidityGross":752726177212723025,"liquidityNet":-1279613092165577},{"index":18960,"liquidityGross":3664199526668425576,"liquidityNet":-1417476097436090266},{"index":19020,"liquidityGross":2064703790147476409,"liquidityNet":-1437486194797097419},{"index":19080,"liquidityGross":124911237661335712,"liquidityNet":124911237661335712},{"index":19140,"liquidityGross":1066556879043983360,"liquidityNet":-539036619854062014},{"index":19200,"liquidityGross":328982135644453856,"liquidityNet":-328982135644453856},{"index":19260,"liquidityGross":1415289677926362834,"liquidityNet":1415289677926362834},{"index":19320,"liquidityGross":1280757029853489031,"liquidityNet":506865264287421105},{"index":19380,"liquidityGross":1678522198853483491,"liquidityNet":-363193719774848089},{"index":19440,"liquidityGross":6410074618538826919,"liquidityNet":2805334770618184691},{"index":19500,"liquidityGross":612334643369918820,"liquidityNet":-518538910173853452},{"index":19560,"liquidityGross":3885193966472783017,"liquidityNet":2381831427868536095},{"index":19620,"liquidityGross":301064256208105074,"liquidityNet":301064256208105074},{"index":19680,"liquidityGross":2200808073310173993,"liquidityNet":-1052179800344834657},{"index":19740,"liquidityGross":462067860105504899341,"liquidityNet":461376582744429816639},{"index":19800,"liquidityGross":1574230817575990014,"liquidityNet":282424511743403076},{"index":19860,"liquidityGross":3693512788122854116,"liquidityNet":-1556441558588933448},{"index":19920,"liquidityGross":7433113646534537224,"liquidityNet":2935983859595093570},{"index":19980,"liquidityGross":726875417330962712,"liquidityNet":-188394643636575058},{"index":20040,"liquidityGross":5643863284088990518,"liquidityNet":-1454741043721223846},{"index":20100,"liquidityGross":1134389278282224477,"liquidityNet":-26020589064734885},{"index":20160,"liquidityGross":756358488844652498,"liquidityNet":-331381745571448322},{"index":20220,"liquidityGross":1066237712039601833,"liquidityNet":-453222675267641467},{"index":20280,"liquidityGross":1580262996323264446,"liquidityNet":405199116036617236},{"index":20340,"liquidityGross":1353823711404679550,"liquidityNet":-1315853361574896598},{"index":20400,"liquidityGross":700544674971453796,"liquidityNet":12379444815077264},{"index":20460,"liquidityGross":650959312880376316,"liquidityNet":117039690344048498},{"index":20520,"liquidityGross":3513103048788138861,"liquidityNet":2134424111809069479},{"index":20580,"liquidityGross":1387872016651629555,"liquidityNet":755509233811466713},{"index":20640,"liquidityGross":1340581033918121300,"liquidityNet":-42881175313590678},{"index":20700,"liquidityGross":1778979480701550760,"liquidityNet":1535369380270308650},{"index":20760,"liquidityGross":3444014393491287915,"liquidityNet":-212332378567479575},{"index":20820,"liquidityGross":3360905242518247727,"liquidityNet":-2847730389494217129},{"index":20880,"liquidityGross":2047977739387011802,"liquidityNet":-254306070082627514},{"index":20940,"liquidityGross":967189128440691861,"liquidityNet":753416864918873005},{"index":21000,"liquidityGross":2079515715311231575,"liquidityNet":530892575067900975},{"index":21060,"liquidityGross":4409899497390591052,"liquidityNet":-2321516570038983264},{"index":21120,"liquidityGross":2404665092024559575,"liquidityNet":1480960171345468327},{"index":21180,"liquidityGross":31805493774239407659,"liquidityNet":29521406691967831921},{"index":21240,"liquidityGross":1292580757536887847,"liquidityNet":641374948947035741},{"index":21300,"liquidityGross":1978563460990142380,"liquidityNet":-32150995210801072},{"index":21360,"liquidityGross":1877637150698311552,"liquidityNet":1499349972366293624},{"index":21420,"liquidityGross":1996214505429092201,"liquidityNet":-521918500664873349},{"index":21480,"liquidityGross":2126438553533332807,"liquidityNet":1018125770244451627},{"index":21540,"liquidityGross":22517518151201808307,"liquidityNet":-20548639991047829261},{"index":21600,"liquidityGross":587244487461312836,"liquidityNet":-143582519549175948},{"index":21660,"liquidityGross":806767100408711835,"liquidityNet":-515992677139436669},{"index":21720,"liquidityGross":441708027106037846,"liquidityNet":441708027106037846},{"index":21780,"liquidityGross":1240309854085667682,"liquidityNet":-883584905645560772},{"index":21840,"liquidityGross":896951682377972558,"liquidityNet":-815682533882389060},{"index":21900,"liquidityGross":826377381935961310,"liquidityNet":628420910775844614},{"index":21960,"liquidityGross":701005670092563631,"liquidityNet":-701005670092563631},{"index":22020,"liquidityGross":217902121476537160,"liquidityNet":-108010296183594148},{"index":22080,"liquidityGross":1825457048519766003,"liquidityNet":1751131948367344545},{"index":22140,"liquidityGross":1834753296289595866,"liquidityNet":528282197326541832},{"index":22200,"liquidityGross":2242388279894406598,"liquidityNet":1315599449087574638},{"index":22260,"liquidityGross":1009620723516687209,"liquidityNet":-492448734246310557},{"index":22320,"liquidityGross":709373255520802007,"liquidityNet":-709373255520802007},{"index":22380,"liquidityGross":1333605097209282729,"liquidityNet":-1096824186946893419},{"index":22500,"liquidityGross":31881557355103834,"liquidityNet":31881557355103834},{"index":22560,"liquidityGross":1298061396819507842,"liquidityNet":1298061396819507842},{"index":22620,"liquidityGross":1964065698630318195,"liquidityNet":1964065698630318195},{"index":22680,"liquidityGross":38605485090804460,"liquidityNet":38605485090804460},{"index":22740,"liquidityGross":60493255282607623290,"liquidityNet":60493255282607623290},{"index":22800,"liquidityGross":77031505802607372,"liquidityNet":70787452549691358},{"index":22860,"liquidityGross":80181491477231618,"liquidityNet":80181491477231618},{"index":22920,"liquidityGross":174769930448240939,"liquidityNet":174769930448240939},{"index":22980,"liquidityGross":286062726104992665,"liquidityNet":159794377550034601},{"index":23040,"liquidityGross":13619302818964061905,"liquidityNet":-12399395077552196753},{"index":23100,"liquidityGross":500950392454539630576,"liquidityNet":500152502966359564292},{"index":23160,"liquidityGross":4736863776052554549,"liquidityNet":3720867754423125749},{"index":23220,"liquidityGross":110232849260588329,"liquidityNet":-72064061581553107},{"index":23280,"liquidityGross":1505282402168411,"liquidityNet":1505282402168411},{"index":23340,"liquidityGross":3735420058284312428,"liquidityNet":3020267035627672096},{"index":23400,"liquidityGross":1863029682642489911,"liquidityNet":-935915903689558313},{"index":23460,"liquidityGross":4373724069862179747,"liquidityNet":1297362233056235481},{"index":23520,"liquidityGross":10886666869070560170,"liquidityNet":9856451790810559246},{"index":23580,"liquidityGross":339769284114993655,"liquidityNet":-254779922623313393},{"index":23640,"liquidityGross":639994020856093081,"liquidityNet":639994020856093081},{"index":23700,"liquidityGross":408542929485693042,"liquidityNet":-408542929485693042},{"index":23760,"liquidityGross":95067441100500857,"liquidityNet":-56107035095175355},{"index":23820,"liquidityGross":51345743401416596,"liquidityNet":-28458012239896174},{"index":23880,"liquidityGross":1867140646446979646,"liquidityNet":-289536326166968870},{"index":23940,"liquidityGross":297942741216885746,"liquidityNet":-297942741216885746},{"index":24060,"liquidityGross":895687844644109328,"liquidityNet":-816113755726724092},{"index":24120,"liquidityGross":554659293342729475,"liquidityNet":15540902309342043},{"index":24180,"liquidityGross":2730658022893363403,"liquidityNet":2706108590853199399},{"index":24240,"liquidityGross":181304451803827173,"liquidityNet":65120226068875699},{"index":24300,"liquidityGross":209595849453209459,"liquidityNet":209595849453209459},{"index":24360,"liquidityGross":437379114521993001,"liquidityNet":437379114521993001},{"index":24420,"liquidityGross":911460463962154862,"liquidityNet":-713450772126147044},{"index":24480,"liquidityGross":236246810889925197,"liquidityNet":-236246810889925197},{"index":24540,"liquidityGross":537901292147575496,"liquidityNet":-537901292147575496},{"index":24600,"liquidityGross":1040219404834936905,"liquidityNet":-1006288548150152235},{"index":24660,"liquidityGross":74732783941437247773,"liquidityNet":71560268191283448777},{"index":24720,"liquidityGross":1070755319926290727,"liquidityNet":1070755319926290727},{"index":24780,"liquidityGross":435318555404861272,"liquidityNet":-415701508074782434},{"index":24840,"liquidityGross":165659133681882937,"liquidityNet":-165659133681882937},{"index":24900,"liquidityGross":141961595951345476,"liquidityNet":-101551631749670178},{"index":24960,"liquidityGross":102372746104041494,"liquidityNet":-102372746104041494},{"index":25020,"liquidityGross":495133162848287756,"liquidityNet":-495133162848287756},{"index":25080,"liquidityGross":948060011421710388,"liquidityNet":-827649152549122004},{"index":25140,"liquidityGross":1584192860159734161,"liquidityNet":1584192860159734161},{"index":25200,"liquidityGross":1685014264324660949,"liquidityNet":1685014264324660949},{"index":25260,"liquidityGross":109636318288962069,"liquidityNet":109636318288962069},{"index":25320,"liquidityGross":146768786292743853,"liquidityNet":146768786292743853},{"index":25380,"liquidityGross":810962935423826460,"liquidityNet":417898619774084124},{"index":25440,"liquidityGross":968835187210070516,"liquidityNet":-13972162510023024},{"index":25500,"liquidityGross":382759576001753707,"liquidityNet":-120745374755544973},{"index":25560,"liquidityGross":3426532874356497972,"liquidityNet":2259549116417309000},{"index":25620,"liquidityGross":1111065667702715049,"liquidityNet":582415525943976571},{"index":25680,"liquidityGross":42384282287787031579,"liquidityNet":41695967144159299527},{"index":25800,"liquidityGross":659950974841331926,"liquidityNet":-652255491969612816},{"index":25860,"liquidityGross":1599103856491637287,"liquidityNet":1542187564951078373},{"index":25920,"liquidityGross":487379393857686350,"liquidityNet":487379393857686350},{"index":25980,"liquidityGross":952551028049606268,"liquidityNet":-323801520166723204},{"index":26040,"liquidityGross":780593442387333313,"liquidityNet":-117178403378546863},{"index":26100,"liquidityGross":367901452797488836,"liquidityNet":367901452797488836},{"index":26160,"liquidityGross":88094404922933091,"liquidityNet":-1062493670239399},{"index":26220,"liquidityGross":1317466442253673494,"liquidityNet":-29088900564229170},{"index":26280,"liquidityGross":2048835253498149457,"liquidityNet":-2048835253498149457},{"index":26340,"liquidityGross":1654051861555452212,"liquidityNet":-163838873059647416},{"index":26400,"liquidityGross":761923913507303957,"liquidityNet":761923913507303957},{"index":26460,"liquidityGross":240497228846881750739,"liquidityNet":239326763322730022853},{"index":26520,"liquidityGross":154685886569420219,"liquidityNet":80231095004446827},{"index":26580,"liquidityGross":76939212257647286,"liquidityNet":47306155253266040},{"index":26640,"liquidityGross":92979794514248056,"liquidityNet":-92979794514248056},{"index":26700,"liquidityGross":430042060661841489,"liquidityNet":-55541885959513413},{"index":26760,"liquidityGross":2947964175454083,"liquidityNet":-2947964175454083},{"index":26820,"liquidityGross":311922807417633532,"liquidityNet":-311922807417633532},{"index":26940,"liquidityGross":190125646171516780,"liquidityNet":190125646171516780},{"index":27000,"liquidityGross":1429925931824679158,"liquidityNet":1429925931824679158},{"index":27060,"liquidityGross":619125867275372565,"liquidityNet":-619125867275372565},{"index":27120,"liquidityGross":528348530024473222,"liquidityNet":-528348530024473222},{"index":27180,"liquidityGross":188391082392094492,"liquidityNet":-188391082392094492},{"index":27420,"liquidityGross":74873353699768127,"liquidityNet":74873353699768127},{"index":27480,"liquidityGross":6816900668994920874,"liquidityNet":6816900668994920874},{"index":27600,"liquidityGross":5040194603993193,"liquidityNet":-5040194603993193},{"index":27720,"liquidityGross":6824802625339842924,"liquidityNet":-2805758255366672248},{"index":27780,"liquidityGross":3151909078695915800,"liquidityNet":-3151909078695915800},{"index":27840,"liquidityGross":404502838233692433,"liquidityNet":-404502838233692433},{"index":27900,"liquidityGross":441708027106037846,"liquidityNet":-441708027106037846},{"index":28020,"liquidityGross":787749347083057347,"liquidityNet":-787749347083057347},{"index":28140,"liquidityGross":624520504430007281,"liquidityNet":-624520504430007281},{"index":28200,"liquidityGross":3230642638892482332,"liquidityNet":-3230642638892482332},{"index":28260,"liquidityGross":120378036769716833,"liquidityNet":-120378036769716833},{"index":28320,"liquidityGross":3553958419446278691,"liquidityNet":-3553958419446278691},{"index":28380,"liquidityGross":8023712814787150305,"liquidityNet":-8023712814787150305},{"index":28440,"liquidityGross":232154051713297615,"liquidityNet":-232154051713297615},{"index":28680,"liquidityGross":2698899380282040573,"liquidityNet":-2698899380282040573},{"index":28740,"liquidityGross":262660939202151250,"liquidityNet":-262660939202151250},{"index":28800,"liquidityGross":74873353699768127,"liquidityNet":-74873353699768127},{"index":28860,"liquidityGross":152790310656374161,"liquidityNet":-152790310656374161},{"index":28920,"liquidityGross":239797981791158311125,"liquidityNet":-239797981791158311125},{"index":29040,"liquidityGross":949659186392404492,"liquidityNet":730379569947227480},{"index":29100,"liquidityGross":174509923407876901,"liquidityNet":-174509923407876901},{"index":29160,"liquidityGross":540746377957382632,"liquidityNet":-540746377957382632},{"index":29220,"liquidityGross":141519774199266537,"liquidityNet":-141519774199266537},{"index":29280,"liquidityGross":352021958707075301,"liquidityNet":-352021958707075301},{"index":29340,"liquidityGross":269268310790080119,"liquidityNet":-100340641281520393},{"index":29400,"liquidityGross":321467723385586456,"liquidityNet":-321467723385586456},{"index":29460,"liquidityGross":344659752216897038,"liquidityNet":-344659752216897038},{"index":29580,"liquidityGross":7836933056659474963,"liquidityNet":2627200887259081971},{"index":29640,"liquidityGross":6907230303023606575,"liquidityNet":-6907230303023606575},{"index":29700,"liquidityGross":15910168588973102,"liquidityNet":-15910168588973102},{"index":29760,"liquidityGross":1151080735347786,"liquidityNet":-1151080735347786},{"index":29880,"liquidityGross":38260753011380106,"liquidityNet":-38260753011380106},{"index":29940,"liquidityGross":61078227732737828903,"liquidityNet":-61078226476394857541},{"index":30000,"liquidityGross":110148618804557271,"liquidityNet":-110147232253917417},{"index":30060,"liquidityGross":165639709590644688,"liquidityNet":-165638162227004936},{"index":30120,"liquidityGross":181827449279502060,"liquidityNet":-181825698189571024},{"index":30180,"liquidityGross":1008699673466,"liquidityNet":1008699673466},{"index":30240,"liquidityGross":297804337676182782,"liquidityNet":-297801956826260468},{"index":30300,"liquidityGross":7997125784848382728,"liquidityNet":-7997122879854347690},{"index":30360,"liquidityGross":42148583214515009180,"liquidityNet":-42148578869750561702},{"index":30420,"liquidityGross":646065671351238167,"liquidityNet":-646059164493033473},{"index":30480,"liquidityGross":201985804179237455,"liquidityNet":-201972811080018817},{"index":30540,"liquidityGross":2279009617594108681,"liquidityNet":-2279009617594108681},{"index":30600,"liquidityGross":3250922544858062179,"liquidityNet":-3250922544858062179},{"index":30660,"liquidityGross":532122072660138620,"liquidityNet":-532122072660138620},{"index":30720,"liquidityGross":315761463632127871,"liquidityNet":-315761463632127871},{"index":30780,"liquidityGross":76024606963319627595,"liquidityNet":-76024606963319627595},{"index":30840,"liquidityGross":300036336107342114,"liquidityNet":-300036336107342114},{"index":30900,"liquidityGross":1755140330727692068,"liquidityNet":-1755140330727692068},{"index":30960,"liquidityGross":482852897170136481,"liquidityNet":-482852897170136481},{"index":31020,"liquidityGross":1074279030708081830,"liquidityNet":-1074279030708081830},{"index":31080,"liquidityGross":672992948516202536,"liquidityNet":-672992948516202536},{"index":31140,"liquidityGross":2033622861670708138,"liquidityNet":-2033622861670708138},{"index":31200,"liquidityGross":845814451195157741,"liquidityNet":-845814451195157741},{"index":31260,"liquidityGross":1432042503901329778,"liquidityNet":-1432042503901329778},{"index":31320,"liquidityGross":2018749200441435845,"liquidityNet":-2018749200441435845},{"index":31380,"liquidityGross":2580813121737180143,"liquidityNet":-2580813121737180143},{"index":31440,"liquidityGross":1273053526885481499,"liquidityNet":-1273053526885481499},{"index":31500,"liquidityGross":718689257828602859,"liquidityNet":-718689257828602859},{"index":31560,"liquidityGross":199217855540916469,"liquidityNet":-199217855540916469},{"index":31620,"liquidityGross":1066822504436361583,"liquidityNet":-1066822504436361583},{"index":31680,"liquidityGross":799234314543306056,"liquidityNet":-799234314543306056},{"index":31740,"liquidityGross":2527564871120315440,"liquidityNet":-2527564871120315440},{"index":31800,"liquidityGross":5921783347536746306,"liquidityNet":-5921783347536746306},{"index":31860,"liquidityGross":766544768553408504,"liquidityNet":-766544768553408504},{"index":31920,"liquidityGross":891486333057344173,"liquidityNet":-891486333057344173},{"index":31980,"liquidityGross":2269091690058201554,"liquidityNet":-2269091690058201554},{"index":32040,"liquidityGross":3539941601568290613,"liquidityNet":-3539941601568290613},{"index":32100,"liquidityGross":600346569199347117,"liquidityNet":-600346569199347117},{"index":32160,"liquidityGross":314374753941441532,"liquidityNet":-314374753941441532},{"index":32220,"liquidityGross":455664461336092399,"liquidityNet":-455664461336092399},{"index":32280,"liquidityGross":36626211051790761,"liquidityNet":-36626211051790761},{"index":32340,"liquidityGross":1368925371797991747,"liquidityNet":-1368925371797991747},{"index":32400,"liquidityGross":84370398327058774,"liquidityNet":-84370398327058774},{"index":32460,"liquidityGross":1369184222457512277,"liquidityNet":-1369184222457512277},{"index":32520,"liquidityGross":886584020552658412,"liquidityNet":-886584020552658412},{"index":32580,"liquidityGross":800278661674287047,"liquidityNet":-800278661674287047},{"index":32640,"liquidityGross":757906915545925023,"liquidityNet":-757906915545925023},{"index":32700,"liquidityGross":359139988271054513,"liquidityNet":-359139988271054513},{"index":32760,"liquidityGross":789634324648460479,"liquidityNet":-789634324648460479},{"index":32820,"liquidityGross":461435947136934782160,"liquidityNet":-461435947136934782160},{"index":32880,"liquidityGross":325212992973391873,"liquidityNet":-325212992973391873},{"index":32940,"liquidityGross":650806976827629837,"liquidityNet":-650806976827629837},{"index":33000,"liquidityGross":28994391016606545560,"liquidityNet":-28994391016606545560},{"index":33060,"liquidityGross":1791970788517195346,"liquidityNet":-1791970788517195346},{"index":33120,"liquidityGross":1635878835974092718,"liquidityNet":-1635878835974092718},{"index":33180,"liquidityGross":3728385080877895,"liquidityNet":-3728385080877895},{"index":33240,"liquidityGross":5393603599835974,"liquidityNet":-5393603599835974},{"index":33300,"liquidityGross":69573746992593282,"liquidityNet":-69573746992593282},{"index":33360,"liquidityGross":48142403063285577,"liquidityNet":-48142403063285577},{"index":33420,"liquidityGross":2915079478345810231,"liquidityNet":-2915079478345810231},{"index":33480,"liquidityGross":31547748396238930,"liquidityNet":-31547748396238930},{"index":33540,"liquidityGross":558541509884917915,"liquidityNet":-558541509884917915},{"index":33600,"liquidityGross":2077563777361748722,"liquidityNet":-2077563777361748722},{"index":33660,"liquidityGross":848979893035228956,"liquidityNet":-848979893035228956},{"index":33720,"liquidityGross":1676278224424323557,"liquidityNet":-1676278224424323557},{"index":33780,"liquidityGross":1569143393247639711,"liquidityNet":-1569143393247639711},{"index":33840,"liquidityGross":318625606984473902,"liquidityNet":-318625606984473902},{"index":33900,"liquidityGross":234199385667118550,"liquidityNet":-234199385667118550},{"index":33960,"liquidityGross":499864830371208926069,"liquidityNet":-499864830371208926069},{"index":34020,"liquidityGross":50780941032000932,"liquidityNet":-50780941032000932},{"index":34080,"liquidityGross":4967757741971065085,"liquidityNet":-4967757741971065085},{"index":34140,"liquidityGross":992731056179940841,"liquidityNet":-992731056179940841},{"index":34200,"liquidityGross":1375035099664177,"liquidityNet":-1375035099664177},{"index":34260,"liquidityGross":279651459894125019,"liquidityNet":-279651459894125019},{"index":34320,"liquidityGross":462960078688358404,"liquidityNet":-462960078688358404},{"index":34380,"liquidityGross":51776822685439808,"liquidityNet":-51776822685439808},{"index":34440,"liquidityGross":1071690625231548134,"liquidityNet":-1071690625231548134},{"index":34500,"liquidityGross":966430900850370812,"liquidityNet":-966430900850370812},{"index":34560,"liquidityGross":320785875097627754,"liquidityNet":-320785875097627754},{"index":34620,"liquidityGross":2750670403774445334,"liquidityNet":-2750670403774445334},{"index":34680,"liquidityGross":179039612986964662,"liquidityNet":-179039612986964662},{"index":34740,"liquidityGross":3044372635907653057,"liquidityNet":-3044372635907653057},{"index":34800,"liquidityGross":601602681814471918,"liquidityNet":-601602681814471918},{"index":34860,"liquidityGross":796587028695412144,"liquidityNet":-796587028695412144},{"index":34920,"liquidityGross":364908509026165629,"liquidityNet":-364908509026165629},{"index":34980,"liquidityGross":1216854034541080523,"liquidityNet":-1216854034541080523},{"index":35040,"liquidityGross":2025103013247647647,"liquidityNet":-2025103013247647647},{"index":35100,"liquidityGross":967750456123243399,"liquidityNet":-967750456123243399},{"index":35160,"liquidityGross":1720602104162603318,"liquidityNet":-1720602104162603318},{"index":35220,"liquidityGross":2029681044170356067,"liquidityNet":-2029681044170356067},{"index":35280,"liquidityGross":772042740397661844,"liquidityNet":-772042740397661844},{"index":35340,"liquidityGross":1424700965253651647,"liquidityNet":-1424700965253651647},{"index":35400,"liquidityGross":904436544817608710,"liquidityNet":-904436544817608710},{"index":35460,"liquidityGross":199633535408950529,"liquidityNet":-199633535408950529},{"index":35520,"liquidityGross":7073096583966544,"liquidityNet":-7073096583966544},{"index":35640,"liquidityGross":236002329628324759,"liquidityNet":-236002329628324759},{"index":35700,"liquidityGross":83859074862721171,"liquidityNet":-83859074862721171},{"index":35760,"liquidityGross":727399146355902962,"liquidityNet":-727399146355902962},{"index":36000,"liquidityGross":1166449935521213403,"liquidityNet":-1166449935521213403},{"index":36060,"liquidityGross":1487529081130154033,"liquidityNet":-1487529081130154033},{"index":36120,"liquidityGross":878954896563437993,"liquidityNet":-878954896563437993},{"index":36240,"liquidityGross":118390455131194655,"liquidityNet":-118390455131194655},{"index":36420,"liquidityGross":1037702421500152452,"liquidityNet":-1037702421500152452},{"index":36660,"liquidityGross":4742969412070269,"liquidityNet":-4742969412070269},{"index":36720,"liquidityGross":51406225594992645,"liquidityNet":-51406225594992645},{"index":36780,"liquidityGross":681956915027141903,"liquidityNet":-681956915027141903},{"index":36900,"liquidityGross":20650770326900656828,"liquidityNet":-20650770326900656828},{"index":36960,"liquidityGross":493802086552523312,"liquidityNet":-493802086552523312},{"index":37020,"liquidityGross":5309839118386082459,"liquidityNet":-5309839118386082459},{"index":37080,"liquidityGross":19084393839517611,"liquidityNet":-19084393839517611},{"index":37140,"liquidityGross":1505282402168411,"liquidityNet":-1505282402168411},{"index":37200,"liquidityGross":772977462255795766,"liquidityNet":-772977462255795766},{"index":37320,"liquidityGross":1235089846051892250,"liquidityNet":-1235089846051892250},{"index":37380,"liquidityGross":10209517951313643561,"liquidityNet":-10209517951313643561},{"index":37440,"liquidityGross":161759159544696053,"liquidityNet":-161759159544696053},{"index":37620,"liquidityGross":19480203002662751,"liquidityNet":-19480203002662751},{"index":46080,"liquidityGross":3106023290032882651,"liquidityNet":-3106023290032882651},{"index":49380,"liquidityGross":40634574247791749,"liquidityNet":-40634574247791749},{"index":57060,"liquidityGross":80417635217044222,"liquidityNet":-80417635217044222},{"index":887220,"liquidityGross":185286181966618706439,"liquidityNet":-185286181966618706439}]}` +var poolExtraGob = `{"liquidity":1768557010563536833397,"sqrtPriceX96":307728010760542456554610335257,"tick":27139,"ticksGob":[{"index":-887220,"liquidityGross":"AgodIXTiq46njw==","liquidityNet":"AgodIXTiq46njw=="},{"index":-138180,"liquidityGross":"AgdekBtebIh1","liquidityNet":"AgdekBtebIh1"},{"index":-46080,"liquidityGross":"AgFhBFcG2mY=","liquidityNet":"AgFhBFcG2mY="},{"index":-23100,"liquidityGross":"AoR7e65s6XU=","liquidityNet":"A4R7e65s6XU="},{"index":-23040,"liquidityGross":"AggL5zg6yNwR","liquidityNet":"AwcvgxlcHhSx"},{"index":-22980,"liquidityGross":"AsY9XZk1wNc=","liquidityNet":"A8Y9XZk1wNc="},{"index":-16080,"liquidityGross":"AmIXYdR8mpo=","liquidityNet":"A2IXYdR8mpo="},{"index":-12060,"liquidityGross":"AgGrBwr7UBU=","liquidityNet":"AgGrBwr7UBU="},{"index":-6960,"liquidityGross":"AgaSLzKc2zQ=","liquidityNet":"AgaSLzKc2zQ="},{"index":-3540,"liquidityGross":"AlhC9qpiblI=","liquidityNet":"AlhC9qpiblI="},{"index":0,"liquidityGross":"AgGfntVQzL29","liquidityNet":"AgGfntVQzL29"},{"index":2580,"liquidityGross":"AgEGwrAEVGyU","liquidityNet":"AgEGwrAEVGyU"},{"index":3000,"liquidityGross":"AgM5Ncg8zCJW","liquidityNet":"AgM5Ncg8zCJW"},{"index":3480,"liquidityGross":"AgGZ5C3Vm/9d","liquidityNet":"AgGZ5C3Vm/9d"},{"index":3600,"liquidityGross":"AgEZ1+AADXxJ","liquidityNet":"AgEZ1+AADXxJ"},{"index":3660,"liquidityGross":"AgGamMLSql9/","liquidityNet":"AgGamMLSql9/"},{"index":3780,"liquidityGross":"AgdwWtsTYLLm","liquidityNet":"AgdwWtsTYLLm"},{"index":3840,"liquidityGross":"AgGesWIBcgbI","liquidityNet":"AgGesWIBcgbI"},{"index":3960,"liquidityGross":"AghEhJUGoCuL","liquidityNet":"AghEhJUGoCuL"},{"index":4200,"liquidityGross":"AgLUMzvfNpUh","liquidityNet":"AgLUMzvfNpUh"},{"index":4260,"liquidityGross":"Alrp1Zi7BnA=","liquidityNet":"Alrp1Zi7BnA="},{"index":4440,"liquidityGross":"AgdQpbI6YQQR","liquidityNet":"AgdQpbI6YQQR"},{"index":4500,"liquidityGross":"AgLIf3t0do2N","liquidityNet":"AgLIf3t0do2N"},{"index":4740,"liquidityGross":"AgGrxuXchKsr","liquidityNet":"AgGrxuXchKsr"},{"index":4860,"liquidityGross":"AgRtvaCpd1Te","liquidityNet":"AgRtvaCpd1Te"},{"index":5100,"liquidityGross":"ApotbNMSQ7z4","liquidityNet":"ApotbNMSQ7z4"},{"index":5280,"liquidityGross":"AgEjQizk9NOwhg==","liquidityNet":"AgEjQizk9NOwhg=="},{"index":5520,"liquidityGross":"AgRCViSpSNpD","liquidityNet":"AgRCViSpSNpD"},{"index":5640,"liquidityGross":"AgGCMnaQd5H0","liquidityNet":"AgGCMnaQd5H0"},{"index":5820,"liquidityGross":"AgKCnrCDD5tT","liquidityNet":"AgKCnrCDD5tT"},{"index":5880,"liquidityGross":"AgJFcfhvAlGD","liquidityNet":"AgJFcfhvAlGD"},{"index":5940,"liquidityGross":"Agj2tX7U4Wdd","liquidityNet":"Agj2tX7U4Wdd"},{"index":6000,"liquidityGross":"Ah+k2pjxsB99","liquidityNet":"Ah+k2pjxsB99"},{"index":6060,"liquidityGross":"Ag+Gt+m3fpD5","liquidityNet":"Ag+Gt+m3fpD5"},{"index":6120,"liquidityGross":"AgZZ2KK0wpY1","liquidityNet":"AgZZ2KK0wpY1"},{"index":6180,"liquidityGross":"Age7uuo+vXNA","liquidityNet":"Age7uuo+vXNA"},{"index":6240,"liquidityGross":"AtxPmjPeT0A=","liquidityNet":"AtxPmjPeT0A="},{"index":6300,"liquidityGross":"AgWTphoRqH5L","liquidityNet":"AgWTphoRqH5L"},{"index":6360,"liquidityGross":"AgGqtMPbxds1","liquidityNet":"AgGqtMPbxds1"},{"index":6420,"liquidityGross":"AgHxVc3paRNc","liquidityNet":"AgHxVc3paRNc"},{"index":6480,"liquidityGross":"AhCBti4nAts7","liquidityNet":"AhCBti4nAts7"},{"index":6540,"liquidityGross":"AgTGbVC9H3Tq","liquidityNet":"AgTGbVC9H3Tq"},{"index":6600,"liquidityGross":"AgX5PgkvrN3N","liquidityNet":"AgX5PgkvrN3N"},{"index":6660,"liquidityGross":"AgYLgSe1txo3","liquidityNet":"AgYLgSe1txo3"},{"index":6720,"liquidityGross":"AgOQeTGXTBji","liquidityNet":"AgOQeTGXTBji"},{"index":6780,"liquidityGross":"AgeXqnnXygdJ","liquidityNet":"AgeXqnnXygdJ"},{"index":6840,"liquidityGross":"AgGwvQw982G/","liquidityNet":"AgGwvQw982G/"},{"index":6900,"liquidityGross":"AhAvx5P0kIb5","liquidityNet":"AhAvx5P0kIb5"},{"index":6960,"liquidityGross":"AixQ5KuSEIKh","liquidityNet":"AixQ5KuSEIKh"},{"index":7020,"liquidityGross":"Ag8c2uyNlnYT","liquidityNet":"Ag8c2uyNlnYT"},{"index":7080,"liquidityGross":"AgEW8YI7PJqz","liquidityNet":"AgEW8YI7PJqz"},{"index":7140,"liquidityGross":"AgSbOQHSGrXV","liquidityNet":"AgSbOQHSGrXV"},{"index":7200,"liquidityGross":"AvXq9/wiFXE=","liquidityNet":"AvXq9/wiFXE="},{"index":7260,"liquidityGross":"AtZu2rQH+rY=","liquidityNet":"AtZu2rQH+rY="},{"index":7320,"liquidityGross":"Ahglo7KSEdu6","liquidityNet":"Ahglo7KSEdu6"},{"index":7380,"liquidityGross":"AhR/FONEvqFt","liquidityNet":"AhR/FONEvqFt"},{"index":7440,"liquidityGross":"AgOOj/to5uXS","liquidityNet":"AgOOj/to5uXS"},{"index":7500,"liquidityGross":"Ag1cxUSXTqIc","liquidityNet":"Ag1cxUSXTqIc"},{"index":7560,"liquidityGross":"AggUBfUTlsVT","liquidityNet":"AggUBfUTlsVT"},{"index":7620,"liquidityGross":"AgXSCgNbdZWd","liquidityNet":"AgXSCgNbdZWd"},{"index":7680,"liquidityGross":"AgZ9xTzH8qs4","liquidityNet":"AgZ9xTzH8qs4"},{"index":7740,"liquidityGross":"AhF+0g5/ck73","liquidityNet":"AhF+0g5/ck73"},{"index":7800,"liquidityGross":"AgktsYEz90+M","liquidityNet":"AgktsYEz90+M"},{"index":7920,"liquidityGross":"Agg5+K5zBRQU","liquidityNet":"Agg5+K5zBRQU"},{"index":7980,"liquidityGross":"Ag8S35g1ja8P","liquidityNet":"Ag8S35g1ja8P"},{"index":8040,"liquidityGross":"AuLsSVYo9UQ=","liquidityNet":"AuLsSVYo9UQ="},{"index":8100,"liquidityGross":"Ah1SLiWczvhY","liquidityNet":"Ah1SLiWczvhY"},{"index":8160,"liquidityGross":"AgSNFBXS6Z/Z","liquidityNet":"AgSNFBXS6Z/Z"},{"index":8220,"liquidityGross":"AgOhfnDDhrln","liquidityNet":"AgOhfnDDhrln"},{"index":8280,"liquidityGross":"AghGIC0CE+IC","liquidityNet":"AghGIC0CE+IC"},{"index":8340,"liquidityGross":"Aj3DjMQMoWPT","liquidityNet":"Aj3DjMQMoWPT"},{"index":8400,"liquidityGross":"AgrvuXJ4JO7L","liquidityNet":"AgrvuXJ4JO7L"},{"index":8460,"liquidityGross":"AgVWRtUMHcb0","liquidityNet":"AgVWRtUMHcb0"},{"index":8520,"liquidityGross":"AgnmKGkti2Z2","liquidityNet":"AgnmKGkti2Z2"},{"index":8580,"liquidityGross":"AgpXg+uiHwkP","liquidityNet":"AgpXg+uiHwkP"},{"index":8640,"liquidityGross":"AgIB20x67XAs","liquidityNet":"AgIB20x67XAs"},{"index":8760,"liquidityGross":"AgEz2+nrtOph","liquidityNet":"AgEz2+nrtOph"},{"index":8820,"liquidityGross":"AgmpcoQUYbg=","liquidityNet":"AgmpcoQUYbg="},{"index":8880,"liquidityGross":"AgEA6kmFcyQFOg==","liquidityNet":"AgEA6kmFcyQFOg=="},{"index":9000,"liquidityGross":"AiAa6MGLuObZ","liquidityNet":"AiAa6MGLuObZ"},{"index":9060,"liquidityGross":"AgsXd3gMoZc=","liquidityNet":"AgsXd3gMoZc="},{"index":9120,"liquidityGross":"AifsNa3grAg=","liquidityNet":"AifsNa3grAg="},{"index":9180,"liquidityGross":"AjBUAJIZKNE+","liquidityNet":"AjBUAJIZKNE+"},{"index":9240,"liquidityGross":"AjlYZw4OO/1H","liquidityNet":"AjlYZw4OO/1H"},{"index":9300,"liquidityGross":"AgVe6ZGCXVk=","liquidityNet":"AgVe6ZGCXVk="},{"index":9360,"liquidityGross":"AokHjT6jvmw=","liquidityNet":"AokHjT6jvmw="},{"index":9420,"liquidityGross":"AvvffPLhl4A=","liquidityNet":"AvvffPLhl4A="},{"index":9540,"liquidityGross":"AiHrKVTX9/iO","liquidityNet":"AiHrKVTX9/iO"},{"index":9600,"liquidityGross":"AgFHNoFk5bMQ","liquidityNet":"AgFHNoFk5bMQ"},{"index":9660,"liquidityGross":"AgVbX9HSYJZ1","liquidityNet":"AgVbX9HSYJZ1"},{"index":9720,"liquidityGross":"Ai33qyQxd+Q=","liquidityNet":"Ai33qyQxd+Q="},{"index":9780,"liquidityGross":"AgY7cocTw7IH","liquidityNet":"AgY7cocTw7IH"},{"index":9900,"liquidityGross":"AgdCJNKSgsXg","liquidityNet":"AgdCJNKSgsXg"},{"index":9960,"liquidityGross":"Ah9dc8/lZQNe","liquidityNet":"Ah9dc8/lZQNe"},{"index":10020,"liquidityGross":"AgHUWarGdLHx","liquidityNet":"AgHUWarGdLHx"},{"index":10080,"liquidityGross":"AgdoivvageMs","liquidityNet":"AgdoivvageMs"},{"index":10200,"liquidityGross":"AgsdQHcoU3Qq","liquidityNet":"AgsdQHcoU3Qq"},{"index":10260,"liquidityGross":"AgO9qqj+tmzU","liquidityNet":"AgO9qqj+tmzU"},{"index":10440,"liquidityGross":"Agd1sJ5e2/Gf","liquidityNet":"Agd1sJ5e2/Gf"},{"index":10500,"liquidityGross":"AgGj5Q4iduNd","liquidityNet":"AgGj5Q4iduNd"},{"index":10560,"liquidityGross":"AhF8U6QZMKFd","liquidityNet":"AhF8U6QZMKFd"},{"index":10620,"liquidityGross":"AgWeAHDz8yW3","liquidityNet":"AwWeAHDz8yW3"},{"index":10680,"liquidityGross":"AgN/Gb6UIqRm","liquidityNet":"AgN/Gb6UIqRm"},{"index":10740,"liquidityGross":"AgYltL+co2s5","liquidityNet":"AgYltL+co2s5"},{"index":10800,"liquidityGross":"Agi0Ay5EtIjn","liquidityNet":"Agi0Ay5EtIjn"},{"index":10860,"liquidityGross":"AgkAYSXZX/bA","liquidityNet":"AgkAYSXZX/bA"},{"index":10920,"liquidityGross":"AheRubhMVFxV","liquidityNet":"AheRubhMVFxV"},{"index":10980,"liquidityGross":"AgQ+oNLIIQHl","liquidityNet":"AgQ+oNLIIQHl"},{"index":11100,"liquidityGross":"AgFnjojGoP9D","liquidityNet":"AgFnjojGoP9D"},{"index":11160,"liquidityGross":"AkUuiA9RkjU=","liquidityNet":"AkUuiA9RkjU="},{"index":11220,"liquidityGross":"Aje4BzI93s4=","liquidityNet":"Aje4BzI93s4="},{"index":11280,"liquidityGross":"AgOc+7DJ6dQH","liquidityNet":"AgOc+7DJ6dQH"},{"index":11340,"liquidityGross":"AgWe8eV2hwEp","liquidityNet":"AgWe8eV2hwEp"},{"index":11400,"liquidityGross":"AgUtbCnfLWls","liquidityNet":"AgUtbCnfLWls"},{"index":11520,"liquidityGross":"AgEYBvkclIte","liquidityNet":"AgEYBvkclIte"},{"index":11580,"liquidityGross":"AgMO6VeVKenu","liquidityNet":"AgLxDt+27WEQ"},{"index":11640,"liquidityGross":"AgN+Z4riRQj8","liquidityNet":"AgN+Z4riRQj8"},{"index":11700,"liquidityGross":"AgGuqmr7r1HN","liquidityNet":"AgGuqmr7r1HN"},{"index":11760,"liquidityGross":"AgGAI4OW2JxG","liquidityNet":"AgGAI4OW2JxG"},{"index":11820,"liquidityGross":"AhSBOAp0DuMz","liquidityNet":"AhSBOAp0DuMz"},{"index":11880,"liquidityGross":"AgNB92CDIcIq","liquidityNet":"AgNB92CDIcIq"},{"index":12000,"liquidityGross":"Agmp6Fbh3fC4","liquidityNet":"Agmp6Fbh3fC4"},{"index":12060,"liquidityGross":"AglrOEo19z7N","liquidityNet":"AglrOEo19z7N"},{"index":12120,"liquidityGross":"AgjbQfCqTKqA","liquidityNet":"AgjbQfCqTKqA"},{"index":12240,"liquidityGross":"AgKGu+GxRbza","liquidityNet":"AgKGu+GxRbza"},{"index":12300,"liquidityGross":"Ap5f3Qr19gU=","liquidityNet":"Ap5f3Qr19gU="},{"index":12360,"liquidityGross":"Aha1Ff6fPVuZ","liquidityNet":"Aha1Ff6fPVuZ"},{"index":12420,"liquidityGross":"AgUQoFC0QlGm","liquidityNet":"AgUQoFC0QlGm"},{"index":12480,"liquidityGross":"AgJvKb2B5Oxj","liquidityNet":"AgJvKb2B5Oxj"},{"index":12540,"liquidityGross":"AhYPNseOMhKq","liquidityNet":"AhYPNseOMhKq"},{"index":12600,"liquidityGross":"AiG9zOXn0A5p","liquidityNet":"AiG9zOXn0A5p"},{"index":12660,"liquidityGross":"Agn4Dr4r7EWQ","liquidityNet":"Agn4Dr4r7EWQ"},{"index":12720,"liquidityGross":"AgH9nu3a1YcS","liquidityNet":"AgH9nu3a1YcS"},{"index":12780,"liquidityGross":"AhcxC8LSIUU5","liquidityNet":"AhcxC8LSIUU5"},{"index":12840,"liquidityGross":"AhBxzNzqUdKe","liquidityNet":"AhBxzNzqUdKe"},{"index":12900,"liquidityGross":"AgF67vmdJADN","liquidityNet":"AgF67vmdJADN"},{"index":12960,"liquidityGross":"AgEMV+FXD+txpg==","liquidityNet":"A/V8sbPWXJjO"},{"index":13020,"liquidityGross":"AjhYX7ZTCs5v","liquidityNet":"AzcSPh5uKEjh"},{"index":13080,"liquidityGross":"AgVDeLP8cdA6","liquidityNet":"AgVDeLP8cdA6"},{"index":13140,"liquidityGross":"AgLFFnBHP3s0","liquidityNet":"AgLFFnBHP3s0"},{"index":13200,"liquidityGross":"Ag9BPtvrNrP6","liquidityNet":"Ag9BPtvrNrP6"},{"index":13260,"liquidityGross":"Ahp2iBMmlHZv","liquidityNet":"Ahp2iBMmlHZv"},{"index":13320,"liquidityGross":"AgUooU4H0+4v","liquidityNet":"AgUooU4H0+4v"},{"index":13380,"liquidityGross":"AhCm5m/R3dA9","liquidityNet":"AhCm5m/R3dA9"},{"index":13500,"liquidityGross":"AgKMG84T3sOV","liquidityNet":"AgKMG84T3sOV"},{"index":13560,"liquidityGross":"AgJJVdvzA4+U","liquidityNet":"AgJJVdvzA4+U"},{"index":13620,"liquidityGross":"AgEftpQIO79L","liquidityNet":"AgEftpQIO79L"},{"index":13680,"liquidityGross":"AhZPTymz5buE","liquidityNet":"AhZPTymz5buE"},{"index":13740,"liquidityGross":"AgopZihRVe7M","liquidityNet":"AgWfxydR36W8"},{"index":13860,"liquidityGross":"AnYRnrQFfKtv","liquidityNet":"AnYRnrQFfKtv"},{"index":13920,"liquidityGross":"AhAPuOHr5geF","liquidityNet":"Agyqbl9fCkrR"},{"index":13980,"liquidityGross":"AgyzZmlxxmb5","liquidityNet":"AgyzZmlxxmb5"},{"index":14040,"liquidityGross":"AgNkSSpoM19c","liquidityNet":"AgNkSSpoM19c"},{"index":14100,"liquidityGross":"AgfRhM2fQ0Uz","liquidityNet":"AwfRhM2fQ0Uz"},{"index":14160,"liquidityGross":"AhaFrsLO4gV/","liquidityNet":"Awc3pQwAxLGv"},{"index":14220,"liquidityGross":"AgN8Zn5740vD","liquidityNet":"AgFOg3oFahZd"},{"index":14280,"liquidityGross":"AgPPfAtqthKG","liquidityNet":"AwOHMyMqSD0a"},{"index":14340,"liquidityGross":"AjMinlIenD4r","liquidityNet":"AjMinlIenD4r"},{"index":14400,"liquidityGross":"AgGb8LLfqfPJ","liquidityNet":"AgGb8LLfqfPJ"},{"index":14460,"liquidityGross":"AhR1fkQ8Q7/Q","liquidityNet":"AhR1fkQ8Q7/Q"},{"index":14520,"liquidityGross":"AlE0EP6eOvLZ","liquidityNet":"AlE0EP6eOvLZ"},{"index":14580,"liquidityGross":"Aifjf/u0y/6K","liquidityNet":"AiFxFGs7M7ne"},{"index":14640,"liquidityGross":"AgKWcGat3vs7","liquidityNet":"AgIcDyWDmHyD"},{"index":14700,"liquidityGross":"AgsZ+JIRyID8","liquidityNet":"AweYgkquyXaM"},{"index":14760,"liquidityGross":"AihTJpdCywyJ","liquidityNet":"AiKqwB+EXeJH"},{"index":14820,"liquidityGross":"AiovdLk+21Yr","liquidityNet":"Ag+RzpdhQgk3"},{"index":14880,"liquidityGross":"AheROY8stgE4","liquidityNet":"AheROY8stgE4"},{"index":15000,"liquidityGross":"AgxMaiOdzzSc","liquidityNet":"AwKScrSr1Qq4"},{"index":15060,"liquidityGross":"AhILiCqCahoS","liquidityNet":"Ag2IUkRnVuX2"},{"index":15120,"liquidityGross":"AgthSTeubfvQ","liquidityNet":"Awqx48UQMZt6"},{"index":15180,"liquidityGross":"AiAa6MGLuObZ","liquidityNet":"AyAa6MGLuObZ"},{"index":15240,"liquidityGross":"AhG6YXUSBBlA","liquidityNet":"AhG6YXUSBBlA"},{"index":15300,"liquidityGross":"AgQ7r6EbvmqA","liquidityNet":"AwQ7r6EbvmqA"},{"index":15360,"liquidityGross":"AgVGZ7EC7OHD","liquidityNet":"AwOKX9/F7Wy7"},{"index":15420,"liquidityGross":"AjM2FxPvzgnT","liquidityNet":"Ay75mRX/28qT"},{"index":15480,"liquidityGross":"AicvQUK7+UfU","liquidityNet":"AhbAKULafLmU"},{"index":15540,"liquidityGross":"AgfWxMfbuEor","liquidityNet":"AgGb1i89JdOv"},{"index":15600,"liquidityGross":"AgxJWiIRQSay","liquidityNet":"AwlepuJ/nEHy"},{"index":15660,"liquidityGross":"ArtebWJdgx4=","liquidityNet":"Al9vFxn6k1Y="},{"index":15720,"liquidityGross":"AjTeanq1Oy+i","liquidityNet":"AzTeanq1Oy+i"},{"index":15780,"liquidityGross":"AgKPv5X2FpHO","liquidityNet":"AgKPv5X2FpHO"},{"index":15840,"liquidityGross":"Ag0vpv9wX0dn","liquidityNet":"Aw0neTGzsh7T"},{"index":16020,"liquidityGross":"AgJM4IxLnQEm","liquidityNet":"AgJM4IxLnQEm"},{"index":16080,"liquidityGross":"Ag6tuwD7mo1j","liquidityNet":"Ag6lqqowaAtv"},{"index":16140,"liquidityGross":"AitnH2ph1Mto","liquidityNet":"AxcJSs6RJOIk"},{"index":16200,"liquidityGross":"AgGDnbo4Na6l","liquidityNet":"AgGDnbo4Na6l"},{"index":16260,"liquidityGross":"AgEHV6NGP7zF","liquidityNet":"AgEHV6NGP7zF"},{"index":16380,"liquidityGross":"AgOQI6LGj91S","liquidityNet":"AgOQI6LGj91S"},{"index":16440,"liquidityGross":"AgKGlHPtybMi","liquidityNet":"AnkPE+Ug2fo="},{"index":16500,"liquidityGross":"AgQPvvwHufxK","liquidityNet":"AgQPvvwHufxK"},{"index":16560,"liquidityGross":"AgcF7fAZldHa","liquidityNet":"AgcF7fAZldHa"},{"index":16620,"liquidityGross":"AgT5GyjXS1PA","liquidityNet":"AwMGf8EjNLJm"},{"index":16680,"liquidityGross":"Ah0a/gDI7jgJ","liquidityNet":"Ah0a/gDI7jgJ"},{"index":16740,"liquidityGross":"AizffwOWkpXp","liquidityNet":"AizffwOWkpXp"},{"index":16800,"liquidityGross":"AgaBM1CvK5NM","liquidityNet":"AgaBM1CvK5NM"},{"index":16860,"liquidityGross":"AgVwJyBoF5R4","liquidityNet":"AgVwJyBoF5R4"},{"index":16920,"liquidityGross":"AgO8vV6DOs5l","liquidityNet":"AgO8vV6DOs5l"},{"index":16980,"liquidityGross":"Ahqj/spOZ2fw","liquidityNet":"AxR/dKZKQVC6"},{"index":17040,"liquidityGross":"AjL2ZUoD5M0V","liquidityNet":"AwR3A0Hbc0En"},{"index":17100,"liquidityGross":"AgXCn6IBCKC0","liquidityNet":"AgXCn6IBCKC0"},{"index":17160,"liquidityGross":"AiEFRTfDsz1A","liquidityNet":"AhKTmRErbTw0"},{"index":17220,"liquidityGross":"Ag5v5wNXvCQo","liquidityNet":"AgsYWTeess3S"},{"index":17280,"liquidityGross":"AkQ4854usvMY","liquidityNet":"AkQ4854usvMY"},{"index":17340,"liquidityGross":"AgUYFt+S/tQE","liquidityNet":"AgUYFt+S/tQE"},{"index":17400,"liquidityGross":"AgSFmmDAL3vN","liquidityNet":"AgSFmmDAL3vN"},{"index":17460,"liquidityGross":"Ah5ZOtxxon/e","liquidityNet":"Ah5ZOtxxon/e"},{"index":17520,"liquidityGross":"AggaklrNznt/","liquidityNet":"AgKxsRUoXsPv"},{"index":17580,"liquidityGross":"Ah04lJNgWIaI","liquidityNet":"AgkT3IavGYMy"},{"index":17640,"liquidityGross":"AhDT3y85nO/7","liquidityNet":"AgZ2X18t7r5L"},{"index":17700,"liquidityGross":"AhS8LERFyZ/K","liquidityNet":"AwRdPO9sJjWe"},{"index":17760,"liquidityGross":"AgokRzvOrVt8","liquidityNet":"AgokRzvOrVt8"},{"index":17820,"liquidityGross":"AgxEOPM1paQf","liquidityNet":"AgxEOPM1paQf"},{"index":17880,"liquidityGross":"AkOY4EcJgt8i","liquidityNet":"AkOY4EcJgt8i"},{"index":17940,"liquidityGross":"AlYoyo4v4Jof","liquidityNet":"AlYoyo4v4Jof"},{"index":18000,"liquidityGross":"Ah9KnzxP3ylB","liquidityNet":"AgPryc+eTlf7"},{"index":18060,"liquidityGross":"AgyBcJwwOpTF","liquidityNet":"Agw885VHxLCV"},{"index":18120,"liquidityGross":"AhRPt2l0od0S","liquidityNet":"Agt0PCghszNW"},{"index":18180,"liquidityGross":"AgmARrcwiX+s","liquidityNet":"AgOcoz1BbFwW"},{"index":18240,"liquidityGross":"AgdJ8XrM+UHg","liquidityNet":"AwdJ8XrM+UHg"},{"index":18300,"liquidityGross":"AgKEEGtZLxuJ","liquidityNet":"Ak8imRaRHus="},{"index":18360,"liquidityGross":"AhbVXV749Xsi","liquidityNet":"AhbVXV749Xsi"},{"index":18420,"liquidityGross":"AoIfWEs14ak=","liquidityNet":"AoIfWEs14ak="},{"index":18480,"liquidityGross":"AjBW7sbzcOvh","liquidityNet":"AibBmYxg/vR5"},{"index":18540,"liquidityGross":"AhBXdbU3SDrq","liquidityNet":"Aw3KrruLnYeI"},{"index":18600,"liquidityGross":"ArujdkDl172w","liquidityNet":"Aq0bFGH9QqIM"},{"index":18660,"liquidityGross":"AgT6op2uwzE+","liquidityNet":"AgT6op2uwzE+"},{"index":18720,"liquidityGross":"AgpRO6leHbGS","liquidityNet":"AwhQC1waFr6e"},{"index":18780,"liquidityGross":"AhcLPbNCDZs0","liquidityNet":"Aw+oNasAcWpK"},{"index":18840,"liquidityGross":"AhDD6HLbztY0","liquidityNet":"AhDD6HLbztY0"},{"index":18900,"liquidityGross":"AgpyOHhV5u9R","liquidityNet":"AwSLzSPO98k="},{"index":18960,"liquidityGross":"AjLZ2g5FOdlo","liquidityNet":"AxOr4wAhSP+a"},{"index":19020,"liquidityGross":"AhynTShqJJu5","liquidityNet":"AxPy+hP6aLHL"},{"index":19080,"liquidityGross":"AgG7xhvdQiCg","liquidityNet":"AgG7xhvdQiCg"},{"index":19140,"liquidityGross":"Ag7NK9SkKngA","liquidityNet":"Awd7CvMnVCG+"},{"index":19200,"liquidityGross":"AgSQx4JkiXvg","liquidityNet":"AwSQx4JkiXvg"},{"index":19260,"liquidityGross":"AhOkHnarE+7S","liquidityNet":"AhOkHnarE+7S"},{"index":19320,"liquidityGross":"AhHGKbugAGeH","liquidityNet":"AgcIv0W61hKx"},{"index":19380,"liquidityGross":"AhdLTwvyRPvj","liquidityNet":"AwUKUsOL1SRZ"},{"index":19440,"liquidityGross":"Alj1KOdNwRyn","liquidityNet":"AibujRxOv7Pz"},{"index":19500,"liquidityGross":"Agh/cx0lusFk","liquidityNet":"AwcyOGQ3IXcM"},{"index":19560,"liquidityGross":"AjXq+1PvGeSp","liquidityNet":"AiEN9xBs9y0f"},{"index":19620,"liquidityGross":"AgQtmFiN2e5y","liquidityNet":"AgQtmFiN2e5y"},{"index":19680,"liquidityGross":"Ah6K10hEdvsp","liquidityNet":"Aw6aF/QnZTJh"},{"index":19740,"liquidityGross":"AhkMes6gIYJBDQ==","liquidityNet":"AhkC4uWHNVvrPw=="},{"index":19800,"liquidityGross":"AhXYypaEFvL+","liquidityNet":"AgPrX5jaVCRE"},{"index":19860,"liquidityGross":"AjNB/k/NbOLk","liquidityNet":"AxWZl1nlWUVI"},{"index":19920,"liquidityGross":"AmcnuXqszLAI","liquidityNet":"Aii+tcPJciZC"},{"index":19980,"liquidityGross":"AgoWYVdF+dEY","liquidityNet":"AwKdT+4ji1tS"},{"index":20040,"liquidityGross":"Ak5TB8Eg/ms2","liquidityNet":"AxQwR0WPLz6m"},{"index":20100,"liquidityGross":"Ag++KQnRBhNd","liquidityNet":"A1xxloAMyKU="},{"index":20160,"liquidityGross":"Agp/IAnKb8/S","liquidityNet":"AwSZTfEd1cYC"},{"index":20220,"liquidityGross":"Ag7MCYzIPuap","liquidityNet":"AwZKK58zeuB7"},{"index":20280,"liquidityGross":"AhXuONKTiue+","liquidityNet":"AgWfjnL+qjQU"},{"index":20340,"liquidityGross":"AhLJv34exuF+","liquidityNet":"AxJC2akhLOPW"},{"index":20400,"liquidityGross":"Agm41auU9wlk","liquidityNet":"Aiv7Chq4H5A="},{"index":20460,"liquidityGross":"AgkIrAvPd5n8","liquidityNet":"AgGfzvpvlCdy"},{"index":20520,"liquidityGross":"AjDBDJwSW9tt","liquidityNet":"Ah2e/2vIaIGn"},{"index":20580,"liquidityGross":"AhNCtj7yObPz","liquidityNet":"Agp8G6Ux3CnZ"},{"index":20640,"liquidityGross":"AhKas1j/UMVU","liquidityNet":"A5hYM6YeKZY="},{"index":20700,"liquidityGross":"AhiwNGmJ7MCo","liquidityNet":"AhVOulEOBf0q"},{"index":20760,"liquidityGross":"Ai/LmNf9YW9r","liquidityNet":"AwLyWyxe1BEX"},{"index":20820,"liquidityGross":"Ai6kVYLgDFkv","liquidityNet":"AyeFK7OJ4zmp"},{"index":20880,"liquidityGross":"Ahxr4OdAEgLa","liquidityNet":"AwOHegX7gCe6"},{"index":20940,"liquidityGross":"Ag1sJWNPU7yV","liquidityNet":"Agp0rKWZRyOt"},{"index":21000,"liquidityGross":"Ahzb7IZ79+JX","liquidityNet":"AgdeG/v20Iwv"},{"index":21060,"liquidityGross":"Aj0zHDptI8xM","liquidityNet":"AyA3rwVBW1pg"},{"index":21120,"liquidityGross":"AiFfFikl5+fX","liquidityNet":"AhSNbW3rjFun"},{"index":21180,"liquidityGross":"AgG5Y9ATL3AeKw==","liquidityNet":"AgGZsRr5qJUPcQ=="},{"index":21240,"liquidityGross":"AhHwK1nAfdQn","liquidityNet":"Agjmnx4v0oZd"},{"index":21300,"liquidityGross":"Aht1RPwh4oes","liquidityNet":"A3I5KOi3D7A="},{"index":21360,"liquidityGross":"AhoOtQpYcw+A","liquidityNet":"AhTOwtsg4np4"},{"index":21420,"liquidityGross":"Ahuz+oQrlUdp","liquidityNet":"Awc+Ohxx1ZGF"},{"index":21480,"liquidityGross":"Ah2CoJkcDL1H","liquidityNet":"Ag4hG/5oF20r"},{"index":21540,"liquidityGross":"AgE4fkt0octfsw==","liquidityNet":"AwEdK28zU8q3DQ=="},{"index":21600,"liquidityGross":"AggmT7//cBlE","liquidityNet":"AwH+G4pxryiM"},{"index":21660,"liquidityGross":"AgsyNmdEVUqb","liquidityNet":"AwcpLJsjmVR9"},{"index":21720,"liquidityGross":"AgYhQxxCGBBW","liquidityNet":"AgYhQxxCGBBW"},{"index":21780,"liquidityGross":"AhE2dz2oMVti","liquidityNet":"AwxDH8pN5pPE"},{"index":21840,"liquidityGross":"AgxynM2I0/tO","liquidityNet":"AwtR4vFhjOJE"},{"index":21900,"liquidityGross":"Agt34dm8tdTe","liquidityNet":"Agi4mX0kOL8G"},{"index":21960,"liquidityGross":"Agm6ePFfZuSv","liquidityNet":"Awm6ePFfZuSv"},{"index":22020,"liquidityGross":"AgMGJNMyabtI","liquidityNet":"AwF/usrIG5yk"},{"index":22080,"liquidityGross":"AhlVU4ORwO/z","liquidityNet":"AhhNRTqpRfOh"},{"index":22140,"liquidityGross":"Ahl2Wmbr0YHa","liquidityNet":"AgdU1dwIz7QI"},{"index":22200,"liquidityGross":"Ah8ekEKHmvXG","liquidityNet":"AhJB8rqFkIJu"},{"index":22260,"liquidityGross":"Ag4C5LLnFcNp","liquidityNet":"AwbVh4PC15Kd"},{"index":22320,"liquidityGross":"AgnYMzesetTX","liquidityNet":"AwnYMzesetTX"},{"index":22380,"liquidityGross":"AhKB6sUpz0Cp","liquidityNet":"Aw84s8lsBrZr"},{"index":22500,"liquidityGross":"AnFEG4UJhlo=","liquidityNet":"AnFEG4UJhlo="},{"index":22560,"liquidityGross":"AhIDo/aGEvqC","liquidityNet":"AhIDo/aGEvqC"},{"index":22620,"liquidityGross":"AhtBw1jKY7hz","liquidityNet":"AhtBw1jKY7hz"},{"index":22680,"liquidityGross":"Aokne/E4Euw=","liquidityNet":"Aokne/E4Euw="},{"index":22740,"liquidityGross":"AgNHgzcsKtmMeg==","liquidityNet":"AgNHgzcsKtmMeg=="},{"index":22800,"liquidityGross":"AgERq78T4LsM","liquidityNet":"Avt80CPHd94="},{"index":22860,"liquidityGross":"AgEc3KRFD7gC","liquidityNet":"AgEc3KRFD7gC"},{"index":22920,"liquidityGross":"AgJs6FNlyYEr","liquidityNet":"AgJs6FNlyYEr"},{"index":22980,"liquidityGross":"AgP4TIik98uZ","liquidityNet":"AgI3tCPG+Xap"},{"index":23040,"liquidityGross":"Ar0Be8F01D7R","liquidityNet":"A6wTgCDTOcyR"},{"index":23100,"liquidityGross":"AhsoFU/J2VvX8A==","liquidityNet":"AhsdAqOGwF4gBA=="},{"index":23160,"liquidityGross":"AkG8uIHhBys1","liquidityNet":"AjOjLYI2mIb1"},{"index":23220,"liquidityGross":"AgGHoDE+wa0p","liquidityNet":"AwEABeHXo+3T"},{"index":23280,"liquidityGross":"AgVZC97eLls=","liquidityNet":"AgVZC97eLls="},{"index":23340,"liquidityGross":"AjPW4MB858ds","liquidityNet":"AinqJN3paNIg"},{"index":23400,"liquidityGross":"Ahnaz6An6hI3","liquidityNet":"Awz9Co5DDgkp"},{"index":23460,"liquidityGross":"Ajyylt5ZtgOj","liquidityNet":"AhIBKBPGUw/Z"},{"index":23520,"liquidityGross":"ApcVNdZe9vuq","liquidityNet":"AojJJq6ZBrMO"},{"index":23580,"liquidityGross":"AgS3Gl0dQ1H3","liquidityNet":"AwOJKP1f3TXx"},{"index":23640,"liquidityGross":"AgjhtyvPgFmZ","liquidityNet":"AgjhtyvPgFmZ"},{"index":23700,"liquidityGross":"AgWrb6E7fgBy","liquidityNet":"AwWrb6E7fgBy"},{"index":23760,"liquidityGross":"AgFRv1WAgC95","liquidityNet":"A8dVDRg/kLs="},{"index":23820,"liquidityGross":"ArZqrnwrd5Q=","liquidityNet":"A2UaaU6Snm4="},{"index":23880,"liquidityGross":"AhnpaoaBKlo+","liquidityNet":"AwQEo8EuwPom"},{"index":23940,"liquidityGross":"AgQigVg1o3vy","liquidityNet":"AwQigVg1o3vy"},{"index":24060,"liquidityGross":"AgxuH1lhpbwQ","liquidityNet":"AwtTayMKZrv8"},{"index":24120,"liquidityGross":"Ageyi7BHEAUD","liquidityNet":"Ajc2XkmjK1s="},{"index":24180,"liquidityGross":"AiXlPwERoSDL","liquidityNet":"AiWOB20BcBYn"},{"index":24240,"liquidityGross":"AgKEH3A19svl","liquidityNet":"AudagCaHSbM="},{"index":24300,"liquidityGross":"AgLoolCJDgdz","liquidityNet":"AgLoolCJDgdz"},{"index":24360,"liquidityGross":"AgYR4fzBQh8p","liquidityNet":"AgYR4fzBQh8p"},{"index":24420,"liquidityGross":"AgymKHZ9Rudu","liquidityNet":"Awnmr7J9TqHk"},{"index":24480,"liquidityGross":"AgNHUTkKabJN","liquidityNet":"AwNHUTkKabJN"},{"index":24540,"liquidityGross":"Agd3AmASrgrI","liquidityNet":"Awd3AmASrgrI"},{"index":24600,"liquidityGross":"Ag5vmgmRp5hJ","liquidityNet":"Aw33DhpeCIwr"},{"index":24660,"liquidityGross":"AgQNIC8LIWJRHQ==","liquidityNet":"AgPhGSTHBSKLyQ=="},{"index":24720,"liquidityGross":"Ag7cFkpVkPkn","liquidityNet":"Ag7cFkpVkPkn"},{"index":24780,"liquidityGross":"AgYKj+tzCv9Y","liquidityNet":"AwXE3lGxZD7i"},{"index":24840,"liquidityGross":"AgJMihq46Fc5","liquidityNet":"AwJMihq46Fc5"},{"index":24900,"liquidityGross":"AgH4WVHCbW9E","liquidityNet":"AwFoyKvIzOUi"},{"index":24960,"liquidityGross":"AgFrs3heNnAW","liquidityNet":"AwFrs3heNnAW"},{"index":25020,"liquidityGross":"AgbfEP0AFnwM","liquidityNet":"AwbfEP0AFnwM"},{"index":25080,"liquidityGross":"Ag0oL46uizg0","liquidityNet":"Awt8ZoToV+/U"},{"index":25140,"liquidityGross":"AhX8LwNNh/GR","liquidityNet":"AhX8LwNNh/GR"},{"index":25200,"liquidityGross":"AhdiX4u6iZ7V","liquidityNet":"AhdiX4u6iZ7V"},{"index":25260,"liquidityGross":"AgGFgaaOGGIV","liquidityNet":"AgGFgaaOGGIV"},{"index":25320,"liquidityGross":"AgIJbW77GB6t","liquidityNet":"AgIJbW77GB6t"},{"index":25380,"liquidityGross":"AgtBHn478foc","liquidityNet":"AgXMrJSfwqQc"},{"index":25440,"liquidityGross":"Ag1x/ng7jin0","liquidityNet":"AzGjm5cnaXA="},{"index":25500,"liquidityGross":"AgVP1c5x9rJr","liquidityNet":"AwGs+UdSk1+N"},{"index":25560,"liquidityGross":"Ai+NfX6jN540","liquidityNet":"Ah9bh/MkmflI"},{"index":25620,"liquidityGross":"Ag9rTFaNjXKp","liquidityNet":"AggVJ9XHkCJ7"},{"index":25680,"liquidityGross":"AgJMMzgt3208Gw==","liquidityNet":"AgJCpdUz8flHxw=="},{"index":25800,"liquidityGross":"AgkonepAlyDW","liquidityNet":"AwkNRuoFpXwQ"},{"index":25860,"liquidityGross":"AhYxKHwtJCon","liquidityNet":"AhVm82th7wXl"},{"index":25920,"liquidityGross":"AgbDhPn5u4tO","liquidityNet":"AgbDhPn5u4tO"},{"index":25980,"liquidityGross":"Ag04JBz5VHZ8","liquidityNet":"AwR+X8RbRN6E"},{"index":26040,"liquidityGross":"AgrVOZmffxDB","liquidityNet":"AwGgTSMUuciv"},{"index":26100,"liquidityGross":"AgUbDGwOWC7E","liquidityNet":"AgUbDGwOWC7E"},{"index":26160,"liquidityGross":"AgE4+WUAIX9j","liquidityNet":"AwPGVRXKbKc="},{"index":26220,"liquidityGross":"AhJIlL++ByQW","liquidityNet":"A2dYM3EJnDI="},{"index":26280,"liquidityGross":"Ahxu7M7QDfpR","liquidityNet":"Axxu7M7QDfpR"},{"index":26340,"liquidityGross":"Ahb0X2eQFhk0","liquidityNet":"AwJGEpZFHt+4"},{"index":26400,"liquidityGross":"AgqS5cMyenIV","liquidityNet":"AgqS5cMyenIV"},{"index":26460,"liquidityGross":"Ag0JkcttZDa+0w==","liquidityNet":"Agz5U3c8B08HxQ=="},{"index":26520,"liquidityGross":"AgIljf6IvJW7","liquidityNet":"AgEdCcF9rkBr"},{"index":26580,"liquidityGross":"AgERV85P6lq2","liquidityNet":"AqgQspOPdng="},{"index":26640,"liquidityGross":"AgFKVKFnT4F4","liquidityNet":"AwFKVKFnT4F4"},{"index":26700,"liquidityGross":"AgX30PnIOd5R","liquidityNet":"A8VTDQ7FpUU="},{"index":26760,"liquidityGross":"Agp5KGV9D4M=","liquidityNet":"Awp5KGV9D4M="},{"index":26820,"liquidityGross":"AgRULCQFeHr8","liquidityNet":"AwRULCQFeHr8"},{"index":26940,"liquidityGross":"AgKjdkSSvq9s","liquidityNet":"AgKjdkSSvq9s"},{"index":27000,"liquidityGross":"AhPYHg8Vh4j2","liquidityNet":"AhPYHg8Vh4j2"},{"index":27060,"liquidityGross":"AgiXk7IuNEgV","liquidityNet":"AwiXk7IuNEgV"},{"index":27120,"liquidityGross":"AgdVEjBRtWKG","liquidityNet":"AwdVEjBRtWKG"},{"index":27180,"liquidityGross":"AgKdTLD41Qcc","liquidityNet":"AwKdTLD41Qcc"},{"index":27420,"liquidityGross":"AgEKAOsiarc/","liquidityNet":"AgEKAOsiarc/"},{"index":27480,"liquidityGross":"Al6afwp8kKGq","liquidityNet":"Al6afwp8kKGq"},{"index":27600,"liquidityGross":"AhHoB8D4SGk=","liquidityNet":"AxHoB8D4SGk="},{"index":27720,"liquidityGross":"Al62kdQRiOFs","liquidityNet":"AybwDkSIwA94"},{"index":27780,"liquidityGross":"Aiu91JuH/7EY","liquidityNet":"Ayu91JuH/7EY"},{"index":27840,"liquidityGross":"AgWdFTAvjnkR","liquidityNet":"AwWdFTAvjnkR"},{"index":27900,"liquidityGross":"AgYhQxxCGBBW","liquidityNet":"AwYhQxxCGBBW"},{"index":28020,"liquidityGross":"AgrupduE7njD","liquidityNet":"AwrupduE7njD"},{"index":28140,"liquidityGross":"AgiqvhcFf5Px","liquidityNet":"AwiqvhcFf5Px"},{"index":28200,"liquidityGross":"AizVjF0Har8c","liquidityNet":"AyzVjF0Har8c"},{"index":28260,"liquidityGross":"AgGrqy/Iavph","liquidityNet":"AwGrqy/Iavph"},{"index":28320,"liquidityGross":"AjFSMlpRmqoj","liquidityNet":"AzFSMlpRmqoj"},{"index":28380,"liquidityGross":"Am9Z9EspI0Hh","liquidityNet":"A29Z9EspI0Hh"},{"index":28440,"liquidityGross":"AgM4xuFJiezP","liquidityNet":"AwM4xuFJiezP"},{"index":28680,"liquidityGross":"AiV0aq/eO6D9","liquidityNet":"AyV0aq/eO6D9"},{"index":28740,"liquidityGross":"AgOlKLuJg8NS","liquidityNet":"AwOlKLuJg8NS"},{"index":28800,"liquidityGross":"AgEKAOsiarc/","liquidityNet":"AwEKAOsiarc/"},{"index":28860,"liquidityGross":"AgIe0fpfy3WR","liquidityNet":"AwIe0fpfy3WR"},{"index":28920,"liquidityGross":"Agz/3ZHvVZSY1Q==","liquidityNet":"Awz/3ZHvVZSY1Q=="},{"index":29040,"liquidityGross":"Ag0t3f+emxIM","liquidityNet":"Agoi1Flh6DVY"},{"index":29100,"liquidityGross":"AgJr+9nKgdMl","liquidityNet":"AwJr+9nKgdMl"},{"index":29160,"liquidityGross":"AgeBHfc7upno","liquidityNet":"AweBHfc7upno"},{"index":29220,"liquidityGross":"AgH2x3wd1zzp","liquidityNet":"AwH2x3wd1zzp"},{"index":29280,"liquidityGross":"AgTiohs531jl","liquidityNet":"AwTiohs531jl"},{"index":29340,"liquidityGross":"AgO8ohod6YZ3","liquidityNet":"AwFke0gYHrMJ"},{"index":29400,"liquidityGross":"AgR2FTDzJsMY","liquidityNet":"AwR2FTDzJsMY"},{"index":29460,"liquidityGross":"AgTIejfzQyYO","liquidityNet":"AwTIejfzQyYO"},{"index":29580,"liquidityGross":"AmzCYRfatEoT","liquidityNet":"AiR1sUmWqyzz"},{"index":29640,"liquidityGross":"Al/baV1RiSsv","liquidityNet":"A1/baV1RiSsv"},{"index":29700,"liquidityGross":"AjiGNssP9C4=","liquidityNet":"AziGNssP9C4="},{"index":29760,"liquidityGross":"AgQW5t5WlEo=","liquidityNet":"AwQW5t5WlEo="},{"index":29880,"liquidityGross":"Aoft88AVD4o=","liquidityNet":"A4ft88AVD4o="},{"index":29940,"liquidityGross":"AgNPoXSEQEAoJw==","liquidityNet":"AwNPoXNfvF/ERQ=="},{"index":30000,"liquidityGross":"AgGHU5XQWHXX","liquidityNet":"AwGHUlL7fLjp"},{"index":30060,"liquidityGross":"AgJMeHAy2WfQ","liquidityNet":"AwJMdwfsygYI"},{"index":30120,"liquidityGross":"AgKF+xoMuFbs","liquidityNet":"AwKF+YJXoHPQ"},{"index":30180,"liquidityGross":"AurbL4t6","liquidityNet":"AurbL4t6"},{"index":30240,"liquidityGross":"AgQiA3efwmT+","liquidityNet":"AwQiAU1KC6P0"},{"index":30300,"liquidityGross":"Am77f4feATsI","liquidityNet":"A277fON+3gWq"},{"index":30360,"liquidityGross":"AgJI7dke7yi2nA==","liquidityNet":"AwJI7dUrVwR7pg=="},{"index":30420,"liquidityGross":"Agj3SU4adv4X","liquidityNet":"Awj3Q2MbfjAB"},{"index":30480,"liquidityGross":"AgLNmQTLxmpP","liquidityNet":"AwLNjTOatiuB"},{"index":30540,"liquidityGross":"Ah+gqywoZUsJ","liquidityNet":"Ax+gqywoZUsJ"},{"index":30600,"liquidityGross":"Ai0dmNSWkt1j","liquidityNet":"Ay0dmNSWkt1j"},{"index":30660,"liquidityGross":"AgdiejSuDVp8","liquidityNet":"AwdiejSuDVp8"},{"index":30720,"liquidityGross":"AgRhz2DRjOd/","liquidityNet":"AwRhz2DRjOd/"},{"index":30780,"liquidityGross":"AgQfDak8zVrfSw==","liquidityNet":"AwQfDak8zVrfSw=="},{"index":30840,"liquidityGross":"AgQp8XVBY0ki","liquidityNet":"AwQp8XVBY0ki"},{"index":30900,"liquidityGross":"AhhbgtTn/Fck","liquidityNet":"AxhbgtTn/Fck"},{"index":30960,"liquidityGross":"AgazcCbWmB2h","liquidityNet":"AwazcCbWmB2h"},{"index":31020,"liquidityGross":"Ag7omxYvAZSm","liquidityNet":"Aw7omxYvAZSm"},{"index":31080,"liquidityGross":"AglW84Vgpqgo","liquidityNet":"AwlW84Vgpqgo"},{"index":31140,"liquidityGross":"Ahw44TfU/vOq","liquidityNet":"Axw44TfU/vOq"},{"index":31200,"liquidityGross":"Agu878MVYRzt","liquidityNet":"Awu878MVYRzt"},{"index":31260,"liquidityGross":"AhPfoxHsTLly","liquidityNet":"AxPfoxHsTLly"},{"index":31320,"liquidityGross":"AhwECbO26mbF","liquidityNet":"AxwECbO26mbF"},{"index":31380,"liquidityGross":"AiPQ49xIz8Pv","liquidityNet":"AyPQ49xIz8Pv"},{"index":31440,"liquidityGross":"AhGqy3ASETwb","liquidityNet":"AxGqy3ASETwb"},{"index":31500,"liquidityGross":"Agn5TBJ8w1Pr","liquidityNet":"Awn5TBJ8w1Pr"},{"index":31560,"liquidityGross":"AgLDw5WIbnD1","liquidityNet":"AwLDw5WIbnD1"},{"index":31620,"liquidityGross":"Ag7OHWpfUmlv","liquidityNet":"Aw7OHWpfUmlv"},{"index":31680,"liquidityGross":"AgsXc1/iqBVI","liquidityNet":"AwsXc1/iqBVI"},{"index":31740,"liquidityGross":"AiMTttvR4eQw","liquidityNet":"AyMTttvR4eQw"},{"index":31800,"liquidityGross":"AlIuZpRiwFdC","liquidityNet":"A1IuZpRiwFdC"},{"index":31860,"liquidityGross":"AgqjUGfaD1f4","liquidityNet":"AwqjUGfaD1f4"},{"index":31920,"liquidityGross":"AgxfMhi7/6Kt","liquidityNet":"AwxfMhi7/6Kt"},{"index":31980,"liquidityGross":"Ah99bt60tbnS","liquidityNet":"Ax99bt60tbnS"},{"index":32040,"liquidityGross":"AjEgZiGXGvc1","liquidityNet":"AzEgZiGXGvc1"},{"index":32100,"liquidityGross":"AghU3AYfQGWt","liquidityNet":"AwhU3AYfQGWt"},{"index":32160,"liquidityGross":"AgRc4ixPB8v8","liquidityNet":"AwRc4ixPB8v8"},{"index":32220,"liquidityGross":"AgZS2GnStR7v","liquidityNet":"AwZS2GnStR7v"},{"index":32280,"liquidityGross":"AoIfWEs14ak=","liquidityNet":"A4IfWEs14ak="},{"index":32340,"liquidityGross":"AhL/Zl9uCfFD","liquidityNet":"AxL/Zl9uCfFD"},{"index":32400,"liquidityGross":"AgErvm4l17FW","liquidityNet":"AwErvm4l17FW"},{"index":32460,"liquidityGross":"AhMAUcvLpkFV","liquidityNet":"AxMAUcvLpkFV"},{"index":32520,"liquidityGross":"AgxNx3golC3s","liquidityNet":"AwxNx3golC3s"},{"index":32580,"liquidityGross":"AgsbKTPma7/H","liquidityNet":"AwsbKTPma7/H"},{"index":32640,"liquidityGross":"AgqEoFL57UWf","liquidityNet":"AwqEoFL57UWf"},{"index":32700,"liquidityGross":"AgT76+qhiL6x","liquidityNet":"AwT76+qhiL6x"},{"index":32760,"liquidityGross":"Agr1WDwPIIC/","liquidityNet":"Awr1WDwPIIC/"},{"index":32820,"liquidityGross":"AhkDtc0g7Oyk0A==","liquidityNet":"AxkDtc0g7Oyk0A=="},{"index":32880,"liquidityGross":"AgSDY356hUgB","liquidityNet":"AwSDY356hUgB"},{"index":32940,"liquidityGross":"AgkIIX9PKCEN","liquidityNet":"AwkIIX9PKCEN"},{"index":33000,"liquidityGross":"AgGSYMUCv5w2mA==","liquidityNet":"AwGSYMUCv5w2mA=="},{"index":33060,"liquidityGross":"AhjeW/AZca5S","liquidityNet":"AxjeW/AZca5S"},{"index":33120,"liquidityGross":"AhazzyJR0Leu","liquidityNet":"AxazzyJR0Leu"},{"index":33180,"liquidityGross":"Ag0+8kxU40c=","liquidityNet":"Aw0+8kxU40c="},{"index":33240,"liquidityGross":"AhMpdDKgo0Y=","liquidityNet":"AxMpdDKgo0Y="},{"index":33300,"liquidityGross":"Avcs9EsvuYI=","liquidityNet":"A/cs9EsvuYI="},{"index":33360,"liquidityGross":"AqsJQrE4h0k=","liquidityNet":"A6sJQrE4h0k="},{"index":33420,"liquidityGross":"Aih0cVc+1UE3","liquidityNet":"Ayh0cVc+1UE3"},{"index":33480,"liquidityGross":"AnAUgpCfCFI=","liquidityNet":"A3AUgpCfCFI="},{"index":33540,"liquidityGross":"AgfAVotBADib","liquidityNet":"AwfAVotBADib"},{"index":33600,"liquidityGross":"AhzU/T+D3aLy","liquidityNet":"AxzU/T+D3aLy"},{"index":33660,"liquidityGross":"AgvILrbx0F8c","liquidityNet":"AwvILrbx0F8c"},{"index":33720,"liquidityGross":"AhdDVinviMnl","liquidityNet":"AxdDVinviMnl"},{"index":33780,"liquidityGross":"AhXGt5o8LTif","liquidityNet":"AxXGt5o8LTif"},{"index":33840,"liquidityGross":"AgRr/E0opx0u","liquidityNet":"AwRr/E0opx0u"},{"index":33900,"liquidityGross":"AgNACxm1TaXW","liquidityNet":"AwNACxm1TaXW"},{"index":33960,"liquidityGross":"AhsZBJ7TQsyTdQ==","liquidityNet":"AxsZBJ7TQsyTdQ=="},{"index":34020,"liquidityGross":"ArRo/y+SjaQ=","liquidityNet":"A7Ro/y+SjaQ="},{"index":34080,"liquidityGross":"AkTxBViUYcj9","liquidityNet":"A0TxBViUYcj9"},{"index":34140,"liquidityGross":"Ag3G46LJGo3p","liquidityNet":"Aw3G46LJGo3p"},{"index":34200,"liquidityGross":"AgTilk6rTzE=","liquidityNet":"AwTilk6rTzE="},{"index":34260,"liquidityGross":"AgPhhYVn6KHb","liquidityNet":"AwPhhYVn6KHb"},{"index":34320,"liquidityGross":"AgZsw70baBAE","liquidityNet":"AwZsw70baBAE"},{"index":34380,"liquidityGross":"ArfyvvPDl0A=","liquidityNet":"A7fyvvPDl0A="},{"index":34440,"liquidityGross":"Ag7faPISCu7m","liquidityNet":"Aw7faPISCu7m"},{"index":34500,"liquidityGross":"Ag1pc8ixJaj8","liquidityNet":"Aw1pc8ixJaj8"},{"index":34560,"liquidityGross":"AgRzqQ3GKCxq","liquidityNet":"AwRzqQ3GKCxq"},{"index":34620,"liquidityGross":"AiYsWCiXJ/cW","liquidityNet":"AyYsWCiXJ/cW"},{"index":34680,"liquidityGross":"AgJ8E5RUz7q2","liquidityNet":"AwJ8E5RUz7q2"},{"index":34740,"liquidityGross":"Aio/yMhXMf3B","liquidityNet":"Ayo/yMhXMf3B"},{"index":34800,"liquidityGross":"AghZUnOheVTu","liquidityNet":"AwhZUnOheVTu"},{"index":34860,"liquidityGross":"AgsOC66eEu2w","liquidityNet":"AwsOC66eEu2w"},{"index":34920,"liquidityGross":"AgUQalsIBaN9","liquidityNet":"AwUQalsIBaN9"},{"index":34980,"liquidityGross":"AhDjIkwYUm/L","liquidityNet":"AxDjIkwYUm/L"},{"index":35040,"liquidityGross":"AhwanHYKMv+f","liquidityNet":"AxwanHYKMv+f"},{"index":35100,"liquidityGross":"Ag1uI+mYcruH","liquidityNet":"Aw1uI+mYcruH"},{"index":35160,"liquidityGross":"Ahfgzn9iZtE2","liquidityNet":"Axfgzn9iZtE2"},{"index":35220,"liquidityGross":"Ahwq4CftHjVj","liquidityNet":"Axwq4CftHjVj"},{"index":35280,"liquidityGross":"Agq22Mgs0l6U","liquidityNet":"Awq22Mgs0l6U"},{"index":35340,"liquidityGross":"AhPFjfrBGZy/","liquidityNet":"AxPFjfrBGZy/"},{"index":35400,"liquidityGross":"AgyNND7fvDgG","liquidityNet":"AwyNND7fvDgG"},{"index":35460,"liquidityGross":"AgLFPaSLTk0B","liquidityNet":"AwLFPaSLTk0B"},{"index":35520,"liquidityGross":"Ahkg8aFZb1A=","liquidityNet":"Axkg8aFZb1A="},{"index":35640,"liquidityGross":"AgNGct5PqTOX","liquidityNet":"AwNGct5PqTOX"},{"index":35700,"liquidityGross":"AgEp7WJgYqiT","liquidityNet":"AwEp7WJgYqiT"},{"index":35760,"liquidityGross":"AgoYPatwd0ny","liquidityNet":"AwoYPatwd0ny"},{"index":36000,"liquidityGross":"AhAwEAlHBOvb","liquidityNet":"AxAwEAlHBOvb"},{"index":36060,"liquidityGross":"AhSkw9Fp03gx","liquidityNet":"AxSkw9Fp03gx"},{"index":36120,"liquidityGross":"AgwyrNJPQQGp","liquidityNet":"AwwyrNJPQQGp"},{"index":36240,"liquidityGross":"AgGkm33e5EUf","liquidityNet":"AwGkm33e5EUf"},{"index":36420,"liquidityGross":"Ag5mqNq4FEqE","liquidityNet":"Aw5mqNq4FEqE"},{"index":36660,"liquidityGross":"AhDZtJ78q30=","liquidityNet":"AxDZtJ78q30="},{"index":36720,"liquidityGross":"ArahsJfVSAU=","liquidityNet":"A7ahsJfVSAU="},{"index":36780,"liquidityGross":"Agl2zDN4UGUP","liquidityNet":"Awl2zDN4UGUP"},{"index":36900,"liquidityGross":"AgEelkYzKRdKvA==","liquidityNet":"AwEelkYzKRdKvA=="},{"index":36960,"liquidityGross":"AgbaVmGmT1Iw","liquidityNet":"AwbaVmGmT1Iw"},{"index":37020,"liquidityGross":"AkmwVouh4DKb","liquidityNet":"A0mwVouh4DKb"},{"index":37080,"liquidityGross":"AkPNJ7OO36s=","liquidityNet":"A0PNJ7OO36s="},{"index":37140,"liquidityGross":"AgVZC97eLls=","liquidityNet":"AwVZC97eLls="},{"index":37200,"liquidityGross":"Agq6KugRI742","liquidityNet":"Awq6KugRI742"},{"index":37320,"liquidityGross":"AhEj66vTnWwa","liquidityNet":"AxEj66vTnWwa"},{"index":37380,"liquidityGross":"Ao2vfnwABggp","liquidityNet":"A42vfnwABggp"},{"index":37440,"liquidityGross":"AgI+rxk708z1","liquidityNet":"AwI+rxk708z1"},{"index":37620,"liquidityGross":"AkU1JDQgT18=","liquidityNet":"A0U1JDQgT18="},{"index":46080,"liquidityGross":"Aisaz7nSgAPb","liquidityNet":"Aysaz7nSgAPb"},{"index":49380,"liquidityGross":"ApBc7hOjjIU=","liquidityNet":"A5Bc7hOjjIU="},{"index":57060,"liquidityGross":"AgEds2nEyfL+","liquidityNet":"AwEds2nEyfL+"},{"index":887220,"liquidityGross":"AgoLXMDPdLJCBw==","liquidityNet":"AwoLXMDPdLJCBw=="}]}` + +var ( + bExtra, _ = json.Marshal(poolExtra) + bExtraGob, _ = json.Marshal(poolExtraGob) + poolRedis = fmt.Sprintf(poolRedisTmpl, string(bExtra[1:len(bExtra)-1])) + poolRedisGob = fmt.Sprintf(poolRedisTmpl, string(bExtraGob[1:len(bExtraGob)-1])) +) + +func BenchmarkNewPoolSimulator(b *testing.B) { + var poolEnt entity.Pool + err := json.Unmarshal([]byte(poolRedis), &poolEnt) + require.Nil(b, err) + + for i := 0; i < b.N; i++ { + _, err := NewPoolSimulator(poolEnt, valueobject.ChainIDEthereum) + require.Nil(b, err) + } +} + +func BenchmarkNewPoolSimulatorV2(b *testing.B) { + var poolEnt entity.Pool + err := json.Unmarshal([]byte(poolRedisGob), &poolEnt) + require.Nil(b, err) + + for i := 0; i < b.N; i++ { + _, err := NewPoolSimulatorV2(poolEnt, valueobject.ChainIDEthereum) + require.Nil(b, err) + } +} + +func BenchmarkNewPoolSimulatorV2ReuseBestcase(b *testing.B) { + var poolEnt entity.Pool + err := json.Unmarshal([]byte(poolRedisGob), &poolEnt) + require.Nil(b, err) + + sim, err := NewPoolSimulatorV2(poolEnt, valueobject.ChainIDEthereum) + require.Nil(b, err) + + for i := 0; i < b.N; i++ { + err := InitPoolSimulatorV2(poolEnt, sim, valueobject.ChainIDEthereum) + require.Nil(b, err) + } +} + +func TestComparePoolSimulatorV2(t *testing.T) { + var poolEnt entity.Pool + err := json.Unmarshal([]byte(poolRedis), &poolEnt) + require.Nil(t, err) + + sim, err := NewPoolSimulator(poolEnt, valueobject.ChainIDEthereum) + require.Nil(t, err) + + err = json.Unmarshal([]byte(poolRedisGob), &poolEnt) + require.Nil(t, err) + + simv2, err := NewPoolSimulatorV2(poolEnt, valueobject.ChainIDEthereum) + require.Nil(t, err) + + testCases := []struct { + tokenIn string + tokenOut string + amountIn string + }{ + {"0xf1b99e3e573a1a9c5e6b2ce818b617f0e664e86b", "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "10000000000000000000000"}, + {"0xf1b99e3e573a1a9c5e6b2ce818b617f0e664e86b", "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "50000000000000010000000"}, + {"0xf1b99e3e573a1a9c5e6b2ce818b617f0e664e86b", "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "500100"}, + {"0xf1b99e3e573a1a9c5e6b2ce818b617f0e664e86b", "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "500000000"}, + {"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0xf1b99e3e573a1a9c5e6b2ce818b617f0e664e86b", "50000000009200000000"}, + {"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0xf1b99e3e573a1a9c5e6b2ce818b617f0e664e86b", "9000000230000000000"}, + {"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0xf1b99e3e573a1a9c5e6b2ce818b617f0e664e86b", "900000845000"}, + {"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0xf1b99e3e573a1a9c5e6b2ce818b617f0e664e86b", "9000000127"}, + } + + for i, tc := range testCases { + t.Run(fmt.Sprintf("test %d", i), func(t *testing.T) { + in := pool.TokenAmount{ + Token: tc.tokenIn, + Amount: bignumber.NewBig10(tc.amountIn), + } + + // v1 and v2 sim should yield same output + + result, err := sim.CalcAmountOut(pool.CalcAmountOutParams{ + TokenAmountIn: in, + TokenOut: tc.tokenOut, + Limit: nil, + }) + require.Nil(t, err) + + resultv2, err := simv2.CalcAmountOut(pool.CalcAmountOutParams{ + TokenAmountIn: in, + TokenOut: tc.tokenOut, + Limit: nil, + }) + require.Nil(t, err) + + require.Equal(t, result.TokenAmountOut.Amount, resultv2.TokenAmountOut.Amount) + }) + } +} + +func TestTickGob(t *testing.T) { + x := v3Entities.Tick{Index: 10, LiquidityGross: big.NewInt(324), LiquidityNet: big.NewInt(-8234)} + y := TickGob{Index: 10, LiquidityGross: (*bignumber.GobBigInt)(big.NewInt(324)), LiquidityNet: (*bignumber.GobBigInt)(big.NewInt(-8234))} + assert.Equal(t, x, *(*v3Entities.Tick)(unsafe.Pointer(&y))) + + xs := v3TickList{x} + ys := []TickGob{y} + assert.Equal(t, xs, *(*v3TickList)(unsafe.Pointer(&ys))) + + xsEmpty := v3TickList{} + ysEmpty := []TickGob{} + assert.Equal(t, xsEmpty, *(*v3TickList)(unsafe.Pointer(&ysEmpty))) +} diff --git a/pkg/source/uniswapv3/pool_tracker.go b/pkg/source/uniswapv3/pool_tracker.go index 9ef093429..fb361d724 100644 --- a/pkg/source/uniswapv3/pool_tracker.go +++ b/pkg/source/uniswapv3/pool_tracker.go @@ -153,6 +153,11 @@ func (d *PoolTracker) GetNewPoolState( continue } + // LiquidityGross = 0 means that the tick is uninitialized + if tick.LiquidityGross.Cmp(zeroBI) == 0 { + continue + } + ticks = append(ticks, tick) } diff --git a/pkg/source/uniswapv3/type.go b/pkg/source/uniswapv3/type.go index 1195a87cd..98f0f6846 100644 --- a/pkg/source/uniswapv3/type.go +++ b/pkg/source/uniswapv3/type.go @@ -4,6 +4,8 @@ import ( "fmt" "math/big" "strconv" + + "github.com/KyberNetwork/kyberswap-dex-lib/pkg/util/bignumber" ) type Gas struct { @@ -59,6 +61,12 @@ type Tick struct { LiquidityNet *big.Int `json:"liquidityNet"` } +type TickGob struct { + Index int `json:"index"` + LiquidityGross *bignumber.GobBigInt `json:"liquidityGross"` + LiquidityNet *bignumber.GobBigInt `json:"liquidityNet"` +} + type Extra struct { Liquidity *big.Int `json:"liquidity"` SqrtPriceX96 *big.Int `json:"sqrtPriceX96"` diff --git a/pkg/util/bignumber/gob_bigint.go b/pkg/util/bignumber/gob_bigint.go new file mode 100644 index 000000000..ceccce8ed --- /dev/null +++ b/pkg/util/bignumber/gob_bigint.go @@ -0,0 +1,51 @@ +package bignumber + +import ( + "encoding/base64" + "math/big" +) + +// GobBigInt is a wrapper around big.Int that use Gob for json marshal/unmarshal +type GobBigInt big.Int + +// almost all of our bigInt are for (u)int256, so should be only 33 bytes (32 for abs and 1 for version & sign) +const MaxBigIntGobLength = 64 + +func (f *GobBigInt) ToBig() *big.Int { + return (*big.Int)(f) +} + +func (f *GobBigInt) MarshalText() ([]byte, error) { + bi := f.ToBig() + b, err := bi.GobEncode() + if err != nil { + return nil, err + } + return []byte(base64.StdEncoding.EncodeToString(b)), nil +} + +func (f *GobBigInt) UnmarshalText(input []byte) error { + bi := f.ToBig() + enc := base64.StdEncoding + b64Len := len(input) + bLen := enc.DecodedLen(b64Len) + + // if it's small enough then allocate temp store on stack to avoid GC + if bLen < MaxBigIntGobLength { + var b [MaxBigIntGobLength]byte + n, err := base64.StdEncoding.Decode(b[:], input) + if err != nil { + return err + } + err = bi.GobDecode(b[:n]) + return err + } + + // otherwise fall back + b := make([]byte, bLen) + n, err := base64.StdEncoding.Decode(b, input) + if err != nil { + return err + } + return bi.GobDecode(b[:n]) +} diff --git a/pkg/util/bignumber/gob_bigint_test.go b/pkg/util/bignumber/gob_bigint_test.go new file mode 100644 index 000000000..6dfb690d0 --- /dev/null +++ b/pkg/util/bignumber/gob_bigint_test.go @@ -0,0 +1,45 @@ +package bignumber_test + +import ( + "math/big" + "math/rand" + "testing" + + "github.com/KyberNetwork/kyberswap-dex-lib/pkg/util/bignumber" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestGobBigIntMarshal(t *testing.T) { + var bignum big.Int + for i := 0; i < 100; i++ { + number := rand.Int63() + bi := big.NewInt(number) + + { + // check marshal unmarshal small int + gbi1 := (*bignumber.GobBigInt)(bi) + bytes, err := gbi1.MarshalText() + require.Nil(t, err) + + gbi2 := (*bignumber.GobBigInt)(new(big.Int)) + err = gbi2.UnmarshalText(bytes) + require.Nil(t, err) + assert.Equal(t, gbi1, gbi2) + } + + // check marshal unmarshal big int (will start falling back to heap after sometime) + bignum.Lsh(&bignum, 64) + bignum.Add(&bignum, bi) + { + gbi1 := (*bignumber.GobBigInt)(&bignum) + bytes, err := gbi1.MarshalText() + require.Nil(t, err) + + gbi2 := (*bignumber.GobBigInt)(new(big.Int)) + err = gbi2.UnmarshalText(bytes) + require.Nil(t, err) + assert.Equal(t, gbi1, gbi2) + } + } +}