From 235653b9a53f95763c922493ebfb121ba0109049 Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Wed, 25 Jan 2023 21:01:55 -0600 Subject: [PATCH 001/136] initial push --- go.mod | 7 +- go.sum | 13 - go.work.sum | 1585 +++++++++++++++++ osmoutils/store_helper.go | 1 + .../concentrated-liquidity/position.proto | 6 + proto/osmosis/concentrated-liquidity/tx.proto | 11 + x/concentrated-liquidity/export_test.go | 26 +- x/concentrated-liquidity/keeper_test.go | 16 +- x/concentrated-liquidity/lp.go | 24 +- x/concentrated-liquidity/lp_test.go | 45 +- x/concentrated-liquidity/model/position.pb.go | 96 +- x/concentrated-liquidity/msg_server.go | 4 +- x/concentrated-liquidity/position.go | 32 +- x/concentrated-liquidity/position_test.go | 72 +- x/concentrated-liquidity/store.go | 72 + x/concentrated-liquidity/store_test.go | 63 + x/concentrated-liquidity/swaps_test.go | 52 +- x/concentrated-liquidity/tick_test.go | 2 +- x/concentrated-liquidity/types/errors.go | 10 +- x/concentrated-liquidity/types/keys.go | 39 +- x/concentrated-liquidity/types/tx.pb.go | 203 ++- x/gamm/keeper/migrate.go | 4 +- x/gamm/keeper/migrate_test.go | 7 +- x/gamm/types/expected_keepers.go | 4 +- 24 files changed, 2197 insertions(+), 197 deletions(-) create mode 100644 x/concentrated-liquidity/store.go create mode 100644 x/concentrated-liquidity/store_test.go diff --git a/go.mod b/go.mod index 672a8a07998..9878cc8fb8a 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/CosmWasm/wasmd v0.30.0 github.com/cosmos/cosmos-proto v1.0.0-alpha8 - github.com/cosmos/cosmos-sdk v0.46.7 + github.com/cosmos/cosmos-sdk v0.46.8 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/ibc-go/v4 v4.2.0 github.com/gogo/protobuf v1.3.3 @@ -50,11 +50,9 @@ require ( github.com/docker/distribution v2.8.1+incompatible // indirect github.com/felixge/httpsnoop v1.0.2 // indirect github.com/google/btree v1.1.2 // indirect - github.com/hashicorp/go-uuid v1.0.2 // indirect - github.com/jhump/protoreflect v1.13.1-0.20220928232736-101791cb1b4c // indirect github.com/kkHAIKE/contextcheck v1.1.3 // indirect github.com/maratori/testableexamples v1.0.0 // indirect - github.com/onsi/ginkgo v1.16.4 // indirect + github.com/nxadm/tail v1.4.8 // indirect github.com/regen-network/cosmos-proto v0.3.1 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect github.com/sashamelentyev/usestdlibvars v1.20.0 // indirect @@ -292,7 +290,6 @@ require ( golang.org/x/text v0.5.0 // indirect golang.org/x/tools v0.2.0 // indirect google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 honnef.co/go/tools v0.3.3 // indirect diff --git a/go.sum b/go.sum index ca018f51a9f..e312d2df7c9 100644 --- a/go.sum +++ b/go.sum @@ -372,7 +372,6 @@ github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5Nq github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= github.com/go-toolsmith/astcopy v1.0.2 h1:YnWf5Rnh1hUudj11kei53kI57quN/VH6Hp1n+erozn0= @@ -587,7 +586,6 @@ github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdv github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= @@ -632,12 +630,7 @@ github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGAR github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= -github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= -github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= -github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= github.com/jhump/protoreflect v1.13.1-0.20220928232736-101791cb1b4c h1:XImQJfpJLmGEEd8ll5yPVyL/aEvmgGHW4WYTyNseLOM= -github.com/jhump/protoreflect v1.13.1-0.20220928232736-101791cb1b4c/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= @@ -835,7 +828,6 @@ github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -868,8 +860,6 @@ github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 h1:Ylmch github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3/go.mod h1:lV6KnqXYD/ayTe7310MHtM3I2q8Z6bBfMAi+bhwPYtI= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 h1:+EbINXzHQyDtHje2CND357A22H2zUpceTtwJClC9IAM= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260/go.mod h1:KrzYoNtnWUH75rj1XAsSR4nymlHFU7jeVOx7/1KMe0k= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230112084519-84d6450e1670 h1:kaYzxnimKTDaIXuYewc3NVt/IXqBOqTEbPX+ttQwWho= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230112084519-84d6450e1670/go.mod h1:K4de+n3DtLdueen98dOzaRXZvqMd8JvigL8O1xW445o= github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230118070915-b6d983863935 h1:b9ojnkmxhILaFkWcUtV8D5qxS+kF2YCfdk50/mylBx4= github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230118070915-b6d983863935/go.mod h1:/Jcx+g9raXtoAJt+QGrKoLxJvYUg6let4a4hf79OuTc= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230110104305-322e8478dbe8 h1:iOJO+5jffUFlLVy51XaGnec22rNX5YAs71rxD+7M2Ac= @@ -1415,7 +1405,6 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1538,7 +1527,6 @@ golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -1654,7 +1642,6 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= diff --git a/go.work.sum b/go.work.sum index dfbfce6ad36..cbb17bc0709 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,3 +1,13 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= +bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= +cloud.google.com/go v0.25.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.2/go.mod h1:H8IAquKe2L30IxoupDgqTaQvKSwF/c8prYHynGIWQbA= +cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= @@ -8,33 +18,54 @@ cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aD cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= @@ -50,34 +81,60 @@ cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxB cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= @@ -85,91 +142,664 @@ cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/ cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +code.gitea.io/sdk/gitea v0.12.0/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= +contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= +contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= +contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= +contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= +github.com/99designs/keyring v1.1.6/go.mod h1:16e0ds7LGQQcT59QqkTg72Hh5ShM51Byv5PEmW6uoRU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= +github.com/AkihiroSuda/containerd-fuse-overlayfs v1.0.0/go.mod h1:0mMDvQFeLbbn1Wy8P2j3hwFhqBq+FKn8OZPno8WLmp8= +github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v19.1.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v42.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= +github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v10.15.5+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.1.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.10.2/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= +github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= +github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= +github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15-0.20200908182639-5b44b70ab3ab/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.10/go.mod h1:g5uw8EV2mAlzqe94tfNBNdr89fnbD/n3HV0OhsddkmM= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= +github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim v0.9.4/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim/test v0.0.0-20200826032352-301c83a30e7c/go.mod h1:30A5igQ91GEmhYJF8TaRP79pMBOYynRsyOByfVV0dU4= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= +github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/apex/log v1.1.4/go.mod h1:AlpoD9aScyQfJDVHmLMEcx4oU6LqzkWp4Mg9GdAcEvQ= +github.com/apex/log v1.3.0/go.mod h1:jd8Vpsr46WAe3EZSQ/IUMs2qQD/GOycT5rPWCO1yGcs= +github.com/apex/logs v0.0.4/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= +github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= +github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= +github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.11/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.90/go.mod h1:es1KtYUFs7le0xQ3rOihkuoVD90z7D0fR2Qm4S00/gU= +github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.31.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= +github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bombsimon/wsl/v2 v2.0.0/go.mod h1:mf25kr/SqFEPhhcxW1+7pxzGlW+hIl/hYTKY95VwV8U= +github.com/bombsimon/wsl/v2 v2.2.0/go.mod h1:Azh8c3XGEJl9LyX0/sFC+CKMc7Ssgua0g+6abzXN4Pg= +github.com/bombsimon/wsl/v3 v3.0.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= +github.com/bufbuild/buf v1.9.0/go.mod h1:1Q+rMHiMVcfgScEF/GOldxmu4o9TrQ2sQQh58K6MscE= +github.com/bufbuild/connect-go v1.0.0/go.mod h1:9iNvh/NOsfhNBUH5CtvXeVUskQO1xsrEviH7ZArwZ3I= +github.com/bufbuild/protocompile v0.1.0/go.mod h1:ix/MMMdsT3fzxfw91dvbfzKW3fRRnuPCP47kpAm5m/4= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= +github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= +github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= +github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= +github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1-0.20201117152358-0edc412565dc/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= +github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= +github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= +github.com/containerd/containerd v1.6.3-0.20220401172941-5ff8fce1fcc6/go.mod h1:WSt2SnDLAGWlu+Vl+EWay37seZLKqgRt6XLjIMy8SYM= +github.com/containerd/containerd v1.6.8/go.mod h1:By6p5KqPK0/7/CgO/A6t/Gz+CUYUu2zf1hUaaymVXB0= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= +github.com/containerd/continuity v0.2.3-0.20220330195504-d132b287edc8/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fuse-overlayfs-snapshotter v1.0.2/go.mod h1:nRZceC8a7dRm3Ao6cJAwuJWPFiBPaibHiFntRUnzhwU= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.4/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= +github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/stargz-snapshotter v0.0.0-20201027054423-3a04e4c2c116/go.mod h1:o59b3PCKVAf9jjiKtCc/9hLAd+5p/rfhBfm6aBcTEr4= +github.com/containerd/stargz-snapshotter v0.11.3/go.mod h1:2j2EAUyvrLU4D9unYlTIwGhDKQIk74KJ9E71lJsQCVM= +github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= +github.com/containerd/stargz-snapshotter/estargz v0.11.3/go.mod h1:7vRJIcImfY8bpifnMjt+HTJoQxASq7T28MYbP15/Nf0= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= +github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= +github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= +github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/cli v0.0.0-20190925022749-754388324470/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.0-beta1.0.20201029214301-1d20b15adc38+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.13+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.14+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.6.0-rc.1.0.20180327202408-83389a148052+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v0.0.0-20200511152416-a93e9eb0e95c/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20180531152204-71cd53e4a197/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v17.12.0-ce-rc1.0.20200730172259-9f28837c1d93+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.0-beta1.0.20201110211921-af34b94a78a1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.3-0.20211208011758-87521affb077+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libnetwork v0.8.0-dev.2.0.20200917202933-d0951081b35f/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-critic/go-critic v0.4.1/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= +github.com/go-critic/go-critic v0.4.3/go.mod h1:j4O3D4RoIwRqlZw5jJpx0BNfXWWbpcJoKu5cYSe4YmQ= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= +github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= +github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/flock v0.7.3/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v4.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.3.2/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.23.7/go.mod h1:g/38bxfhp4rI7zeWSxcdIeHTQGS58TCak8FYcyCmavQ= +github.com/golangci/golangci-lint v1.27.0/go.mod h1:+eZALfxIuthdrHPtfM7w/R3POJLjHDfJJw8XZl9xOng= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= +github.com/google/crfs v0.0.0-20191108021818-71d77da419c9/go.mod h1:etGhoOqfwPkooV6aqoX3eBGQOJblqdoc9XvWOeuxpPw= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-containerregistry v0.0.0-20191010200024-a3d713f9b7f8/go.mod h1:KyKXa9ciM8+lgMXwOVsXi7UxGrsf9mM61Mzs+xKUrKE= +github.com/google/go-containerregistry v0.1.2/go.mod h1:GPivBPgdAyd2SU+vf6EpsgOtWDuPqjW0hJZt4rNdTZ4= +github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= +github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= +github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= +github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= @@ -178,116 +808,893 @@ github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/gookit/color v1.2.4/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= +github.com/gookit/color v1.5.1/go.mod h1:wZFzea4X8qN6vHOSP2apMb4/+w/orMznEzYsIHPaqKM= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= +github.com/goreleaser/goreleaser v0.136.0/go.mod h1:wiKrPUeSNh6Wu8nUHxZydSOVQ/OZvOaO7DTtFqie904= +github.com/goreleaser/nfpm v1.2.1/go.mod h1:TtWrABZozuLOttX2uDlYyECfQX7x5XYkVxhjYcR6G9w= +github.com/goreleaser/nfpm v1.3.0/go.mod h1:w0p7Kc9TAUgWMyrub63ex3M2Mgw88M4GZXoTq5UCb40= +github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= +github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.0.3/go.mod h1:0EQM6aH2ctVpvZ6a+onrQ/vaykxh2GH7hy3e13vzTUY= +github.com/hanwen/go-fuse/v2 v2.1.1-0.20220112183258-f57e95bda82d/go.mod h1:B1nGE/6RBFyBRC1RRnf23UpwCdyJ31eukw34oAKukAc= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c/go.mod h1:fHzc09UnyJyqyW+bFuq864eh+wC7dj65aXmXLRe5to0= +github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= +github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= +github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/informalsystems/tm-load-test v1.0.0/go.mod h1:WVaSKaQdfZK3v0C74EMzn7//+3aeCZF8wkIKBz2/M74= +github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= +github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= +github.com/jaguilar/vt100 v0.0.0-20150826170717-2703a27b14ea/go.mod h1:QMdK4dGB3YhEW2BmA1wgGpPYI3HZy/5gD705PXKUVSg= +github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= +github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= +github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= +github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= +github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= +github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= +github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= +github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/buildkit v0.8.1/go.mod h1:/kyU1hKy/aYCuP39GZA9MaKioovHku57N6cqlKZIaiQ= +github.com/moby/buildkit v0.10.4/go.mod h1:Yajz9vt1Zw5q9Pp4pdb3TCSUXJBIroIQGQ3TTs/sLug= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mount v0.1.0/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= +github.com/moby/sys/mount v0.1.1/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= +github.com/moby/sys/mount v0.3.0/go.mod h1:U2Z3ur2rXPFrFmy4q6WMwWrBOAQGYtYTRVM8BIvzbwk= +github.com/moby/sys/mountinfo v0.1.0/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.6.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20200915141129-7f0af18e79f2/go.mod h1:TjQg8pa4iejrUrjiz0MCtMV38jdMNW4doKSiBrEvCQQ= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= +github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= +github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= +github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= +github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= +github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= +github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= +github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/networkplumbing/go-nft v0.2.0/go.mod h1:HnnM+tYvlGAsMU7yoYwXEVLLiDW9gdMmb5HoGcwpuQs= +github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= +github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= +github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc10/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runc v1.1.1/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= +github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= +github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= +github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= +github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8/go.mod h1:CGFX09Ci3pq9QZdj86B+VGIdNj4VyCo2iPOGS9esB/k= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= +github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= +github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= +github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= +github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= +github.com/ryancurrah/gomodguard v1.0.4/go.mod h1:9T/Cfuxs5StfsocWr4WzDL36HqnX0fVb9d5fSEaLhoE= +github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= +github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= +github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/securego/gosec v0.0.0-20200103095621-79fbf3af8d83/go.mod h1:vvbZ2Ae7AzSq3/kywjUDxSNq2SJ27RxCz2un0H3ePqE= +github.com/securego/gosec v0.0.0-20200401082031-e946c8c39989/go.mod h1:i9l/TNj+yDFh9SZXUTvspXTjbFXgZGP/UvhU1S65A4A= +github.com/securego/gosec/v2 v2.3.0/go.mod h1:UzeVyUXbxukhLeHKV3VVqo7HdoQR9MrRfFmZYotn8ME= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= +github.com/shirou/gopsutil/v3 v3.22.9/go.mod h1:bBYl1kjgEJpWpxeHmLI+dVHWtyAwfcmSBLDsp2TNT8A= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= +github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= +github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVjBcBGsVmMmak= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= +github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= +github.com/tendermint/tm-db v0.6.6/go.mod h1:wP8d49A85B7/erz/r4YbKssKw6ylsO/hKtFk7E1aWZI= +github.com/tetafro/godot v0.3.7/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= +github.com/tetafro/godot v0.4.2/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= +github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= +github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= +github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= +github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= +github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= +github.com/tommy-muehle/go-mnd v1.1.1/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/tonistiigi/fsutil v0.0.0-20201103201449-0834f99b7b85/go.mod h1:a7cilN64dG941IOXfhJhlH0qB92hxJ9A1ewrdUmJ6xo= +github.com/tonistiigi/fsutil v0.0.0-20220115021204-b19f7f9cb274/go.mod h1:oPAfvw32vlUJSjyDcQ3Bu0nb2ON2B+G0dtVN/SZNJiA= +github.com/tonistiigi/go-actions-cache v0.0.0-20220404170428-0bdeb6e1eac7/go.mod h1:qqvyZqkfwkoJuPU/bw61bItaoO0SJ8YSW0vSVRRvsRg= +github.com/tonistiigi/go-archvariant v1.0.0/go.mod h1:TxFmO5VS6vMq2kvs3ht04iPXtu2rUT/erOnGFYfk5Ho= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= +github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= +github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= +github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= +github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= +github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJbreVojo06krnTgaeAz/Z7lynpPk/Q2c= +github.com/vektra/mockery/v2 v2.14.0/go.mod h1:bnD1T8tExSgPD1ripLkDbr60JA9VtQeu12P3wgLZd7M= +github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= +github.com/xanzy/go-gitlab v0.32.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= +go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= +go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= +go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= +go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A= +go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.29.0/go.mod h1:LsankqVDx4W+RhZNA5uWarULII/MBhF5qwCYxTuyXjs= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.3/go.mod h1:Dts42MGkzZne2yCru741+bFiTMWkIj/LLRizad7b9tw= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.29.0/go.mod h1:vHItvsnJtp7ES++nFLLFBzUWny7fJQSvTlxFcqQGUr4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.29.0/go.mod h1:tLYsuf2v8fZreBVwp9gVMhefZlLFZaUiNVSq8QxXRII= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= +go.opentelemetry.io/otel v1.4.0/go.mod h1:jeAqMFKy2uLIxCtKxoFj0FAL5zAPKQagc3+GtBWakzk= +go.opentelemetry.io/otel v1.4.1/go.mod h1:StM6F/0fSwpd8dKWDCdRr7uRvEPYdW0hBSlbdTiUde4= +go.opentelemetry.io/otel v1.11.0/go.mod h1:H2KtuEphyMvlhZ+F7tg9GRhAOe60moNx61Ex+WmiKkk= +go.opentelemetry.io/otel/exporters/jaeger v1.4.1/go.mod h1:ZW7vkOu9nC1CxsD8bHNHCia5JUbwP39vxgd1q4Z5rCI= +go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.4.1/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.4.1/go.mod h1:o5RW5o2pKpJLD5dNTCmjF1DorYwMeFJmb/rKr5sLaa8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.4.1/go.mod h1:c6E4V3/U+miqjs/8l950wggHGL1qzlp0Ypj9xoGrPqo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.4.1/go.mod h1:VwYo0Hak6Efuy0TXsZs8o1hnV3dHDPNtDbycG0hI8+M= +go.opentelemetry.io/otel/internal/metric v0.27.0/go.mod h1:n1CVxRqKqYZtqyTh9U/onvKapPGv7y/rpyOTI+LFNzw= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.27.0/go.mod h1:raXDJ7uP2/Jc0nVZWQjJtzoyssOYWu/+pjZqRzfvZ7g= +go.opentelemetry.io/otel/metric v0.32.3/go.mod h1:pgiGmKohxHyTPHGOff+vrtIH39/R9fiO/WoenUQ3kcc= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= +go.opentelemetry.io/otel/sdk v1.4.1/go.mod h1:NBwHDgDIBYjwK2WNu1OPgsIc2IJzmBXNnvIJxJc8BpE= +go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= +go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= +go.opentelemetry.io/otel/trace v1.4.0/go.mod h1:uc3eRsqDfWs9R7b92xbQbU42/eTNz4N+gLP8qJCi4aE= +go.opentelemetry.io/otel/trace v1.4.1/go.mod h1:iYEVbroFCNut9QkwEczV9vMRPHNKSSwYZjulEtsmhFc= +go.opentelemetry.io/otel/trace v1.11.0/go.mod h1:nyYjis9jy0gytE9LXGU+/m1sHTKbRY0fX0hulNNDP1U= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= +go.opentelemetry.io/proto/otlp v0.12.0/go.mod h1:TsIjwGWIx5VFYv9KGVlOpxoBl5Dy+63SUguV7GGvlSQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= +golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= +golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220726230323-06994584191e/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221017152216-f25eb7ecb193/go.mod h1:RpDiru2p0u2F0lLpEoqnP2+7xs0ifAuOcJ442g6GU2s= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200917073148-efd3b9a0ff20/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201013081832-0aaa2718063a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210313202042-bd2e13477e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211031064116-611d5d643895/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220727055044-e65921a090b8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220919170432-7a66f970e087/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190228203856-589c23e65e65/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200102140908-9497f49d5709/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204192400-7124308813f3/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200331202046-9d5940d49312/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200502202811-ed308ab3e770/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.11-0.20220513221640-090b14e8501f/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.12-0.20220628192153-7743d1d949f1/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.2.0/go.mod h1:IfRCZScioGtypHNTlz3gFk67J8uePVW7uDTBzXuIkhU= +google.golang.org/api v0.3.0/go.mod h1:IuvZyQh8jgscv8qWfQ4ABd8m7hEudgBFM/EdhA3BnXw= +google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.25.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= @@ -296,21 +1703,47 @@ google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6 google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= +google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -332,8 +1765,14 @@ google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211101144312-62acf1d99145/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= @@ -343,22 +1782,168 @@ google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220725144611-272f38e5d71b/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +k8s.io/api v0.0.0-20180904230853-4e7be11eab3f/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/api v0.17.4/go.mod h1:5qxx6vjmwUVG2nHQTKGlLts8Tbok8PzHl4vHtVFuZCA= +k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= +k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= +k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= +k8s.io/api v0.23.4/go.mod h1:i77F4JfyNNrhOjZF7OwwNJS5Y1S9dpwvb9iYRYRczfI= +k8s.io/apimachinery v0.0.0-20180904193909-def12e63c512/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/apimachinery v0.17.4/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= +k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= +k8s.io/apimachinery v0.23.4/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= +k8s.io/apiserver v0.17.4/go.mod h1:5ZDQ6Xr5MNBxyi3iUZXS84QOhZl+W7Oq2us/29c0j9I= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= +k8s.io/client-go v0.0.0-20180910083459-2cefa64ff137/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/client-go v0.17.4/go.mod h1:ouF6o5pz3is8qU0/qYL2RnoxOPqgfuidYLowytyLJmc= +k8s.io/client-go v0.19.0/go.mod h1:H9E/VT95blcFQnlyShFgnFT9ZnJOAceiUHM3MlRC+mU= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= +k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= +k8s.io/client-go v0.23.4/go.mod h1:PKnIL4pqLuvYUK1WU7RLTMYKPiIh7MYShLshtRY9cj0= +k8s.io/cloud-provider v0.17.4/go.mod h1:XEjKDzfD+b9MTLXQFlDGkk6Ho8SGMpaU8Uugx/KNK9U= +k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= +k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= +k8s.io/component-base v0.17.4/go.mod h1:5BRqHMbbQPm2kKu35v3G+CpVq4K0RJKC7TRioF0I9lE= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= +k8s.io/cri-api v0.24.0-alpha.3/go.mod h1:c/NLI5Zdyup5+oEYqFO2IE32ptofNiZpS1nL2y51gAg= +k8s.io/csi-translation-lib v0.17.4/go.mod h1:CsxmjwxEI0tTNMzffIAcgR9lX4wOh6AKHdxQrT7L0oo= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= +k8s.io/kubernetes v1.11.10/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuBkhu+yxOc1Js= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= +mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7/go.mod h1:HGC5lll35J70Y5v7vCGb9oLhHoScFwkHDJm/05RdSTc= +pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4= diff --git a/osmoutils/store_helper.go b/osmoutils/store_helper.go index 2a3c377a69b..7f45f90f40c 100644 --- a/osmoutils/store_helper.go +++ b/osmoutils/store_helper.go @@ -89,6 +89,7 @@ func gatherValuesFromIterator[T any](iterator db.Iterator, parseValue func([]byt break } val, err := parseValue(iterator.Value()) + fmt.Printf("val: %v \n", val) if err != nil { return nil, err } diff --git a/proto/osmosis/concentrated-liquidity/position.proto b/proto/osmosis/concentrated-liquidity/position.proto index 551e55d38a0..390dae0b0c0 100644 --- a/proto/osmosis/concentrated-liquidity/position.proto +++ b/proto/osmosis/concentrated-liquidity/position.proto @@ -6,6 +6,7 @@ syntax = "proto3"; package osmosis.concentratedliquidity.v1beta1; import "cosmos_proto/cosmos.proto"; +import "google/protobuf/timestamp.proto"; import "gogoproto/gogo.proto"; option go_package = "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model"; @@ -16,4 +17,9 @@ message Position { (gogoproto.moretags) = "yaml:\"liquidity\"", (gogoproto.nullable) = false ]; + google.protobuf.Timestamp frozen_until = 2 [ + (gogoproto.nullable) = false, + (gogoproto.stdtime) = true, + (gogoproto.moretags) = "yaml:\"frozen_until\"" + ]; } diff --git a/proto/osmosis/concentrated-liquidity/tx.proto b/proto/osmosis/concentrated-liquidity/tx.proto index 59df525f74b..2d0980a2c16 100644 --- a/proto/osmosis/concentrated-liquidity/tx.proto +++ b/proto/osmosis/concentrated-liquidity/tx.proto @@ -2,6 +2,7 @@ syntax = "proto3"; package osmosis.concentratedliquidity.v1beta1; import "gogoproto/gogo.proto"; +import "google/protobuf/timestamp.proto"; import "cosmos/base/v1beta1/coin.proto"; option go_package = "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types"; @@ -37,6 +38,11 @@ message MsgCreatePosition { (gogoproto.moretags) = "yaml:\"token_min_amount1\"", (gogoproto.nullable) = false ]; + google.protobuf.Timestamp frozen_until = 9 [ + (gogoproto.nullable) = false, + (gogoproto.stdtime) = true, + (gogoproto.moretags) = "yaml:\"frozen_until\"" + ]; } message MsgCreatePositionResponse { @@ -68,6 +74,11 @@ message MsgWithdrawPosition { (gogoproto.moretags) = "yaml:\"liquidity_amount\"", (gogoproto.nullable) = false ]; + google.protobuf.Timestamp frozen_until = 6 [ + (gogoproto.nullable) = false, + (gogoproto.stdtime) = true, + (gogoproto.moretags) = "yaml:\"frozen_until\"" + ]; } message MsgWithdrawPositionResponse { diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index 3af5995e7e1..a9b514c0f6e 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -1,6 +1,8 @@ package concentrated_liquidity import ( + "time" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/osmosis-labs/osmosis/osmoutils/accum" @@ -23,12 +25,12 @@ func (k Keeper) SetPool(ctx sdk.Context, pool types.ConcentratedPoolExtension) e return k.setPool(ctx, pool) } -func (k Keeper) HasPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64) bool { - return k.hasPosition(ctx, poolId, owner, lowerTick, upperTick) +func (k Keeper) HasPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) bool { + return k.hasPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) } -func (k Keeper) DeletePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64) error { - return k.deletePosition(ctx, poolId, owner, lowerTick, upperTick) +func (k Keeper) DeletePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) error { + return k.deletePosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) } func (k Keeper) GetPoolById(ctx sdk.Context, poolId uint64) (types.ConcentratedPoolExtension, error) { @@ -55,16 +57,16 @@ func (k Keeper) CalcOutAmtGivenInInternal(ctx sdk.Context, tokenInMin sdk.Coin, return k.calcOutAmtGivenIn(ctx, tokenInMin, tokenOutDenom, swapFee, priceLimit, poolId) } -func (k Keeper) UpdatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec) (sdk.Int, sdk.Int, error) { - return k.updatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta) +func (k Keeper) UpdatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, frozenUntil time.Time) (sdk.Int, sdk.Int, error) { + return k.updatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta, frozenUntil) } func (k Keeper) InitOrUpdateTick(ctx sdk.Context, poolId uint64, tickIndex int64, liquidityIn sdk.Dec, upper bool) (err error) { return k.initOrUpdateTick(ctx, poolId, tickIndex, liquidityIn, upper) } -func (k Keeper) InitOrUpdatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec) (err error) { - return k.initOrUpdatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta) +func (k Keeper) InitOrUpdatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, frozenUntil time.Time) (err error) { + return k.initOrUpdatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta, frozenUntil) } func (k Keeper) PoolExists(ctx sdk.Context, poolId uint64) bool { @@ -131,3 +133,11 @@ func (k Keeper) ChargeFee(ctx sdk.Context, poolId uint64, feeUpdate sdk.DecCoin) func FormatPositionAccumulatorKey(poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64) string { return formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick) } + +func (k Keeper) GetAllPositionsWithVaryingFreezeTimes(ctx sdk.Context, poolId uint64, addr sdk.AccAddress, lowerTick, upperTick int64) ([]model.Position, error) { + return k.getAllPositionsWithVaryingFreezeTimes(ctx, poolId, addr, lowerTick, upperTick) +} + +func (k Keeper) SetPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, position *model.Position, frozenUntil time.Time) { + k.setPosition(ctx, poolId, owner, lowerTick, upperTick, position, frozenUntil) +} diff --git a/x/concentrated-liquidity/keeper_test.go b/x/concentrated-liquidity/keeper_test.go index 06ab9c91868..1c01ab78ae1 100644 --- a/x/concentrated-liquidity/keeper_test.go +++ b/x/concentrated-liquidity/keeper_test.go @@ -2,10 +2,12 @@ package concentrated_liquidity_test import ( "testing" + "time" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/suite" + "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" poolmanagertypes "github.com/osmosis-labs/osmosis/v14/x/poolmanager/types" cl "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity" @@ -25,6 +27,7 @@ var ( DefaultCurrSqrtPrice, _ = DefaultCurrPrice.ApproxSqrt() // 70.710678118654752440 DefaultZeroSwapFee = sdk.ZeroDec() DefaultFeeAccumCoins = sdk.NewDecCoins(sdk.NewDecCoin("foo", sdk.NewInt(50))) + DefaultFreezeDuration = time.Duration(time.Hour * 24) ETH = "eth" DefaultAmt0 = sdk.NewInt(1000000) DefaultAmt0Expected = sdk.NewInt(998976) @@ -51,18 +54,21 @@ func (suite *KeeperTestSuite) SetupTest() { } func (s *KeeperTestSuite) SetupDefaultPosition(poolId uint64) { - s.SetupPosition(poolId, s.TestAccs[0], DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick) + s.SetupPosition(poolId, s.TestAccs[0], DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) } -func (s *KeeperTestSuite) SetupPosition(poolId uint64, owner sdk.AccAddress, coin0, coin1 sdk.Coin, lowerTick, upperTick int64) { +func (s *KeeperTestSuite) SetupPosition(poolId uint64, owner sdk.AccAddress, coin0, coin1 sdk.Coin, lowerTick, upperTick int64, frozenUntil time.Time) model.Position { s.FundAcc(owner, sdk.NewCoins(coin0, coin1)) - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, poolId, owner, coin0.Amount, coin1.Amount, sdk.ZeroInt(), sdk.ZeroInt(), lowerTick, upperTick) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, poolId, owner, coin0.Amount, coin1.Amount, sdk.ZeroInt(), sdk.ZeroInt(), lowerTick, upperTick, frozenUntil) s.Require().NoError(err) + position, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, poolId, owner, lowerTick, upperTick, frozenUntil) + s.Require().NoError(err) + return *position } // validatePositionUpdate validates that position with given parameters has expectedRemainingLiquidity left. -func (s *KeeperTestSuite) validatePositionUpdate(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64, expectedRemainingLiquidity sdk.Dec) { - position, err := s.App.ConcentratedLiquidityKeeper.GetPosition(ctx, poolId, owner, lowerTick, upperTick) +func (s *KeeperTestSuite) validatePositionUpdate(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64, frozenUntil time.Time, expectedRemainingLiquidity sdk.Dec) { + position, err := s.App.ConcentratedLiquidityKeeper.GetPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) s.Require().NoError(err) newPositionLiquidity := position.Liquidity s.Require().Equal(expectedRemainingLiquidity.String(), newPositionLiquidity.String()) diff --git a/x/concentrated-liquidity/lp.go b/x/concentrated-liquidity/lp.go index 1c2a456de92..271a8573443 100644 --- a/x/concentrated-liquidity/lp.go +++ b/x/concentrated-liquidity/lp.go @@ -3,6 +3,7 @@ package concentrated_liquidity import ( "errors" "fmt" + "time" sdk "github.com/cosmos/cosmos-sdk/types" @@ -22,7 +23,7 @@ import ( // - the liquidity delta is zero // - the amount0 or amount1 returned from the position update is less than the given minimums // - the pool or user does not have enough tokens to satisfy the requested amount -func (k Keeper) CreatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, amount0Desired, amount1Desired, amount0Min, amount1Min sdk.Int, lowerTick, upperTick int64) (sdk.Int, sdk.Int, sdk.Dec, error) { +func (k Keeper) CreatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, amount0Desired, amount1Desired, amount0Min, amount1Min sdk.Int, lowerTick, upperTick int64, frozenUntil time.Time) (sdk.Int, sdk.Int, sdk.Dec, error) { // Retrieve the pool associated with the given pool ID. pool, err := k.getPoolById(ctx, poolId) if err != nil { @@ -63,14 +64,14 @@ func (k Keeper) CreatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddr } // If this is a new position, initialize the fee accumulator for the position. - if !k.hasPosition(cacheCtx, poolId, owner, lowerTick, upperTick) { + if !k.hasPosition(cacheCtx, poolId, owner, lowerTick, upperTick, frozenUntil) { if err := k.initializeFeeAccumulatorPosition(cacheCtx, poolId, owner, lowerTick, upperTick); err != nil { return sdk.Int{}, sdk.Int{}, sdk.Dec{}, err } } // Update the position in the pool based on the provided tick range and liquidity delta. - actualAmount0, actualAmount1, err := k.updatePosition(cacheCtx, poolId, owner, lowerTick, upperTick, liquidityDelta) + actualAmount0, actualAmount1, err := k.updatePosition(cacheCtx, poolId, owner, lowerTick, upperTick, liquidityDelta, frozenUntil) if err != nil { return sdk.Int{}, sdk.Int{}, sdk.Dec{}, err } @@ -101,7 +102,7 @@ func (k Keeper) CreatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddr // - there is no position in the given tick ranges // - if tick ranges are invalid // - if attempts to withdraw an amount higher than originally provided in createPosition for a given range. -func (k Keeper) WithdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, requestedLiquidityAmountToWithdraw sdk.Dec) (amtDenom0, amtDenom1 sdk.Int, err error) { +func (k Keeper) WithdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time, requestedLiquidityAmountToWithdraw sdk.Dec) (amtDenom0, amtDenom1 sdk.Int, err error) { // Retrieve the pool associated with the given pool ID. pool, err := k.getPoolById(ctx, poolId) if err != nil { @@ -114,11 +115,16 @@ func (k Keeper) WithdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAd } // Retrieve the position in the pool for the provided owner and tick range. - position, err := k.GetPosition(ctx, poolId, owner, lowerTick, upperTick) + position, err := k.GetPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) if err != nil { return sdk.Int{}, sdk.Int{}, err } + // Check if position is still frozen + if position.FrozenUntil.After(ctx.BlockTime()) { + return sdk.Int{}, sdk.Int{}, fmt.Errorf("position is still frozen until %s", position.FrozenUntil) + } + // Check if the requested liquidity amount to withdraw is less than or equal to the available liquidity for the position. // If it is greater than the available liquidity, return an error. availableLiquidity := position.Liquidity @@ -131,7 +137,7 @@ func (k Keeper) WithdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAd liquidityDelta := requestedLiquidityAmountToWithdraw.Neg() // Update the position in the pool based on the provided tick range and liquidity delta. - actualAmount0, actualAmount1, err := k.updatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta) + actualAmount0, actualAmount1, err := k.updatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta, frozenUntil) if err != nil { return sdk.Int{}, sdk.Int{}, err } @@ -148,7 +154,7 @@ func (k Keeper) WithdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAd if _, err := k.collectFees(ctx, poolId, owner, lowerTick, upperTick); err != nil { return sdk.Int{}, sdk.Int{}, err } - if err := k.deletePosition(ctx, poolId, owner, lowerTick, upperTick); err != nil { + if err := k.deletePosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil); err != nil { return sdk.Int{}, sdk.Int{}, err } } @@ -162,7 +168,7 @@ func (k Keeper) WithdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAd // Updates ticks and pool liquidity. Returns how much of each token is either added or removed. // Negative returned amounts imply that tokens are removed from the pool. // Positive returned amounts imply that tokens are added to the pool. -func (k Keeper) updatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec) (sdk.Int, sdk.Int, error) { +func (k Keeper) updatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, frozenUntil time.Time) (sdk.Int, sdk.Int, error) { // update tickInfo state // TODO: come back to sdk.Int vs sdk.Dec state & truncation err := k.initOrUpdateTick(ctx, poolId, lowerTick, liquidityDelta, false) @@ -178,7 +184,7 @@ func (k Keeper) updatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddr // update position state // TODO: come back to sdk.Int vs sdk.Dec state & truncation - err = k.initOrUpdatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta) + err = k.initOrUpdatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta, frozenUntil) if err != nil { return sdk.Int{}, sdk.Int{}, err } diff --git a/x/concentrated-liquidity/lp_test.go b/x/concentrated-liquidity/lp_test.go index 7c0f3167b5e..2920936b181 100644 --- a/x/concentrated-liquidity/lp_test.go +++ b/x/concentrated-liquidity/lp_test.go @@ -2,6 +2,7 @@ package concentrated_liquidity_test import ( "errors" + "time" sdk "github.com/cosmos/cosmos-sdk/types" @@ -16,6 +17,7 @@ type lpTest struct { currentTick sdk.Int lowerTick int64 upperTick int64 + frozenUntil time.Time currentSqrtP sdk.Dec amount0Desired sdk.Int amount0Minimum sdk.Int @@ -212,7 +214,7 @@ func (s *KeeperTestSuite) TestCreatePosition() { // If we want to test a non-first position, we create a first position with a separate account if tc.isNotFirstPosition { - s.SetupPosition(1, s.TestAccs[1], DefaultCoin0, DefaultCoin1, tc.lowerTick, tc.upperTick) + s.SetupPosition(1, s.TestAccs[1], DefaultCoin0, DefaultCoin1, tc.lowerTick, tc.upperTick, tc.frozenUntil) } expectedLiquidityCreated := tc.liquidityAmount @@ -221,7 +223,7 @@ func (s *KeeperTestSuite) TestCreatePosition() { // we expect to create half of the final liquidity amount. expectedLiquidityCreated = tc.liquidityAmount.QuoInt64(2) - s.SetupPosition(1, s.TestAccs[0], DefaultCoin0, DefaultCoin1, tc.lowerTick, tc.upperTick) + s.SetupPosition(1, s.TestAccs[0], DefaultCoin0, DefaultCoin1, tc.lowerTick, tc.upperTick, tc.frozenUntil) } // Fund test account and create the desired position @@ -232,7 +234,7 @@ func (s *KeeperTestSuite) TestCreatePosition() { poolBalancePrePositionCreation := s.App.BankKeeper.GetAllBalances(s.Ctx, pool.GetAddress()) // System under test. - asset0, asset1, liquidityCreated, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.amount0Desired, tc.amount1Desired, tc.amount0Minimum, tc.amount1Minimum, tc.lowerTick, tc.upperTick) + asset0, asset1, liquidityCreated, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.amount0Desired, tc.amount1Desired, tc.amount0Minimum, tc.amount1Minimum, tc.lowerTick, tc.upperTick, tc.frozenUntil) // Note user and pool account balances to compare after create position is called userBalancePostPositionCreation := s.App.BankKeeper.GetAllBalances(s.Ctx, s.TestAccs[0]) @@ -254,7 +256,7 @@ func (s *KeeperTestSuite) TestCreatePosition() { s.Require().Equal(poolBalancePrePositionCreation.String(), poolBalancePostPositionCreation.String()) // Redundantly ensure that position was not created - position, err := clKeeper.GetPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick) + position, err := clKeeper.GetPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.frozenUntil) s.Require().Error(err) s.Require().ErrorAs(err, &types.PositionNotFoundError{PoolId: tc.poolId, LowerTick: tc.lowerTick, UpperTick: tc.upperTick}) s.Require().Nil(position) @@ -271,11 +273,11 @@ func (s *KeeperTestSuite) TestCreatePosition() { s.Require().Equal(userBalancePrePositionCreation.Sub(sdk.NewCoins(sdk.NewCoin(ETH, asset0), (sdk.NewCoin(USDC, asset1)))).String(), userBalancePostPositionCreation.String()) s.Require().Equal(poolBalancePrePositionCreation.Add(sdk.NewCoin(ETH, asset0), (sdk.NewCoin(USDC, asset1))).String(), poolBalancePostPositionCreation.String()) - hasPosition := clKeeper.HasPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick) + hasPosition := clKeeper.HasPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.frozenUntil) s.Require().True(hasPosition) // Check position state - s.validatePositionUpdate(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.liquidityAmount) + s.validatePositionUpdate(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.frozenUntil, tc.liquidityAmount) s.validatePositionFeeAccUpdate(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.liquidityAmount) @@ -408,7 +410,7 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { s.FundAcc(owner, sdk.NewCoins(sdk.NewCoin("eth", sdk.NewInt(10000000000000)), sdk.NewCoin("usdc", sdk.NewInt(1000000000000)))) // Create a position from the parameters in the test case. - _, _, liquidityCreated, err := concentratedLiquidityKeeper.CreatePosition(ctx, config.poolId, owner, config.amount0Desired, config.amount1Desired, sdk.ZeroInt(), sdk.ZeroInt(), config.lowerTick, config.upperTick) + _, _, liquidityCreated, err := concentratedLiquidityKeeper.CreatePosition(ctx, config.poolId, owner, config.amount0Desired, config.amount1Desired, sdk.ZeroInt(), sdk.ZeroInt(), config.lowerTick, config.upperTick, config.frozenUntil) s.Require().NoError(err) // Set global fee growth to 1 ETH and charge the fee to the pool. @@ -437,7 +439,7 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { expectedBalanceDelta := expectedFeesClaimed.Add(sdk.NewCoin(ETH, config.amount0Expected.Abs())).Add(sdk.NewCoin(USDC, config.amount1Expected.Abs())) // System under test. - amtDenom0, amtDenom1, err := concentratedLiquidityKeeper.WithdrawPosition(ctx, config.poolId, owner, config.lowerTick, config.upperTick, config.liquidityAmount) + amtDenom0, amtDenom1, err := concentratedLiquidityKeeper.WithdrawPosition(ctx, config.poolId, owner, config.lowerTick, config.upperTick, config.frozenUntil, config.liquidityAmount) if config.expectedError != nil { s.Require().Error(err) @@ -461,13 +463,13 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { if expectedRemainingLiquidity.IsZero() { // Check that the position was deleted. - position, err := concentratedLiquidityKeeper.GetPosition(ctx, config.poolId, owner, config.lowerTick, config.upperTick) + position, err := concentratedLiquidityKeeper.GetPosition(ctx, config.poolId, owner, config.lowerTick, config.upperTick, config.frozenUntil) s.Require().Error(err) s.Require().ErrorAs(err, &types.PositionNotFoundError{PoolId: config.poolId, LowerTick: config.lowerTick, UpperTick: config.upperTick}) s.Require().Nil(position) } else { // Check that the position was updated. - s.validatePositionUpdate(ctx, config.poolId, owner, config.lowerTick, config.upperTick, expectedRemainingLiquidity) + s.validatePositionUpdate(ctx, config.poolId, owner, config.lowerTick, config.upperTick, config.frozenUntil, expectedRemainingLiquidity) } // Check tick state. @@ -522,6 +524,9 @@ func mergeConfigs(dst *lpTest, overwrite *lpTest) { if overwrite.isNotFirstPositionWithSameAccount { dst.isNotFirstPositionWithSameAccount = overwrite.isNotFirstPositionWithSameAccount } + if !overwrite.frozenUntil.IsZero() { + dst.frozenUntil = overwrite.frozenUntil + } } } @@ -701,11 +706,13 @@ func (s *KeeperTestSuite) TestisInitialPositionForPool() { } func (s *KeeperTestSuite) TestUpdatePosition() { + defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) type updatePositionTest struct { poolId uint64 ownerIndex int lowerTick int64 upperTick int64 + frozenUntil time.Time liquidityDelta sdk.Dec amount0Expected sdk.Int amount1Expected sdk.Int @@ -721,6 +728,7 @@ func (s *KeeperTestSuite) TestUpdatePosition() { ownerIndex: 0, lowerTick: DefaultLowerTick, upperTick: DefaultUpperTick, + frozenUntil: defaultFrozenUntil, liquidityDelta: DefaultLiquidityAmt, amount0Expected: DefaultAmt0Expected, amount1Expected: DefaultAmt1Expected, @@ -734,6 +742,7 @@ func (s *KeeperTestSuite) TestUpdatePosition() { ownerIndex: 0, lowerTick: DefaultLowerTick, upperTick: DefaultUpperTick, + frozenUntil: defaultFrozenUntil, liquidityDelta: DefaultLiquidityAmt.Neg(), amount0Expected: DefaultAmt0Expected.Neg(), amount1Expected: DefaultAmt1Expected.Neg(), @@ -747,6 +756,7 @@ func (s *KeeperTestSuite) TestUpdatePosition() { ownerIndex: 0, lowerTick: DefaultLowerTick, upperTick: DefaultUpperTick, + frozenUntil: defaultFrozenUntil, liquidityDelta: DefaultLiquidityAmt.Neg().Mul(sdk.NewDec(2)), expectedError: true, }, @@ -755,6 +765,7 @@ func (s *KeeperTestSuite) TestUpdatePosition() { ownerIndex: 0, lowerTick: DefaultUpperTick + 1, upperTick: DefaultUpperTick + 100, + frozenUntil: defaultFrozenUntil, liquidityDelta: DefaultLiquidityAmt, expectedError: true, }, @@ -763,6 +774,7 @@ func (s *KeeperTestSuite) TestUpdatePosition() { ownerIndex: 0, lowerTick: DefaultLowerTick, upperTick: DefaultUpperTick, + frozenUntil: defaultFrozenUntil, liquidityDelta: DefaultLiquidityAmt, expectedError: true, }, @@ -771,6 +783,7 @@ func (s *KeeperTestSuite) TestUpdatePosition() { ownerIndex: 1, // using a different address makes this a new position lowerTick: DefaultLowerTick, upperTick: DefaultUpperTick, + frozenUntil: defaultFrozenUntil, liquidityDelta: DefaultLiquidityAmt, expectedError: true, }, @@ -793,6 +806,7 @@ func (s *KeeperTestSuite) TestUpdatePosition() { DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, + s.Ctx.BlockTime().Add(DefaultFreezeDuration), ) s.Require().NoError(err) @@ -804,6 +818,7 @@ func (s *KeeperTestSuite) TestUpdatePosition() { tc.lowerTick, tc.upperTick, tc.liquidityDelta, + tc.frozenUntil, ) if tc.expectedError { @@ -816,7 +831,7 @@ func (s *KeeperTestSuite) TestUpdatePosition() { s.Require().Equal(actualAmount1, tc.amount1Expected) // validate if position has been properly updated - s.validatePositionUpdate(s.Ctx, tc.poolId, s.TestAccs[tc.ownerIndex], tc.lowerTick, tc.upperTick, tc.expectedPositionLiquidity) + s.validatePositionUpdate(s.Ctx, tc.poolId, s.TestAccs[tc.ownerIndex], tc.lowerTick, tc.upperTick, tc.frozenUntil, tc.expectedPositionLiquidity) s.validateTickUpdates(s.Ctx, tc.poolId, s.TestAccs[tc.ownerIndex], tc.lowerTick, tc.upperTick, tc.expectedTickLiquidity, cl.EmptyCoins, cl.EmptyCoins) // validate if pool liquidity has been updated properly @@ -917,7 +932,7 @@ func (s *KeeperTestSuite) TestInverseRelation_CreatePosition_WithdrawPosition() // If we want to test a non-first position, we create a first position with a separate account if tc.isNotFirstPosition { - s.SetupPosition(1, s.TestAccs[1], DefaultCoin0, DefaultCoin1, tc.lowerTick, tc.upperTick) + s.SetupPosition(1, s.TestAccs[1], DefaultCoin0, DefaultCoin1, tc.lowerTick, tc.upperTick, tc.frozenUntil) } // Fund test account and create the desired position @@ -928,9 +943,9 @@ func (s *KeeperTestSuite) TestInverseRelation_CreatePosition_WithdrawPosition() poolBalancePrePositionCreation := s.App.BankKeeper.GetAllBalances(s.Ctx, poolBefore.GetAddress()) // System under test. - amtDenom0CreatePosition, amtDenom1CreatePosition, liquidityCreated, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.amount0Desired, tc.amount1Desired, tc.amount0Minimum, tc.amount1Minimum, tc.lowerTick, tc.upperTick) + amtDenom0CreatePosition, amtDenom1CreatePosition, liquidityCreated, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.amount0Desired, tc.amount1Desired, tc.amount0Minimum, tc.amount1Minimum, tc.lowerTick, tc.upperTick, tc.frozenUntil) s.Require().NoError(err) - amtDenom0WithdrawPosition, amtDenom1WithdrawPosition, err := clKeeper.WithdrawPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, liquidityCreated) + amtDenom0WithdrawPosition, amtDenom1WithdrawPosition, err := clKeeper.WithdrawPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.frozenUntil, liquidityCreated) s.Require().NoError(err) // INVARIANTS @@ -946,7 +961,7 @@ func (s *KeeperTestSuite) TestInverseRelation_CreatePosition_WithdrawPosition() s.Require().Equal(poolBalancePrePositionCreation, poolBalancePostPositionCreation) // 3. Check that position was deleted - position, err := clKeeper.GetPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick) + position, err := clKeeper.GetPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.frozenUntil) s.Require().Error(err) s.Require().ErrorAs(err, &types.PositionNotFoundError{PoolId: tc.poolId, LowerTick: tc.lowerTick, UpperTick: tc.upperTick}) s.Require().Nil(position) diff --git a/x/concentrated-liquidity/model/position.pb.go b/x/concentrated-liquidity/model/position.pb.go index d123de5ffc0..213c46f9bc3 100644 --- a/x/concentrated-liquidity/model/position.pb.go +++ b/x/concentrated-liquidity/model/position.pb.go @@ -14,15 +14,19 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" + _ "github.com/gogo/protobuf/types" + github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" io "io" math "math" math_bits "math/bits" + time "time" ) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +var _ = time.Kitchen // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. @@ -31,7 +35,8 @@ var _ = math.Inf const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type Position struct { - Liquidity github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=liquidity,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"liquidity" yaml:"liquidity"` + Liquidity github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=liquidity,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"liquidity" yaml:"liquidity"` + FrozenUntil time.Time `protobuf:"bytes,2,opt,name=frozen_until,json=frozenUntil,proto3,stdtime" json:"frozen_until" yaml:"frozen_until"` } func (m *Position) Reset() { *m = Position{} } @@ -67,6 +72,13 @@ func (m *Position) XXX_DiscardUnknown() { var xxx_messageInfo_Position proto.InternalMessageInfo +func (m *Position) GetFrozenUntil() time.Time { + if m != nil { + return m.FrozenUntil + } + return time.Time{} +} + func init() { proto.RegisterType((*Position)(nil), "osmosis.concentratedliquidity.v1beta1.Position") } @@ -76,23 +88,28 @@ func init() { } var fileDescriptor_ffdfd7b30d37d326 = []byte{ - // 246 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0xcd, 0x2f, 0xce, 0xcd, - 0x2f, 0xce, 0x2c, 0xd6, 0x4f, 0xce, 0xcf, 0x4b, 0x4e, 0xcd, 0x2b, 0x29, 0x4a, 0x2c, 0x49, 0x4d, - 0xd1, 0xcd, 0xc9, 0x2c, 0x2c, 0xcd, 0x4c, 0xc9, 0x2c, 0xa9, 0xd4, 0x2f, 0xc8, 0x2f, 0xce, 0x2c, - 0xc9, 0xcc, 0xcf, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x52, 0x85, 0x2a, 0xd7, 0x43, 0x56, - 0x0e, 0x57, 0xad, 0x57, 0x66, 0x98, 0x94, 0x5a, 0x92, 0x68, 0x28, 0x25, 0x99, 0x0c, 0x56, 0x17, - 0x0f, 0xd6, 0xa4, 0x0f, 0xe1, 0x40, 0x4c, 0x90, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x87, 0x88, 0x83, - 0x58, 0x10, 0x51, 0xa5, 0x1c, 0x2e, 0x8e, 0x00, 0xa8, 0x4d, 0x42, 0x09, 0x5c, 0x9c, 0x70, 0x13, - 0x25, 0x18, 0x15, 0x18, 0x35, 0x38, 0x9d, 0x9c, 0x4e, 0xdc, 0x93, 0x67, 0xb8, 0x75, 0x4f, 0x5e, - 0x2d, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x17, 0x6a, 0x2a, 0x94, 0xd2, 0x2d, - 0x4e, 0xc9, 0xd6, 0x2f, 0xa9, 0x2c, 0x48, 0x2d, 0xd6, 0x73, 0x49, 0x4d, 0xfe, 0x74, 0x4f, 0x5e, - 0xa0, 0x32, 0x31, 0x37, 0xc7, 0x4a, 0x09, 0x6e, 0x90, 0x52, 0x10, 0xc2, 0x50, 0xa7, 0x98, 0x13, - 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, - 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, 0x63, 0x88, 0x72, 0x42, 0xb2, 0x00, 0xea, 0x55, 0xdd, - 0x9c, 0xc4, 0xa4, 0x62, 0x18, 0x47, 0xbf, 0xcc, 0xd0, 0x44, 0xbf, 0x02, 0x57, 0x60, 0xe5, 0xe6, - 0xa7, 0xa4, 0xe6, 0x24, 0xb1, 0x81, 0xbd, 0x64, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0xd2, 0x82, - 0xd1, 0xe5, 0x5b, 0x01, 0x00, 0x00, + // 329 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x91, 0xbf, 0x4e, 0xf3, 0x30, + 0x14, 0xc5, 0xe3, 0x6f, 0xf8, 0x44, 0x53, 0x06, 0x54, 0x18, 0x4a, 0x87, 0xb8, 0x8a, 0x04, 0xea, + 0x12, 0x5b, 0x05, 0x26, 0xc6, 0x88, 0x07, 0x40, 0x15, 0x2c, 0x08, 0x51, 0xf2, 0xc7, 0x0d, 0x16, + 0x71, 0x6e, 0xa8, 0x9d, 0x8a, 0xf2, 0x14, 0x7d, 0xac, 0x0e, 0x0c, 0x1d, 0x11, 0x43, 0x40, 0xed, + 0x1b, 0xf4, 0x09, 0x50, 0x63, 0xb7, 0x64, 0x61, 0x4a, 0xee, 0xd1, 0x39, 0xe7, 0xfe, 0x6c, 0xdb, + 0x1e, 0x48, 0x01, 0x92, 0x4b, 0x1a, 0x41, 0x16, 0xb1, 0x4c, 0x8d, 0x03, 0xc5, 0x62, 0x2f, 0xe5, + 0x2f, 0x05, 0x8f, 0xb9, 0x9a, 0xd2, 0x1c, 0x24, 0x57, 0x1c, 0x32, 0x92, 0x8f, 0x41, 0x41, 0xeb, + 0xc4, 0xd8, 0x49, 0xdd, 0xbe, 0x73, 0x93, 0x49, 0x3f, 0x64, 0x2a, 0xe8, 0x77, 0x8e, 0xa3, 0xca, + 0x37, 0xac, 0x42, 0x54, 0x0f, 0xba, 0xa1, 0x83, 0x13, 0x80, 0x24, 0x65, 0xb4, 0x9a, 0xc2, 0x62, + 0x44, 0x15, 0x17, 0x4c, 0xaa, 0x40, 0xe4, 0xc6, 0x70, 0x94, 0x40, 0x02, 0x3a, 0xb8, 0xf9, 0xd3, + 0xaa, 0xfb, 0x8e, 0xec, 0xbd, 0x6b, 0xc3, 0xd2, 0x7a, 0xb4, 0x1b, 0xbb, 0x9d, 0x6d, 0xd4, 0x45, + 0xbd, 0x86, 0xef, 0xcf, 0x4b, 0x6c, 0x7d, 0x96, 0xf8, 0x34, 0xe1, 0xea, 0xa9, 0x08, 0x49, 0x04, + 0xc2, 0xec, 0x35, 0x1f, 0x4f, 0xc6, 0xcf, 0x54, 0x4d, 0x73, 0x26, 0xc9, 0x15, 0x8b, 0xd6, 0x25, + 0x3e, 0x98, 0x06, 0x22, 0xbd, 0x74, 0x77, 0x45, 0xee, 0xe0, 0xb7, 0xb4, 0xf5, 0x60, 0xef, 0x8f, + 0xc6, 0xf0, 0xc6, 0xb2, 0x61, 0x91, 0x29, 0x9e, 0xb6, 0xff, 0x75, 0x51, 0xaf, 0x79, 0xd6, 0x21, + 0x1a, 0x9e, 0x6c, 0xe1, 0xc9, 0xcd, 0x16, 0xde, 0xc7, 0x1b, 0x80, 0x75, 0x89, 0x0f, 0x75, 0x6d, + 0x3d, 0xed, 0xce, 0xbe, 0x30, 0x1a, 0x34, 0xb5, 0x74, 0xbb, 0x51, 0xfc, 0xfb, 0xf9, 0xd2, 0x41, + 0x8b, 0xa5, 0x83, 0xbe, 0x97, 0x0e, 0x9a, 0xad, 0x1c, 0x6b, 0xb1, 0x72, 0xac, 0x8f, 0x95, 0x63, + 0xdd, 0xf9, 0xb5, 0x03, 0x98, 0xcb, 0xf6, 0xd2, 0x20, 0x94, 0xdb, 0x81, 0x4e, 0xfa, 0x17, 0xf4, + 0xf5, 0xaf, 0xe7, 0x12, 0x10, 0xb3, 0x34, 0xfc, 0x5f, 0xf1, 0x9d, 0xff, 0x04, 0x00, 0x00, 0xff, + 0xff, 0x3e, 0x46, 0xdd, 0xb2, 0xdd, 0x01, 0x00, 0x00, } func (m *Position) Marshal() (dAtA []byte, err error) { @@ -115,6 +132,14 @@ func (m *Position) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.FrozenUntil, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.FrozenUntil):]) + if err1 != nil { + return 0, err1 + } + i -= n1 + i = encodeVarintPosition(dAtA, i, uint64(n1)) + i-- + dAtA[i] = 0x12 { size := m.Liquidity.Size() i -= size @@ -147,6 +172,8 @@ func (m *Position) Size() (n int) { _ = l l = m.Liquidity.Size() n += 1 + l + sovPosition(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.FrozenUntil) + n += 1 + l + sovPosition(uint64(l)) return n } @@ -219,6 +246,39 @@ func (m *Position) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FrozenUntil", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPosition + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPosition + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPosition + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.FrozenUntil, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPosition(dAtA[iNdEx:]) diff --git a/x/concentrated-liquidity/msg_server.go b/x/concentrated-liquidity/msg_server.go index 1f2f05ec37e..c67bd370277 100644 --- a/x/concentrated-liquidity/msg_server.go +++ b/x/concentrated-liquidity/msg_server.go @@ -65,7 +65,7 @@ func (server msgServer) CreatePosition(goCtx context.Context, msg *types.MsgCrea return nil, err } - actualAmount0, actualAmount1, liquidityCreated, err := server.keeper.CreatePosition(ctx, msg.PoolId, sender, msg.TokenDesired0.Amount, msg.TokenDesired1.Amount, msg.TokenMinAmount0, msg.TokenMinAmount1, msg.LowerTick, msg.UpperTick) + actualAmount0, actualAmount1, liquidityCreated, err := server.keeper.CreatePosition(ctx, msg.PoolId, sender, msg.TokenDesired0.Amount, msg.TokenDesired1.Amount, msg.TokenMinAmount0, msg.TokenMinAmount1, msg.LowerTick, msg.UpperTick, msg.FrozenUntil) if err != nil { return nil, err } @@ -101,7 +101,7 @@ func (server msgServer) WithdrawPosition(goCtx context.Context, msg *types.MsgWi return nil, err } - amount0, amount1, err := server.keeper.WithdrawPosition(ctx, msg.PoolId, sender, msg.LowerTick, msg.UpperTick, msg.LiquidityAmount.ToDec()) + amount0, amount1, err := server.keeper.WithdrawPosition(ctx, msg.PoolId, sender, msg.LowerTick, msg.UpperTick, msg.FrozenUntil, msg.LiquidityAmount.ToDec()) if err != nil { return nil, err } diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 0978f88fdf2..41b6065ceb8 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -1,6 +1,8 @@ package concentrated_liquidity import ( + "time" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/osmosis-labs/osmosis/osmoutils" @@ -14,12 +16,13 @@ func (k Keeper) getOrInitPosition( poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, + frozenUntil time.Time, ) (*model.Position, error) { if !k.poolExists(ctx, poolId) { return nil, types.PoolNotFoundError{PoolId: poolId} } - if k.hasPosition(ctx, poolId, owner, lowerTick, upperTick) { - position, err := k.GetPosition(ctx, poolId, owner, lowerTick, upperTick) + if k.hasPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) { + position, err := k.GetPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) if err != nil { return nil, err } @@ -37,8 +40,9 @@ func (k Keeper) initOrUpdatePosition( owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, + frozenUntil time.Time, ) (err error) { - position, err := k.getOrInitPosition(ctx, poolId, owner, lowerTick, upperTick) + position, err := k.getOrInitPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) if err != nil { return err } @@ -54,23 +58,25 @@ func (k Keeper) initOrUpdatePosition( position.Liquidity = liquidityAfter + position.FrozenUntil = frozenUntil + // TODO: consider deleting position if liquidity becomes zero - k.setPosition(ctx, poolId, owner, lowerTick, upperTick, position) + k.setPosition(ctx, poolId, owner, lowerTick, upperTick, position, frozenUntil) return nil } -func (k Keeper) hasPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64) bool { +func (k Keeper) hasPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) bool { store := ctx.KVStore(k.storeKey) - key := types.KeyPosition(poolId, owner, lowerTick, upperTick) + key := types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil) return store.Has(key) } // GetPosition checks if a position exists at the provided upper and lower ticks for the given owner. Returns position if found. -func (k Keeper) GetPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64) (*model.Position, error) { +func (k Keeper) GetPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) (*model.Position, error) { store := ctx.KVStore(k.storeKey) positionStruct := &model.Position{} - key := types.KeyPosition(poolId, owner, lowerTick, upperTick) + key := types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil) found, err := osmoutils.Get(store, key, positionStruct) if err != nil { @@ -78,7 +84,7 @@ func (k Keeper) GetPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress } if !found { - return nil, types.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick} + return nil, types.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick, FrozenUntil: frozenUntil} } return positionStruct, nil @@ -89,9 +95,10 @@ func (k Keeper) setPosition(ctx sdk.Context, owner sdk.AccAddress, lowerTick, upperTick int64, position *model.Position, + frozenUntil time.Time, ) { store := ctx.KVStore(k.storeKey) - key := types.KeyPosition(poolId, owner, lowerTick, upperTick) + key := types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil) osmoutils.MustSet(store, key, position) } @@ -99,12 +106,13 @@ func (k Keeper) deletePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, + frozenUntil time.Time, ) error { store := ctx.KVStore(k.storeKey) - key := types.KeyPosition(poolId, owner, lowerTick, upperTick) + key := types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil) if !store.Has(key) { - return types.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick} + return types.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick, FrozenUntil: frozenUntil} } store.Delete(key) diff --git a/x/concentrated-liquidity/position_test.go b/x/concentrated-liquidity/position_test.go index c79743a17e0..18fc171ae64 100644 --- a/x/concentrated-liquidity/position_test.go +++ b/x/concentrated-liquidity/position_test.go @@ -1,6 +1,8 @@ package concentrated_liquidity_test import ( + "time" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" @@ -9,10 +11,12 @@ import ( func (s *KeeperTestSuite) TestInitOrUpdatePosition() { const validPoolId = 1 + defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) type param struct { poolId uint64 lowerTick int64 upperTick int64 + frozenUntil time.Time liquidityDelta sdk.Dec liquidityIn sdk.Dec } @@ -25,7 +29,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { expectedErr error }{ { - name: "Init position from -50 to 50 with DefaultLiquidityAmt liquidity", + name: "Init position from -50 to 50 with DefaultLiquidityAmt liquidity and no freeze duration", param: param{ poolId: validPoolId, lowerTick: -50, @@ -46,6 +50,18 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { positionExists: true, expectedLiquidity: DefaultLiquidityAmt.Add(DefaultLiquidityAmt), }, + { + name: "Update position from -50 to 50 that already contains DefaultLiquidityAmt liquidity with DefaultLiquidityAmt more liquidity, this time with an hour freeze duration", + param: param{ + poolId: validPoolId, + lowerTick: -50, + upperTick: 50, + frozenUntil: defaultFrozenUntil, + liquidityDelta: DefaultLiquidityAmt, + }, + positionExists: true, + expectedLiquidity: DefaultLiquidityAmt.Add(DefaultLiquidityAmt), + }, { name: "Init position for non-existing pool", param: param{ @@ -81,13 +97,13 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { // If positionExists set, initialize the specified position with defaultLiquidityAmt preexistingLiquidity := sdk.ZeroDec() if test.positionExists { - err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, test.param.poolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.liquidityDelta) + err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, test.param.poolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.liquidityDelta, test.param.frozenUntil) s.Require().NoError(err) preexistingLiquidity = DefaultLiquidityAmt } // Get the position info for poolId 1 - positionInfo, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, validPoolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick) + positionInfo, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, validPoolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.frozenUntil) if test.positionExists { // If we had a position before, ensure the position info displays proper liquidity s.Require().NoError(err) @@ -99,7 +115,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { } // System under test. Initialize or update the position according to the test case - err = s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, test.param.poolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.liquidityDelta) + err = s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, test.param.poolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.liquidityDelta, test.param.frozenUntil) if test.expectedErr != nil { s.Require().Error(err) s.Require().ErrorContains(err, test.expectedErr.Error()) @@ -108,7 +124,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { s.Require().NoError(err) // Get the tick info for poolId 1 - positionInfo, err = s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, validPoolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick) + positionInfo, err = s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, validPoolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.frozenUntil) s.Require().NoError(err) // Check that the initialized or updated position matches our expectation @@ -118,12 +134,14 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { } func (s *KeeperTestSuite) TestGetPosition() { + defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) tests := []struct { name string poolToGet uint64 ownerIndex uint64 lowerTick int64 upperTick int64 + frozenUntil time.Time expectedPosition *model.Position expectedErr error }{ @@ -132,7 +150,8 @@ func (s *KeeperTestSuite) TestGetPosition() { poolToGet: validPoolId, lowerTick: DefaultLowerTick, upperTick: DefaultUpperTick, - expectedPosition: &model.Position{Liquidity: DefaultLiquidityAmt}, + frozenUntil: defaultFrozenUntil, + expectedPosition: &model.Position{Liquidity: DefaultLiquidityAmt, FrozenUntil: defaultFrozenUntil}, }, { name: "Get position info on existing pool and existing position but wrong owner", @@ -140,21 +159,24 @@ func (s *KeeperTestSuite) TestGetPosition() { ownerIndex: 1, lowerTick: DefaultLowerTick, upperTick: DefaultUpperTick, - expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick}, + frozenUntil: defaultFrozenUntil, + expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick, FrozenUntil: defaultFrozenUntil}, }, { name: "Get position info on existing pool with no existing position", poolToGet: validPoolId, lowerTick: DefaultLowerTick - 1, upperTick: DefaultUpperTick + 1, - expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1}, + frozenUntil: defaultFrozenUntil, + expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1, FrozenUntil: defaultFrozenUntil}, }, { name: "Get position info on a non-existing pool with no existing position", poolToGet: 2, lowerTick: DefaultLowerTick - 1, upperTick: DefaultUpperTick + 1, - expectedErr: types.PositionNotFoundError{PoolId: 2, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1}, + frozenUntil: defaultFrozenUntil, + expectedErr: types.PositionNotFoundError{PoolId: 2, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1, FrozenUntil: defaultFrozenUntil}, }, } @@ -167,10 +189,10 @@ func (s *KeeperTestSuite) TestGetPosition() { s.PrepareConcentratedPool() // Set up a default initialized position - err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, validPoolId, s.TestAccs[0], DefaultLowerTick, DefaultUpperTick, DefaultLiquidityAmt) + err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, validPoolId, s.TestAccs[0], DefaultLowerTick, DefaultUpperTick, DefaultLiquidityAmt, defaultFrozenUntil) // System under test - position, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, test.poolToGet, s.TestAccs[test.ownerIndex], test.lowerTick, test.upperTick) + position, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, test.poolToGet, s.TestAccs[test.ownerIndex], test.lowerTick, test.upperTick, test.frozenUntil) if test.expectedErr != nil { s.Require().Error(err) s.Require().ErrorIs(err, test.expectedErr) @@ -185,19 +207,22 @@ func (s *KeeperTestSuite) TestGetPosition() { } func (s *KeeperTestSuite) TestDeletePosition() { + defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) tests := []struct { name string poolToGet uint64 ownerIndex uint64 lowerTick int64 upperTick int64 + frozenUntil time.Time expectedErr error }{ { - name: "Delete position info on existing pool and existing position", - poolToGet: validPoolId, - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick, + name: "Delete position info on existing pool and existing position", + poolToGet: validPoolId, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick, + frozenUntil: defaultFrozenUntil, }, { name: "Delete position on existing pool and existing position but wrong owner", @@ -205,21 +230,24 @@ func (s *KeeperTestSuite) TestDeletePosition() { ownerIndex: 1, lowerTick: DefaultLowerTick, upperTick: DefaultUpperTick, - expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick}, + frozenUntil: defaultFrozenUntil, + expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick, FrozenUntil: defaultFrozenUntil}, }, { name: "Delete position on existing pool with no existing position", poolToGet: validPoolId, lowerTick: DefaultLowerTick - 1, upperTick: DefaultUpperTick + 1, - expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1}, + frozenUntil: defaultFrozenUntil, + expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1, FrozenUntil: defaultFrozenUntil}, }, { name: "Delete position on a non-existing pool with no existing position", poolToGet: 2, lowerTick: DefaultLowerTick - 1, upperTick: DefaultUpperTick + 1, - expectedErr: types.PositionNotFoundError{PoolId: 2, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1}, + frozenUntil: defaultFrozenUntil, + expectedErr: types.PositionNotFoundError{PoolId: 2, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1, FrozenUntil: defaultFrozenUntil}, }, } @@ -232,10 +260,10 @@ func (s *KeeperTestSuite) TestDeletePosition() { s.PrepareConcentratedPool() // Set up a default initialized position - err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, validPoolId, s.TestAccs[0], DefaultLowerTick, DefaultUpperTick, DefaultLiquidityAmt) + err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, validPoolId, s.TestAccs[0], DefaultLowerTick, DefaultUpperTick, DefaultLiquidityAmt, defaultFrozenUntil) s.Require().NoError(err) - err = s.App.ConcentratedLiquidityKeeper.DeletePosition(s.Ctx, test.poolToGet, s.TestAccs[test.ownerIndex], test.lowerTick, test.upperTick) + err = s.App.ConcentratedLiquidityKeeper.DeletePosition(s.Ctx, test.poolToGet, s.TestAccs[test.ownerIndex], test.lowerTick, test.upperTick, test.frozenUntil) if test.expectedErr != nil { s.Require().Error(err) s.Require().ErrorIs(err, test.expectedErr) @@ -243,9 +271,9 @@ func (s *KeeperTestSuite) TestDeletePosition() { s.Require().NoError(err) // Since the position is deleted, retrieving it should return an error. - position, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, test.poolToGet, s.TestAccs[test.ownerIndex], test.lowerTick, test.upperTick) + position, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, test.poolToGet, s.TestAccs[test.ownerIndex], test.lowerTick, test.upperTick, test.frozenUntil) s.Require().Error(err) - s.Require().ErrorIs(err, types.PositionNotFoundError{PoolId: test.poolToGet, LowerTick: test.lowerTick, UpperTick: test.upperTick}) + s.Require().ErrorIs(err, types.PositionNotFoundError{PoolId: test.poolToGet, LowerTick: test.lowerTick, UpperTick: test.upperTick, FrozenUntil: test.frozenUntil}) s.Require().Nil(position) } }) diff --git a/x/concentrated-liquidity/store.go b/x/concentrated-liquidity/store.go new file mode 100644 index 00000000000..cca2efc6af2 --- /dev/null +++ b/x/concentrated-liquidity/store.go @@ -0,0 +1,72 @@ +package concentrated_liquidity + +import ( + "errors" + "fmt" + + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/address" + "github.com/gogo/protobuf/proto" + + "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" + "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" +) + +// // getAllPositionsWithVaryingFreezeTimes returns multiple positions indexed by poolId, addr, lowerTick, upperTick with varying freeze times. +// func (k Keeper) getAllPositionsWithVaryingFreezeTimes(ctx sdk.Context, poolId uint64, addr sdk.AccAddress, lowerTick, upperTick int64) ([]model.Position, error) { +// return osmoutils.GatherValuesFromStorePrefix(ctx.KVStore(k.storeKey), types.PositionPrefix, ParsePositionFromBz) +// } + +// getAllPositionsWithVaryingFreezeTimes returns multiple positions indexed by poolId, addr, lowerTick, upperTick with varying freeze times. +func (k Keeper) getAllPositionsWithVaryingFreezeTimes(ctx sdk.Context, poolId uint64, addr sdk.AccAddress, lowerTick, upperTick int64) ([]model.Position, error) { + var key []byte + // key = append(key, types.PositionPrefix...) + // key = append(key, sdk.Uint64ToBigEndian(poolId)...) + //key = []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d%s%s", types.PositionPrefix, types.KeySeparator, addrKey, KeySeparator, poolId, KeySeparator, lowerTick, KeySeparator, upperTick, KeySeparator, frozenUntilKey)) + addrKey := address.MustLengthPrefix(addr.Bytes()) + //key = []byte(fmt.Sprintf("%s%s", types.PositionPrefix, types.KeySeparator)) + key = []byte(fmt.Sprintf("%s%s%s%s", types.PositionPrefix, types.KeySeparator, addrKey, types.KeySeparator)) + // positions, err := osmoutils.GatherValuesFromStorePrefix(ctx.KVStore(k.storeKey), key, ParsePositionFromBz) + // if err != nil { + // return nil, err + // } + // var filteredPositions []model.Position + // for _, position := range positions { + // if position.Owner.Equals(addr) && position.LowerTick == lowerTick && position.UpperTick == upperTick { + // filteredPositions = append(filteredPositions, position) + // } + // } + store := ctx.KVStore(k.storeKey) + prefixBz := key + prefixStore := prefix.NewStore(store, prefixBz) + + var positions []model.Position + + iter := prefixStore.ReverseIterator(key, nil) + defer iter.Close() + for ; iter.Valid(); iter.Next() { + // Since, we constructed our prefix store with , the + // key is the encoding of a tick index. + fmt.Printf("iter.Key(): %v \n", iter.Key()) + fmt.Printf("iter.Value(): %v \n", iter.Value()) + position, err := ParsePositionFromBz(iter.Value()) + if err != nil { + return nil, err + } + positions = append(positions, position) + + } + + //return osmoutils.GatherValuesFromStorePrefix(ctx.KVStore(k.storeKey), key, ParsePositionFromBz) + return positions, nil +} + +func ParsePositionFromBz(bz []byte) (position model.Position, err error) { + fmt.Printf("bz: %v \n", bz) + if len(bz) == 0 { + return model.Position{}, errors.New("position not found") + } + err = proto.Unmarshal(bz, &position) + return position, err +} diff --git a/x/concentrated-liquidity/store_test.go b/x/concentrated-liquidity/store_test.go new file mode 100644 index 00000000000..b1da4573603 --- /dev/null +++ b/x/concentrated-liquidity/store_test.go @@ -0,0 +1,63 @@ +package concentrated_liquidity_test + +import ( + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" +) + +func (s *KeeperTestSuite) TestGetAllPositionsWithVaryingFreezeTimes() { + defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + address := s.TestAccs[0] + type position struct { + poolId uint64 + acc sdk.AccAddress + coin0 sdk.Coin + coin1 sdk.Coin + lowerTick int64 + upperTick int64 + frozenUntil time.Time + } + + tests := map[string]struct { + positions []position + }{ + // "no positions": { + // positions: []position{}, + // }, + "one position": { + positions: []position{ + {1, address, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil}, + {1, address, DefaultCoin0, DefaultCoin1, DefaultLowerTick - 1, DefaultUpperTick + 1, defaultFrozenUntil}, + }, + }, + // "multiple positions": { + // positions: []position{ + // {1, s.TestAccs[0], DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour)}, + // {1, s.TestAccs[0], DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 2)}, + // {1, s.TestAccs[0], DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 3)}, + // }, + // }, + } + for name, tc := range tests { + s.Run(name, func() { + // Setup. + s.SetupTest() + ctx := s.Ctx + s.PrepareConcentratedPool() + expectedPositions := []model.Position{} + for _, pos := range tc.positions { + expectedPositions = append(expectedPositions, s.SetupPosition(pos.poolId, pos.acc, pos.coin0, pos.coin1, pos.lowerTick, pos.upperTick, pos.frozenUntil)) + } + + // System under test. + actualPositions, err := s.App.ConcentratedLiquidityKeeper.GetAllPositionsWithVaryingFreezeTimes(ctx, 1, address, DefaultLowerTick, DefaultUpperTick) + s.NoError(err) + + // Assertions. + s.Equal(expectedPositions, actualPositions) + }) + } +} diff --git a/x/concentrated-liquidity/swaps_test.go b/x/concentrated-liquidity/swaps_test.go index f2f6d575173..2c7ddfab071 100644 --- a/x/concentrated-liquidity/swaps_test.go +++ b/x/concentrated-liquidity/swaps_test.go @@ -437,7 +437,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapOutAmtGivenIn() { feeAccum.AddToAccumulator(DefaultFeeAccumCoins) // add default position - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) // add second position depending on the test @@ -447,7 +447,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapOutAmtGivenIn() { newUpperTick, err := math.PriceToTick(test.secondPositionUpperPrice, DefaultExponentAtPriceOne) s.Require().NoError(err) - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64()) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) } @@ -613,7 +613,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { "single position within one tick: usdc -> eth": { addPositions: func(ctx sdk.Context, poolId uint64) { // add first position - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) }, tokenOut: sdk.NewCoin("usdc", sdk.NewInt(42000000)), @@ -628,7 +628,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { "single position within one tick: eth -> usdc": { addPositions: func(ctx sdk.Context, poolId uint64) { // add first position - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) }, tokenOut: sdk.NewCoin("eth", sdk.NewInt(13370)), @@ -648,11 +648,11 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { "two positions within one tick: usdc -> eth": { addPositions: func(ctx sdk.Context, poolId uint64) { // add first position - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) // add second position - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) }, tokenOut: sdk.NewCoin("usdc", sdk.NewInt(42000000)), @@ -670,11 +670,11 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { "two positions within one tick: eth -> usdc": { addPositions: func(ctx sdk.Context, poolId uint64) { // add first position - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) // add second position - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) }, tokenOut: sdk.NewCoin("eth", sdk.NewInt(13370)), @@ -698,7 +698,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { "two positions with consecutive price ranges: usdc -> eth": { addPositions: func(ctx sdk.Context, poolId uint64) { // add first position - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) // create second position parameters @@ -710,7 +710,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { s.Require().NoError(err) // add position two with the new price range above - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64()) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) }, tokenOut: sdk.NewCoin("usdc", sdk.NewInt(10000000000)), @@ -735,7 +735,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { "two positions with consecutive price ranges: eth -> usdc": { addPositions: func(ctx sdk.Context, poolId uint64) { // add first position - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) // create second position parameters @@ -747,7 +747,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { s.Require().NoError(err) // add position two with the new price range above - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64()) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) }, tokenOut: sdk.NewCoin("eth", sdk.NewInt(2000000)), @@ -774,7 +774,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { "two positions with partially overlapping price ranges: usdc -> eth": { addPositions: func(ctx sdk.Context, poolId uint64) { // add first position - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) // create second position parameters @@ -786,7 +786,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { s.Require().NoError(err) // add position two with the new price range above - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64()) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) }, tokenOut: sdk.NewCoin("usdc", sdk.NewInt(10000000000)), @@ -805,7 +805,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { "two positions with partially overlapping price ranges, not utilizing full liquidity of second position: usdc -> eth": { addPositions: func(ctx sdk.Context, poolId uint64) { // add first position - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) // create second position parameters @@ -817,7 +817,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { s.Require().NoError(err) // add position two with the new price range above - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64()) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) }, tokenOut: sdk.NewCoin("usdc", sdk.NewInt(8500000000)), @@ -842,7 +842,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { "two positions with partially overlapping price ranges: eth -> usdc": { addPositions: func(ctx sdk.Context, poolId uint64) { // add first position - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) // create second position parameters @@ -854,7 +854,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { s.Require().NoError(err) // add position two with the new price range above - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64()) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) }, tokenOut: sdk.NewCoin("eth", sdk.NewInt(2000000)), @@ -875,7 +875,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { "two positions with partially overlapping price ranges, not utilizing full liquidity of second position: eth -> usdc": { addPositions: func(ctx sdk.Context, poolId uint64) { // add first position - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) // create second position parameters @@ -887,7 +887,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { s.Require().NoError(err) // add position two with the new price range above - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64()) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) }, tokenOut: sdk.NewCoin("eth", sdk.NewInt(1800000)), @@ -914,7 +914,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { "two sequential positions with a gap": { addPositions: func(ctx sdk.Context, poolId uint64) { // add first position - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) // create second position parameters @@ -926,7 +926,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { s.Require().NoError(err) // add position two with the new price range above - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64()) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) }, tokenOut: sdk.NewCoin("usdc", sdk.NewInt(10000000000)), @@ -946,7 +946,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { "single position within one tick, trade completes but slippage protection interrupts trade early: eth -> usdc": { addPositions: func(ctx sdk.Context, poolId uint64) { // add position - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) }, tokenOut: sdk.NewCoin("eth", sdk.NewInt(13370)), @@ -961,7 +961,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { "single position within one tick, trade does not complete due to lack of liquidity: usdc -> eth": { addPositions: func(ctx sdk.Context, poolId uint64) { // add first position - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) }, tokenOut: sdk.NewCoin("usdc", sdk.NewInt(5300000000)), @@ -972,7 +972,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { "single position within one tick, trade does not complete due to lack of liquidity: eth -> usdc": { addPositions: func(ctx sdk.Context, poolId uint64) { // add first position - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(ctx, poolId, s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) }, tokenOut: sdk.NewCoin("eth", sdk.NewInt(1100000)), @@ -1454,7 +1454,7 @@ func (s *KeeperTestSuite) TestInverseRelationshipSwapOutAmtGivenIn() { newUpperTick, err := math.PriceToTick(test.secondPositionUpperPrice, DefaultExponentAtPriceOne) s.Require().NoError(err) - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64()) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) s.Require().NoError(err) } diff --git a/x/concentrated-liquidity/tick_test.go b/x/concentrated-liquidity/tick_test.go index 7a0f9feb032..fed272dccf6 100644 --- a/x/concentrated-liquidity/tick_test.go +++ b/x/concentrated-liquidity/tick_test.go @@ -392,7 +392,7 @@ func (s *KeeperTestSuite) TestCrossTick() { if test.poolToGet == validPoolId { s.FundAcc(s.TestAccs[0], sdk.NewCoins(sdk.NewCoin("ETH", sdk.NewInt(10000000000000)), sdk.NewCoin("USDC", sdk.NewInt(1000000000000)))) - s.SetupPosition(test.poolToGet, s.TestAccs[0], DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick) + s.SetupPosition(test.poolToGet, s.TestAccs[0], DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) } // Charge fee to make sure that the global fee accumulator is always updated. diff --git a/x/concentrated-liquidity/types/errors.go b/x/concentrated-liquidity/types/errors.go index b8f2a17de1f..688382871b8 100644 --- a/x/concentrated-liquidity/types/errors.go +++ b/x/concentrated-liquidity/types/errors.go @@ -2,6 +2,7 @@ package types import ( fmt "fmt" + "time" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -25,13 +26,14 @@ func (e NotPositiveRequireAmountError) Error() string { } type PositionNotFoundError struct { - PoolId uint64 - LowerTick int64 - UpperTick int64 + PoolId uint64 + LowerTick int64 + UpperTick int64 + FrozenUntil time.Time } func (e PositionNotFoundError) Error() string { - return fmt.Sprintf("position not found. pool id (%d), lower tick (%d), upper tick (%d)", e.PoolId, e.LowerTick, e.UpperTick) + return fmt.Sprintf("position not found. pool id (%d), lower tick (%d), upper tick (%d), frozen until (%s)", e.PoolId, e.LowerTick, e.UpperTick, e.FrozenUntil) } type PoolNotFoundError struct { diff --git a/x/concentrated-liquidity/types/keys.go b/x/concentrated-liquidity/types/keys.go index c02a3169179..417d55dafb7 100644 --- a/x/concentrated-liquidity/types/keys.go +++ b/x/concentrated-liquidity/types/keys.go @@ -2,16 +2,20 @@ package types import ( "fmt" + "time" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/address" + + "github.com/osmosis-labs/osmosis/osmoutils" ) const ( ModuleName = "concentratedliquidity" RouterKey = ModuleName - StoreKey = ModuleName + StoreKey = ModuleName + KeySeparator = "|" ) // Key prefixes @@ -62,14 +66,35 @@ func KeyTickPrefix(poolId uint64) []byte { return key } +// KeyFullPosition uses pool Id, owner, lower tick, upper tick, and frozenUntil for keys +func KeyFullPosition(poolId uint64, addr sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) []byte { + frozenUntilKey := osmoutils.FormatTimeString(frozenUntil) + //addrKey := address.MustLengthPrefix(addr.Bytes()) + // var key []byte + // key = append(key, PositionPrefix...) + // key = append(key, sdk.Uint64ToBigEndian(poolId)...) + // key = append(key, addr.Bytes()...) + // key = append(key, sdk.Uint64ToBigEndian(uint64(lowerTick))...) + // key = append(key, sdk.Uint64ToBigEndian(uint64(upperTick))...) + // key = append(key, frozenUntilKey...) + // return key + // frozenUntilKey := osmoutils.FormatTimeString(frozenUntil) + addrKey := address.MustLengthPrefix(addr.Bytes()) + return []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d%s%s", PositionPrefix, KeySeparator, addrKey, KeySeparator, poolId, KeySeparator, lowerTick, KeySeparator, upperTick, KeySeparator, frozenUntilKey)) +} + // KeyPosition uses pool Id, owner, lower tick and upper tick for keys func KeyPosition(poolId uint64, addr sdk.AccAddress, lowerTick, upperTick int64) []byte { - var key []byte - key = append(key, PositionPrefix...) - key = append(key, address.MustLengthPrefix(addr)...) - key = append(key, sdk.Uint64ToBigEndian(uint64(lowerTick))...) - key = append(key, sdk.Uint64ToBigEndian(uint64(upperTick))...) - return key + //addrKey := address.MustLengthPrefix(addr.Bytes()) + // var key []byte + // key = append(key, PositionPrefix...) + // key = append(key, sdk.Uint64ToBigEndian(poolId)...) + // key = append(key, addr.Bytes()...) + // key = append(key, sdk.Uint64ToBigEndian(uint64(lowerTick))...) + // key = append(key, sdk.Uint64ToBigEndian(uint64(upperTick))...) + // return key + addrKey := address.MustLengthPrefix(addr.Bytes()) + return []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d", PositionPrefix, KeySeparator, addrKey, KeySeparator, poolId, KeySeparator, lowerTick, KeySeparator, upperTick)) } func KeyPool(poolId uint64) []byte { diff --git a/x/concentrated-liquidity/types/tx.pb.go b/x/concentrated-liquidity/types/tx.pb.go index 929a9d84b0e..ccb8b3a64be 100644 --- a/x/concentrated-liquidity/types/tx.pb.go +++ b/x/concentrated-liquidity/types/tx.pb.go @@ -11,18 +11,22 @@ import ( _ "github.com/gogo/protobuf/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" + _ "github.com/gogo/protobuf/types" + github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" io "io" math "math" math_bits "math/bits" + time "time" ) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +var _ = time.Kitchen // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. @@ -40,6 +44,7 @@ type MsgCreatePosition struct { TokenDesired1 types.Coin `protobuf:"bytes,6,opt,name=token_desired1,json=tokenDesired1,proto3" json:"token_desired1" yaml:"token_desired1"` TokenMinAmount0 github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,7,opt,name=token_min_amount0,json=tokenMinAmount0,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"token_min_amount0" yaml:"token_min_amount0"` TokenMinAmount1 github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,8,opt,name=token_min_amount1,json=tokenMinAmount1,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"token_min_amount1" yaml:"token_min_amount1"` + FrozenUntil time.Time `protobuf:"bytes,9,opt,name=frozen_until,json=frozenUntil,proto3,stdtime" json:"frozen_until" yaml:"frozen_until"` } func (m *MsgCreatePosition) Reset() { *m = MsgCreatePosition{} } @@ -117,6 +122,13 @@ func (m *MsgCreatePosition) GetTokenDesired1() types.Coin { return types.Coin{} } +func (m *MsgCreatePosition) GetFrozenUntil() time.Time { + if m != nil { + return m.FrozenUntil + } + return time.Time{} +} + type MsgCreatePositionResponse struct { Amount0 github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=amount0,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"amount0" yaml:"amount0"` Amount1 github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=amount1,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"amount1" yaml:"amount1"` @@ -163,6 +175,7 @@ type MsgWithdrawPosition struct { LowerTick int64 `protobuf:"varint,3,opt,name=lower_tick,json=lowerTick,proto3" json:"lower_tick,omitempty" yaml:"lower_tick"` UpperTick int64 `protobuf:"varint,4,opt,name=upper_tick,json=upperTick,proto3" json:"upper_tick,omitempty" yaml:"upper_tick"` LiquidityAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,5,opt,name=liquidity_amount,json=liquidityAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"liquidity_amount" yaml:"liquidity_amount"` + FrozenUntil time.Time `protobuf:"bytes,6,opt,name=frozen_until,json=frozenUntil,proto3,stdtime" json:"frozen_until" yaml:"frozen_until"` } func (m *MsgWithdrawPosition) Reset() { *m = MsgWithdrawPosition{} } @@ -226,6 +239,13 @@ func (m *MsgWithdrawPosition) GetUpperTick() int64 { return 0 } +func (m *MsgWithdrawPosition) GetFrozenUntil() time.Time { + if m != nil { + return m.FrozenUntil + } + return time.Time{} +} + type MsgWithdrawPositionResponse struct { Amount0 github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=amount0,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"amount0" yaml:"amount0"` Amount1 github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=amount1,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"amount1" yaml:"amount1"` @@ -391,52 +411,57 @@ func init() { } var fileDescriptor_1f1fff802923d7db = []byte{ - // 720 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x56, 0xdf, 0x6a, 0xd4, 0x4e, - 0x14, 0xde, 0xe9, 0xb6, 0xdb, 0xee, 0x94, 0x6e, 0xbb, 0xf9, 0xfd, 0xaa, 0xe9, 0x8a, 0x9b, 0x65, - 0x40, 0x5d, 0x91, 0x26, 0x4d, 0xad, 0x20, 0x05, 0xa1, 0xa6, 0x22, 0x54, 0x58, 0x2c, 0x41, 0x10, - 0x8a, 0xb0, 0x64, 0x93, 0x61, 0x3b, 0x6e, 0x36, 0xb3, 0x66, 0x26, 0xfd, 0x73, 0xed, 0x95, 0xe0, - 0x85, 0xf8, 0x22, 0xbe, 0x46, 0x2f, 0x04, 0x7b, 0xa1, 0x20, 0x5e, 0x04, 0x69, 0xdf, 0x60, 0x9f, - 0x40, 0x92, 0xcc, 0x66, 0xb7, 0xbb, 0x55, 0xfa, 0xc7, 0x1b, 0x7b, 0x95, 0x99, 0x33, 0xe7, 0xfb, - 0xce, 0x9c, 0x2f, 0xe7, 0x9c, 0x04, 0xde, 0xa1, 0xac, 0x4d, 0x19, 0x61, 0x9a, 0x4d, 0x3d, 0x1b, - 0x7b, 0xdc, 0xb7, 0x38, 0x76, 0x16, 0x5d, 0xf2, 0x26, 0x20, 0x0e, 0xe1, 0xfb, 0x1a, 0xdf, 0x53, - 0x3b, 0x3e, 0xe5, 0x54, 0xba, 0x25, 0x1c, 0xd5, 0x41, 0xc7, 0xd4, 0x4f, 0xdd, 0xd1, 0x1b, 0x98, - 0x5b, 0x7a, 0xe9, 0xff, 0x26, 0x6d, 0xd2, 0x18, 0xa1, 0x45, 0xab, 0x04, 0x5c, 0x2a, 0xdb, 0x31, - 0x5a, 0x6b, 0x58, 0x0c, 0x6b, 0xc2, 0x55, 0xb3, 0x29, 0xf1, 0x92, 0x73, 0xf4, 0x6e, 0x02, 0x16, - 0x6b, 0xac, 0xb9, 0xee, 0x63, 0x8b, 0xe3, 0x4d, 0xca, 0x08, 0x27, 0xd4, 0x93, 0xee, 0xc1, 0xc9, - 0x0e, 0xa5, 0x6e, 0x9d, 0x38, 0x32, 0xa8, 0x80, 0xea, 0xb8, 0x21, 0x75, 0x43, 0xa5, 0xb0, 0x6f, - 0xb5, 0xdd, 0x55, 0x24, 0x0e, 0x90, 0x99, 0x8b, 0x56, 0x1b, 0x8e, 0x74, 0x17, 0xe6, 0x18, 0xf6, - 0x1c, 0xec, 0xcb, 0x63, 0x15, 0x50, 0xcd, 0x1b, 0xc5, 0x6e, 0xa8, 0xcc, 0x24, 0xbe, 0x89, 0x1d, - 0x99, 0xc2, 0x41, 0x5a, 0x81, 0xd0, 0xa5, 0xbb, 0xd8, 0xaf, 0x73, 0x62, 0xb7, 0xe4, 0x6c, 0x05, - 0x54, 0xb3, 0xc6, 0x7c, 0x37, 0x54, 0x8a, 0x89, 0x7b, 0xff, 0x0c, 0x99, 0xf9, 0x78, 0xf3, 0x82, - 0xd8, 0xad, 0x08, 0x15, 0x74, 0x3a, 0x3d, 0xd4, 0xf8, 0x30, 0xaa, 0x7f, 0x86, 0xcc, 0x7c, 0xbc, - 0x89, 0x51, 0x75, 0x58, 0xe0, 0xb4, 0x85, 0xbd, 0xba, 0x83, 0x19, 0xf1, 0xb1, 0xb3, 0x24, 0x4f, - 0x54, 0x40, 0x75, 0x7a, 0x79, 0x41, 0x4d, 0x24, 0x51, 0x23, 0x49, 0x7a, 0xea, 0xa9, 0xeb, 0x94, - 0x78, 0xc6, 0xcd, 0x83, 0x50, 0xc9, 0x74, 0x43, 0x65, 0x3e, 0x21, 0x3e, 0x09, 0x47, 0xe6, 0x4c, - 0x6c, 0x78, 0x22, 0xf6, 0x23, 0x01, 0x74, 0x39, 0x77, 0x99, 0x00, 0xfa, 0x50, 0x00, 0x5d, 0xda, - 0x81, 0xc5, 0xc4, 0xa3, 0x4d, 0xbc, 0xba, 0xd5, 0xa6, 0x81, 0xc7, 0x97, 0xe4, 0xc9, 0x58, 0xe3, - 0x67, 0x11, 0xd1, 0x8f, 0x50, 0xb9, 0xdd, 0x24, 0x7c, 0x3b, 0x68, 0xa8, 0x36, 0x6d, 0x6b, 0xe2, - 0x4d, 0x27, 0x8f, 0x45, 0xe6, 0xb4, 0x34, 0xbe, 0xdf, 0xc1, 0x4c, 0xdd, 0xf0, 0x78, 0x37, 0x54, - 0xe4, 0xc1, 0x90, 0x03, 0x84, 0xc8, 0x9c, 0x8d, 0x6d, 0x35, 0xe2, 0x3d, 0x4e, 0x2c, 0xa7, 0xc5, - 0xd5, 0xe5, 0xa9, 0xbf, 0x1b, 0x57, 0x1f, 0x89, 0xab, 0xa3, 0xcf, 0x63, 0x70, 0x61, 0xa4, 0x16, - 0x4d, 0xcc, 0x3a, 0xd4, 0x63, 0x58, 0xda, 0x82, 0x93, 0x3d, 0x0d, 0x40, 0x7c, 0x97, 0xb5, 0x73, - 0xdf, 0x45, 0x54, 0x70, 0x9a, 0x79, 0x8f, 0xb0, 0xcf, 0xad, 0x8b, 0x1a, 0xbe, 0x24, 0xb7, 0x9e, - 0x72, 0xeb, 0xd2, 0x2e, 0x2c, 0xa6, 0xcd, 0x5a, 0xb7, 0xe3, 0xdc, 0x9c, 0xb8, 0x14, 0x2f, 0xa1, - 0xe6, 0x08, 0x21, 0x32, 0xe7, 0x52, 0xdb, 0xba, 0x30, 0x7d, 0x19, 0x83, 0xff, 0xd5, 0x58, 0xf3, - 0x25, 0xe1, 0xdb, 0x8e, 0x6f, 0xed, 0x5e, 0xa9, 0xe6, 0xe6, 0xb0, 0x9f, 0xaf, 0xa8, 0x28, 0xa1, - 0xe9, 0xc6, 0xb9, 0x35, 0xbd, 0x3e, 0xac, 0x69, 0xc2, 0x87, 0xcc, 0xd9, 0xd4, 0x94, 0x54, 0x28, - 0xfa, 0x06, 0xe0, 0x8d, 0x53, 0x14, 0xfd, 0xd7, 0x4b, 0x14, 0x7d, 0x05, 0xb0, 0x10, 0x35, 0x1e, - 0x75, 0x5d, 0x6c, 0xf3, 0xa7, 0x18, 0xb3, 0xab, 0x50, 0x24, 0xe8, 0x35, 0xbc, 0x76, 0x32, 0xab, - 0xf4, 0x45, 0x6d, 0xc2, 0x7c, 0x32, 0x90, 0x68, 0xc0, 0x65, 0x50, 0xc9, 0xfe, 0x79, 0x6a, 0xcb, - 0x62, 0x6a, 0xcf, 0x0d, 0x8e, 0x32, 0x1a, 0x70, 0x64, 0x4e, 0xc5, 0xeb, 0xe7, 0x01, 0x5f, 0xfe, - 0x94, 0x85, 0xd9, 0x1a, 0x6b, 0x4a, 0xef, 0x01, 0x2c, 0x0c, 0x7d, 0x4c, 0x1f, 0xaa, 0x67, 0xfa, - 0x80, 0xab, 0x23, 0xa3, 0xaf, 0xb4, 0x76, 0x51, 0x64, 0x9a, 0xe8, 0x47, 0x00, 0xe7, 0x46, 0x06, - 0xc0, 0xea, 0xd9, 0x69, 0x87, 0xb1, 0x25, 0xe3, 0xe2, 0xd8, 0xf4, 0x52, 0x6f, 0x01, 0x9c, 0x1e, - 0xac, 0xb5, 0x07, 0xe7, 0x48, 0xb3, 0x0f, 0x2b, 0x3d, 0xba, 0x10, 0xac, 0x77, 0x0b, 0xe3, 0xd5, - 0xc1, 0x51, 0x19, 0x1c, 0x1e, 0x95, 0xc1, 0xcf, 0xa3, 0x32, 0xf8, 0x70, 0x5c, 0xce, 0x1c, 0x1e, - 0x97, 0x33, 0xdf, 0x8f, 0xcb, 0x99, 0x2d, 0x63, 0xa0, 0xa3, 0x44, 0x88, 0x45, 0xd7, 0x6a, 0xb0, - 0xde, 0x46, 0xdb, 0xd1, 0x57, 0xb4, 0xbd, 0xdf, 0xfe, 0xb7, 0x45, 0x1d, 0xd7, 0xc8, 0xc5, 0xbf, - 0x57, 0xf7, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x11, 0x88, 0x44, 0xd2, 0xe6, 0x09, 0x00, 0x00, + // 795 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x56, 0x4f, 0x4f, 0xe3, 0x46, + 0x14, 0xcf, 0x10, 0x08, 0x64, 0x28, 0x81, 0x98, 0xd2, 0x9a, 0x54, 0x8d, 0x23, 0x4b, 0x6d, 0x53, + 0x55, 0xd8, 0x98, 0x52, 0xa9, 0x42, 0xaa, 0x44, 0x4d, 0x55, 0x89, 0x4a, 0x51, 0x91, 0x45, 0x55, + 0x09, 0x55, 0x8d, 0x1c, 0x7b, 0x30, 0xb3, 0x71, 0x3c, 0x59, 0xcf, 0x98, 0x3f, 0x7b, 0xdd, 0xeb, + 0x1e, 0xd0, 0x7e, 0x11, 0xbe, 0x06, 0x87, 0x3d, 0x70, 0xd8, 0x95, 0x56, 0x7b, 0xc8, 0xae, 0xe0, + 0xb4, 0xd7, 0x7c, 0x82, 0x55, 0x66, 0x6c, 0x27, 0x24, 0xec, 0x8a, 0x7f, 0x97, 0xe5, 0x94, 0x99, + 0x37, 0xef, 0xf7, 0x7b, 0x7e, 0xbf, 0x79, 0xef, 0x65, 0xe0, 0x0f, 0x84, 0xb6, 0x08, 0xc5, 0x54, + 0x77, 0x48, 0xe0, 0xa0, 0x80, 0x85, 0x36, 0x43, 0xee, 0x92, 0x8f, 0x1f, 0x47, 0xd8, 0xc5, 0xec, + 0x48, 0x67, 0x87, 0x5a, 0x3b, 0x24, 0x8c, 0x48, 0xdf, 0xc5, 0x8e, 0xda, 0xa0, 0x63, 0xea, 0xa7, + 0xed, 0x1b, 0x0d, 0xc4, 0x6c, 0xa3, 0xf4, 0xa5, 0x47, 0x3c, 0xc2, 0x11, 0x7a, 0x6f, 0x25, 0xc0, + 0x25, 0xc5, 0x23, 0xc4, 0xf3, 0x91, 0xce, 0x77, 0x8d, 0x68, 0x57, 0x67, 0xb8, 0x85, 0x28, 0xb3, + 0x5b, 0xed, 0xd8, 0xa1, 0xec, 0x70, 0x7a, 0xbd, 0x61, 0x53, 0xa4, 0xc7, 0x5c, 0xba, 0x43, 0x70, + 0x20, 0xce, 0xd5, 0xf7, 0x13, 0xb0, 0x58, 0xa3, 0xde, 0x46, 0x88, 0x6c, 0x86, 0xb6, 0x08, 0xc5, + 0x0c, 0x93, 0x40, 0xfa, 0x09, 0x4e, 0xb6, 0x09, 0xf1, 0xeb, 0xd8, 0x95, 0x41, 0x05, 0x54, 0xc7, + 0x4d, 0xa9, 0xdb, 0x51, 0x0a, 0x47, 0x76, 0xcb, 0x5f, 0x53, 0xe3, 0x03, 0xd5, 0xca, 0xf5, 0x56, + 0x9b, 0xae, 0xf4, 0x23, 0xcc, 0x51, 0x14, 0xb8, 0x28, 0x94, 0xc7, 0x2a, 0xa0, 0x9a, 0x37, 0x8b, + 0xdd, 0x8e, 0x32, 0x23, 0x7c, 0x85, 0x5d, 0xb5, 0x62, 0x07, 0x69, 0x15, 0x42, 0x9f, 0x1c, 0xa0, + 0xb0, 0xce, 0xb0, 0xd3, 0x94, 0xb3, 0x15, 0x50, 0xcd, 0x9a, 0x0b, 0xdd, 0x8e, 0x52, 0x14, 0xee, + 0xfd, 0x33, 0xd5, 0xca, 0xf3, 0xcd, 0x36, 0x76, 0x9a, 0x3d, 0x54, 0xd4, 0x6e, 0x27, 0xa8, 0xf1, + 0x61, 0x54, 0xff, 0x4c, 0xb5, 0xf2, 0x7c, 0xc3, 0x51, 0x75, 0x58, 0x60, 0xa4, 0x89, 0x82, 0xba, + 0x8b, 0x28, 0x0e, 0x91, 0xbb, 0x2c, 0x4f, 0x54, 0x40, 0x75, 0x7a, 0x65, 0x51, 0x13, 0x92, 0x68, + 0x3d, 0x49, 0x12, 0x79, 0xb5, 0x0d, 0x82, 0x03, 0xf3, 0xdb, 0xd3, 0x8e, 0x92, 0xe9, 0x76, 0x94, + 0x05, 0x41, 0x7c, 0x19, 0xae, 0x5a, 0x33, 0xdc, 0xf0, 0x47, 0xbc, 0x1f, 0x09, 0x60, 0xc8, 0xb9, + 0xbb, 0x04, 0x30, 0x86, 0x02, 0x18, 0xd2, 0x3e, 0x2c, 0x0a, 0x8f, 0x16, 0x0e, 0xea, 0x76, 0x8b, + 0x44, 0x01, 0x5b, 0x96, 0x27, 0xb9, 0xc6, 0x7f, 0xf5, 0x88, 0xde, 0x74, 0x94, 0xef, 0x3d, 0xcc, + 0xf6, 0xa2, 0x86, 0xe6, 0x90, 0x96, 0x1e, 0xdf, 0xb4, 0xf8, 0x59, 0xa2, 0x6e, 0x53, 0x67, 0x47, + 0x6d, 0x44, 0xb5, 0xcd, 0x80, 0x75, 0x3b, 0x8a, 0x3c, 0x18, 0x72, 0x80, 0x50, 0xb5, 0x66, 0xb9, + 0xad, 0x86, 0x83, 0xdf, 0x85, 0xe5, 0xaa, 0xb8, 0x86, 0x3c, 0x75, 0xbf, 0x71, 0x8d, 0x91, 0xb8, + 0x86, 0xf4, 0x3f, 0xfc, 0x62, 0x37, 0x24, 0x4f, 0x50, 0x50, 0x8f, 0x02, 0x86, 0x7d, 0x39, 0xcf, + 0xe5, 0x2c, 0x69, 0xa2, 0xc6, 0xb5, 0xa4, 0xc6, 0xb5, 0xed, 0xa4, 0xc6, 0x4d, 0x25, 0xd6, 0x73, + 0x5e, 0x04, 0x19, 0x44, 0xab, 0xc7, 0x6f, 0x15, 0x60, 0x4d, 0x0b, 0xd3, 0x3f, 0xdc, 0xf2, 0x62, + 0x0c, 0x2e, 0x8e, 0xd4, 0xba, 0x85, 0x68, 0x9b, 0x04, 0x14, 0x49, 0x3b, 0x70, 0x32, 0xd1, 0x18, + 0xf0, 0x5c, 0xd7, 0x6f, 0x9c, 0x6b, 0xdc, 0x21, 0xa9, 0xb2, 0x09, 0x61, 0x9f, 0xdb, 0x88, 0x7b, + 0xe4, 0x8e, 0xdc, 0x46, 0xca, 0x6d, 0x48, 0x07, 0xb0, 0x98, 0x4e, 0x8b, 0xba, 0xc3, 0x73, 0x73, + 0x79, 0xa9, 0xdf, 0xe1, 0xb6, 0x46, 0x08, 0x55, 0x6b, 0x2e, 0xb5, 0x6d, 0xc4, 0xa6, 0x93, 0x2c, + 0x9c, 0xaf, 0x51, 0xef, 0x5f, 0xcc, 0xf6, 0xdc, 0xd0, 0x3e, 0x78, 0x50, 0xc3, 0x83, 0xc1, 0x7e, + 0xbe, 0x71, 0xc5, 0xc6, 0x9a, 0x6e, 0xde, 0x58, 0xd3, 0xaf, 0x87, 0x35, 0x15, 0x7c, 0xaa, 0x35, + 0x9b, 0x9a, 0x44, 0x07, 0x8c, 0x34, 0x40, 0xee, 0x9e, 0x1b, 0xe0, 0x15, 0x80, 0xdf, 0x5c, 0x71, + 0x63, 0x9f, 0x7b, 0x0b, 0xa8, 0x2f, 0x01, 0x2c, 0xf4, 0x1a, 0x9b, 0xf8, 0x3e, 0x72, 0xd8, 0x9f, + 0x08, 0xd1, 0x87, 0x50, 0x84, 0xea, 0x23, 0xf8, 0xd5, 0xe5, 0xac, 0xd2, 0x8b, 0xda, 0x82, 0x79, + 0x31, 0x50, 0x49, 0xc4, 0x64, 0x50, 0xc9, 0x7e, 0xfa, 0x5f, 0x47, 0x8e, 0x8b, 0x64, 0x6e, 0x70, + 0x14, 0x93, 0x88, 0xa9, 0xd6, 0x14, 0x5f, 0xff, 0x1d, 0xb1, 0x95, 0x93, 0x2c, 0xcc, 0xd6, 0xa8, + 0x27, 0x3d, 0x03, 0xb0, 0x30, 0xf4, 0x18, 0xf8, 0x55, 0xbb, 0xd6, 0x0b, 0x45, 0x1b, 0x19, 0xad, + 0xa5, 0xf5, 0xdb, 0x22, 0xd3, 0x44, 0x9f, 0x03, 0x38, 0x37, 0x32, 0x60, 0xd6, 0xae, 0x4f, 0x3b, + 0x8c, 0x2d, 0x99, 0xb7, 0xc7, 0xa6, 0x1f, 0xf5, 0x14, 0xc0, 0xe9, 0xc1, 0x5a, 0xfb, 0xe5, 0x06, + 0x69, 0xf6, 0x61, 0xa5, 0xdf, 0x6e, 0x05, 0x4b, 0xbe, 0xc2, 0xfc, 0xef, 0xf4, 0xbc, 0x0c, 0xce, + 0xce, 0xcb, 0xe0, 0xdd, 0x79, 0x19, 0x1c, 0x5f, 0x94, 0x33, 0x67, 0x17, 0xe5, 0xcc, 0xeb, 0x8b, + 0x72, 0x66, 0xc7, 0x1c, 0xe8, 0xa8, 0x38, 0xc4, 0x92, 0x6f, 0x37, 0x68, 0xb2, 0xd1, 0xf7, 0x8d, + 0x55, 0xfd, 0xf0, 0xa3, 0x0f, 0xd3, 0x5e, 0xc7, 0x35, 0x72, 0x7c, 0xd8, 0xfc, 0xfc, 0x21, 0x00, + 0x00, 0xff, 0xff, 0xbb, 0x9d, 0x42, 0xbc, 0xc7, 0x0a, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -611,6 +636,14 @@ func (m *MsgCreatePosition) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.FrozenUntil, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.FrozenUntil):]) + if err1 != nil { + return 0, err1 + } + i -= n1 + i = encodeVarintTx(dAtA, i, uint64(n1)) + i-- + dAtA[i] = 0x4a { size := m.TokenMinAmount1.Size() i -= size @@ -749,6 +782,14 @@ func (m *MsgWithdrawPosition) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + n4, err4 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.FrozenUntil, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.FrozenUntil):]) + if err4 != nil { + return 0, err4 + } + i -= n4 + i = encodeVarintTx(dAtA, i, uint64(n4)) + i-- + dAtA[i] = 0x32 { size := m.LiquidityAmount.Size() i -= size @@ -947,6 +988,8 @@ func (m *MsgCreatePosition) Size() (n int) { n += 1 + l + sovTx(uint64(l)) l = m.TokenMinAmount1.Size() n += 1 + l + sovTx(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.FrozenUntil) + n += 1 + l + sovTx(uint64(l)) return n } @@ -986,6 +1029,8 @@ func (m *MsgWithdrawPosition) Size() (n int) { } l = m.LiquidityAmount.Size() n += 1 + l + sovTx(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.FrozenUntil) + n += 1 + l + sovTx(uint64(l)) return n } @@ -1297,6 +1342,39 @@ func (m *MsgCreatePosition) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FrozenUntil", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.FrozenUntil, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) @@ -1622,6 +1700,39 @@ func (m *MsgWithdrawPosition) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FrozenUntil", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.FrozenUntil, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) diff --git a/x/gamm/keeper/migrate.go b/x/gamm/keeper/migrate.go index a86c3be0e9c..c6033d9d4f8 100644 --- a/x/gamm/keeper/migrate.go +++ b/x/gamm/keeper/migrate.go @@ -3,6 +3,7 @@ package keeper import ( "fmt" "sort" + "time" "github.com/osmosis-labs/osmosis/osmoutils" cl "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity" @@ -56,7 +57,8 @@ func (k Keeper) Migrate(ctx sdk.Context, sender sdk.AccAddress, sharesToMigrate minTick, maxTick := cl.GetMinAndMaxTicksFromExponentAtPriceOne(concentratedPool.GetPrecisionFactorAtPriceOne()) // Create a full range (min to max tick) concentrated liquidity position. - amount0, amount1, liquidity, err = k.clKeeper.CreatePosition(ctx, poolIdEntering, sender, exitCoins.AmountOf(concentratedPool.GetToken0()), exitCoins.AmountOf(concentratedPool.GetToken1()), sdk.ZeroInt(), sdk.ZeroInt(), minTick, maxTick) + // TODO: Will need to implement lock breaking logic and add the corresponding freeze duration here. + amount0, amount1, liquidity, err = k.clKeeper.CreatePosition(ctx, poolIdEntering, sender, exitCoins.AmountOf(concentratedPool.GetToken0()), exitCoins.AmountOf(concentratedPool.GetToken1()), sdk.ZeroInt(), sdk.ZeroInt(), minTick, maxTick, time.Time{}) if err != nil { return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, err } diff --git a/x/gamm/keeper/migrate_test.go b/x/gamm/keeper/migrate_test.go index 6c7852b7a3a..b69a3207200 100644 --- a/x/gamm/keeper/migrate_test.go +++ b/x/gamm/keeper/migrate_test.go @@ -2,6 +2,7 @@ package keeper_test import ( "fmt" + "time" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -178,7 +179,8 @@ func (suite *KeeperTestSuite) TestMigrate() { suite.Require().Equal(sdk.NewInt(0), clPoolUsdcBalanceAfterFailedMigration.Amount) // Assure the position was not created. - _, err := suite.App.ConcentratedLiquidityKeeper.GetPosition(suite.Ctx, clPool.GetId(), test.param.sender, minTick, maxTick) + // TODO: When we implement lock breaking, we need to change time.Time{} to the lock's end time. + _, err := suite.App.ConcentratedLiquidityKeeper.GetPosition(suite.Ctx, clPool.GetId(), test.param.sender, minTick, maxTick, time.Time{}) suite.Require().Error(err) continue } @@ -192,7 +194,8 @@ func (suite *KeeperTestSuite) TestMigrate() { suite.Require().Equal(userBalancesBeforeMigration.AmountOf(USDC).Add(expectedUserFinalUsdcBalanceDiff).String(), userBalancesAfterMigration.AmountOf(USDC).String()) // Assure the expected position was created. - position, err := suite.App.ConcentratedLiquidityKeeper.GetPosition(suite.Ctx, clPool.GetId(), test.param.sender, minTick, maxTick) + // TODO: When we implement lock breaking, we need to change time.Time{} to the lock's end time. + position, err := suite.App.ConcentratedLiquidityKeeper.GetPosition(suite.Ctx, clPool.GetId(), test.param.sender, minTick, maxTick, time.Time{}) suite.Require().NoError(err) suite.Require().Equal(test.expectedPosition, position) diff --git a/x/gamm/types/expected_keepers.go b/x/gamm/types/expected_keepers.go index 5acd0365a8a..f1fee2ef46b 100644 --- a/x/gamm/types/expected_keepers.go +++ b/x/gamm/types/expected_keepers.go @@ -1,6 +1,8 @@ package types import ( + "time" + sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" @@ -46,7 +48,7 @@ type CommunityPoolKeeper interface { // CLKeeper defines the contract needed to be fulfilled for the concentrated liquidity keeper. type CLKeeper interface { - CreatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, amount0Desired, amount1Desired, amount0Min, amount1Min sdk.Int, lowerTick, upperTick int64) (sdk.Int, sdk.Int, sdk.Dec, error) + CreatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, amount0Desired, amount1Desired, amount0Min, amount1Min sdk.Int, lowerTick, upperTick int64, frozenUntil time.Time) (sdk.Int, sdk.Int, sdk.Dec, error) GetPool(ctx sdk.Context, poolId uint64) (poolmanagertypes.PoolI, error) } From e4941f69897433f1080f2999f154a3eeace03303 Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Wed, 25 Jan 2023 21:44:41 -0600 Subject: [PATCH 002/136] push --- x/concentrated-liquidity/store.go | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/x/concentrated-liquidity/store.go b/x/concentrated-liquidity/store.go index cca2efc6af2..d8608ad1198 100644 --- a/x/concentrated-liquidity/store.go +++ b/x/concentrated-liquidity/store.go @@ -4,11 +4,11 @@ import ( "errors" "fmt" - "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/address" "github.com/gogo/protobuf/proto" + "github.com/osmosis-labs/osmosis/osmoutils" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" ) @@ -37,29 +37,7 @@ func (k Keeper) getAllPositionsWithVaryingFreezeTimes(ctx sdk.Context, poolId ui // filteredPositions = append(filteredPositions, position) // } // } - store := ctx.KVStore(k.storeKey) - prefixBz := key - prefixStore := prefix.NewStore(store, prefixBz) - - var positions []model.Position - - iter := prefixStore.ReverseIterator(key, nil) - defer iter.Close() - for ; iter.Valid(); iter.Next() { - // Since, we constructed our prefix store with , the - // key is the encoding of a tick index. - fmt.Printf("iter.Key(): %v \n", iter.Key()) - fmt.Printf("iter.Value(): %v \n", iter.Value()) - position, err := ParsePositionFromBz(iter.Value()) - if err != nil { - return nil, err - } - positions = append(positions, position) - - } - - //return osmoutils.GatherValuesFromStorePrefix(ctx.KVStore(k.storeKey), key, ParsePositionFromBz) - return positions, nil + return osmoutils.GatherValuesFromStorePrefix(ctx.KVStore(k.storeKey), key, ParsePositionFromBz) } func ParsePositionFromBz(bz []byte) (position model.Position, err error) { From a3ac7b78408485429edda58e3161b0d7d2d696d6 Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Wed, 25 Jan 2023 22:34:13 -0600 Subject: [PATCH 003/136] untracked files --- x/concentrated-liquidity/store.go | 25 +++++++++ x/concentrated-liquidity/store_test.go | 77 ++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 x/concentrated-liquidity/store.go create mode 100644 x/concentrated-liquidity/store_test.go diff --git a/x/concentrated-liquidity/store.go b/x/concentrated-liquidity/store.go new file mode 100644 index 00000000000..e57548e15f8 --- /dev/null +++ b/x/concentrated-liquidity/store.go @@ -0,0 +1,25 @@ +package concentrated_liquidity + +import ( + "errors" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/gogo/protobuf/proto" + + "github.com/osmosis-labs/osmosis/osmoutils" + "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" + "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" +) + +// getAllPositionsWithVaryingFreezeTimes returns multiple positions indexed by poolId, addr, lowerTick, upperTick with varying freeze times. +func (k Keeper) getAllPositionsWithVaryingFreezeTimes(ctx sdk.Context, poolId uint64, addr sdk.AccAddress, lowerTick, upperTick int64) ([]model.Position, error) { + return osmoutils.GatherValuesFromStorePrefix(ctx.KVStore(k.storeKey), types.KeyPosition(poolId, addr, lowerTick, upperTick), ParsePositionFromBz) +} + +func ParsePositionFromBz(bz []byte) (position model.Position, err error) { + if len(bz) == 0 { + return model.Position{}, errors.New("position not found") + } + err = proto.Unmarshal(bz, &position) + return position, err +} diff --git a/x/concentrated-liquidity/store_test.go b/x/concentrated-liquidity/store_test.go new file mode 100644 index 00000000000..6a33fb29a35 --- /dev/null +++ b/x/concentrated-liquidity/store_test.go @@ -0,0 +1,77 @@ +package concentrated_liquidity_test + +import ( + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" +) + +func (s *KeeperTestSuite) TestGetAllPositionsWithVaryingFreezeTimes() { + defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + defaultAddress := s.TestAccs[0] + secondAddress := s.TestAccs[1] + type position struct { + poolId uint64 + acc sdk.AccAddress + coin0 sdk.Coin + coin1 sdk.Coin + lowerTick int64 + upperTick int64 + frozenUntil time.Time + } + + tests := map[string]struct { + setupPositions []position + expectedPositions []position + }{ + "no positions": { + setupPositions: []position{}, + }, + "one position": { + setupPositions: []position{ + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil}, + }, + }, + "multiple positions": { + setupPositions: []position{ + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour)}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 2)}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 3)}, + }, + }, + "multiple positions, some different owner": { + setupPositions: []position{ + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour)}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 2)}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 3)}, + {1, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour)}, + {1, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 2)}, + {1, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 3)}, + }, + }, + } + for name, tc := range tests { + s.Run(name, func() { + // Setup. + s.SetupTest() + ctx := s.Ctx + s.PrepareConcentratedPool() + expectedPositions := []model.Position{} + for _, pos := range tc.setupPositions { + position := s.SetupPosition(pos.poolId, pos.acc, pos.coin0, pos.coin1, pos.lowerTick, pos.upperTick, pos.frozenUntil) + if pos.acc.Equals(defaultAddress) { + expectedPositions = append(expectedPositions, position) + } + } + + // System under test. + actualPositions, err := s.App.ConcentratedLiquidityKeeper.GetAllPositionsWithVaryingFreezeTimes(ctx, 1, defaultAddress, DefaultLowerTick, DefaultUpperTick) + s.NoError(err) + + // Assertions. + s.Equal(expectedPositions, actualPositions) + }) + } +} From 61f5c7666ef95352fb7066890bd26845a81695d9 Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Thu, 26 Jan 2023 11:25:57 -0600 Subject: [PATCH 004/136] add untracked files --- x/concentrated-liquidity/store.go | 25 +++++++++ x/concentrated-liquidity/store_test.go | 77 ++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 x/concentrated-liquidity/store.go create mode 100644 x/concentrated-liquidity/store_test.go diff --git a/x/concentrated-liquidity/store.go b/x/concentrated-liquidity/store.go new file mode 100644 index 00000000000..e57548e15f8 --- /dev/null +++ b/x/concentrated-liquidity/store.go @@ -0,0 +1,25 @@ +package concentrated_liquidity + +import ( + "errors" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/gogo/protobuf/proto" + + "github.com/osmosis-labs/osmosis/osmoutils" + "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" + "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" +) + +// getAllPositionsWithVaryingFreezeTimes returns multiple positions indexed by poolId, addr, lowerTick, upperTick with varying freeze times. +func (k Keeper) getAllPositionsWithVaryingFreezeTimes(ctx sdk.Context, poolId uint64, addr sdk.AccAddress, lowerTick, upperTick int64) ([]model.Position, error) { + return osmoutils.GatherValuesFromStorePrefix(ctx.KVStore(k.storeKey), types.KeyPosition(poolId, addr, lowerTick, upperTick), ParsePositionFromBz) +} + +func ParsePositionFromBz(bz []byte) (position model.Position, err error) { + if len(bz) == 0 { + return model.Position{}, errors.New("position not found") + } + err = proto.Unmarshal(bz, &position) + return position, err +} diff --git a/x/concentrated-liquidity/store_test.go b/x/concentrated-liquidity/store_test.go new file mode 100644 index 00000000000..6a33fb29a35 --- /dev/null +++ b/x/concentrated-liquidity/store_test.go @@ -0,0 +1,77 @@ +package concentrated_liquidity_test + +import ( + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" +) + +func (s *KeeperTestSuite) TestGetAllPositionsWithVaryingFreezeTimes() { + defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + defaultAddress := s.TestAccs[0] + secondAddress := s.TestAccs[1] + type position struct { + poolId uint64 + acc sdk.AccAddress + coin0 sdk.Coin + coin1 sdk.Coin + lowerTick int64 + upperTick int64 + frozenUntil time.Time + } + + tests := map[string]struct { + setupPositions []position + expectedPositions []position + }{ + "no positions": { + setupPositions: []position{}, + }, + "one position": { + setupPositions: []position{ + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil}, + }, + }, + "multiple positions": { + setupPositions: []position{ + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour)}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 2)}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 3)}, + }, + }, + "multiple positions, some different owner": { + setupPositions: []position{ + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour)}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 2)}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 3)}, + {1, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour)}, + {1, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 2)}, + {1, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 3)}, + }, + }, + } + for name, tc := range tests { + s.Run(name, func() { + // Setup. + s.SetupTest() + ctx := s.Ctx + s.PrepareConcentratedPool() + expectedPositions := []model.Position{} + for _, pos := range tc.setupPositions { + position := s.SetupPosition(pos.poolId, pos.acc, pos.coin0, pos.coin1, pos.lowerTick, pos.upperTick, pos.frozenUntil) + if pos.acc.Equals(defaultAddress) { + expectedPositions = append(expectedPositions, position) + } + } + + // System under test. + actualPositions, err := s.App.ConcentratedLiquidityKeeper.GetAllPositionsWithVaryingFreezeTimes(ctx, 1, defaultAddress, DefaultLowerTick, DefaultUpperTick) + s.NoError(err) + + // Assertions. + s.Equal(expectedPositions, actualPositions) + }) + } +} From 085bdc173b2440cfd07bf17240afa3c696b064d4 Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Thu, 26 Jan 2023 11:27:38 -0600 Subject: [PATCH 005/136] merge branches --- x/concentrated-liquidity/export_test.go | 16 ++++++------ x/concentrated-liquidity/lp.go | 2 +- x/concentrated-liquidity/lp_test.go | 32 ++++++++++++++++++++--- x/concentrated-liquidity/position_test.go | 19 +++++++++++++- x/concentrated-liquidity/types/errors.go | 8 ++++++ 5 files changed, 63 insertions(+), 14 deletions(-) diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index a9b514c0f6e..7508ca7bd49 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -93,6 +93,14 @@ func ConvertPoolInterfaceToConcentrated(poolI poolmanagertypes.PoolI) (types.Con return convertPoolInterfaceToConcentrated(poolI) } +func (k Keeper) GetAllPositionsWithVaryingFreezeTimes(ctx sdk.Context, poolId uint64, addr sdk.AccAddress, lowerTick, upperTick int64) ([]model.Position, error) { + return k.getAllPositionsWithVaryingFreezeTimes(ctx, poolId, addr, lowerTick, upperTick) +} + +func (k Keeper) SetPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, position *model.Position, frozenUntil time.Time) { + k.setPosition(ctx, poolId, owner, lowerTick, upperTick, position, frozenUntil) +} + // fees methods func (k Keeper) CreateFeeAccumulator(ctx sdk.Context, poolId uint64) error { return k.createFeeAccumulator(ctx, poolId) @@ -133,11 +141,3 @@ func (k Keeper) ChargeFee(ctx sdk.Context, poolId uint64, feeUpdate sdk.DecCoin) func FormatPositionAccumulatorKey(poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64) string { return formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick) } - -func (k Keeper) GetAllPositionsWithVaryingFreezeTimes(ctx sdk.Context, poolId uint64, addr sdk.AccAddress, lowerTick, upperTick int64) ([]model.Position, error) { - return k.getAllPositionsWithVaryingFreezeTimes(ctx, poolId, addr, lowerTick, upperTick) -} - -func (k Keeper) SetPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, position *model.Position, frozenUntil time.Time) { - k.setPosition(ctx, poolId, owner, lowerTick, upperTick, position, frozenUntil) -} diff --git a/x/concentrated-liquidity/lp.go b/x/concentrated-liquidity/lp.go index 271a8573443..0a54ccfddb1 100644 --- a/x/concentrated-liquidity/lp.go +++ b/x/concentrated-liquidity/lp.go @@ -122,7 +122,7 @@ func (k Keeper) WithdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAd // Check if position is still frozen if position.FrozenUntil.After(ctx.BlockTime()) { - return sdk.Int{}, sdk.Int{}, fmt.Errorf("position is still frozen until %s", position.FrozenUntil) + return sdk.Int{}, sdk.Int{}, types.PositionStillFrozenError{FrozenUntil: position.FrozenUntil} } // Check if the requested liquidity amount to withdraw is less than or equal to the available liquidity for the position. diff --git a/x/concentrated-liquidity/lp_test.go b/x/concentrated-liquidity/lp_test.go index 2920936b181..ef2971bb092 100644 --- a/x/concentrated-liquidity/lp_test.go +++ b/x/concentrated-liquidity/lp_test.go @@ -288,6 +288,9 @@ func (s *KeeperTestSuite) TestCreatePosition() { } func (s *KeeperTestSuite) TestWithdrawPosition() { + defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + frozenBaseCase := *baseCase + frozenBaseCase.frozenUntil = defaultFrozenUntil tests := map[string]struct { setupConfig *lpTest // when this is set, it overwrites the setupConfig @@ -327,7 +330,28 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { // for withdrawing a position. sutConfigOverwrite: &lpTest{ lowerTick: -1, // valid tick at which no position exists - expectedError: types.PositionNotFoundError{PoolId: 1, LowerTick: -1, UpperTick: 86129}, + expectedError: types.PositionNotFoundError{PoolId: 1, LowerTick: -1, UpperTick: 315000, FrozenUntil: time.Time{}}, + }, + }, + "error: no position created (position exists but wrong frozenUntil value)": { + // setup parameters for creation a pool and position. + setupConfig: baseCase, + + // system under test parameters + // for withdrawing a position. + sutConfigOverwrite: &lpTest{ + frozenUntil: defaultFrozenUntil, + expectedError: types.PositionNotFoundError{PoolId: 1, LowerTick: 305450, UpperTick: 315000, FrozenUntil: defaultFrozenUntil}, + }, + }, + "error: withdraw liquidity that is still frozen": { + // setup parameters for creation a pool and position. + setupConfig: &frozenBaseCase, + + // system under test parameters + // for withdrawing a position. + sutConfigOverwrite: &lpTest{ + expectedError: types.PositionStillFrozenError{FrozenUntil: defaultFrozenUntil}, }, }, "error: pool id for pool that does not exist": { @@ -349,7 +373,7 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { // for withdrawing a position. sutConfigOverwrite: &lpTest{ upperTick: DefaultMaxTick + 1, // invalid tick - expectedError: types.InvalidTickError{Tick: DefaultMaxTick + 1, IsLower: false}, + expectedError: types.InvalidTickError{Tick: DefaultMaxTick + 1, IsLower: false, MinTick: DefaultMinTick, MaxTick: DefaultMaxTick}, }, }, "error: lower tick out of bounds": { @@ -360,7 +384,7 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { // for withdrawing a position. sutConfigOverwrite: &lpTest{ lowerTick: DefaultMinTick - 1, // invalid tick - expectedError: types.InvalidTickError{Tick: DefaultMinTick - 1, IsLower: true}, + expectedError: types.InvalidTickError{Tick: DefaultMinTick - 1, IsLower: true, MinTick: DefaultMinTick, MaxTick: DefaultMaxTick}, }, }, "error: insufficient liquidity": { @@ -445,7 +469,7 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { s.Require().Error(err) s.Require().Equal(amtDenom0, sdk.Int{}) s.Require().Equal(amtDenom1, sdk.Int{}) - s.Require().ErrorAs(err, &config.expectedError) + s.Require().ErrorContains(err, config.expectedError.Error()) return } diff --git a/x/concentrated-liquidity/position_test.go b/x/concentrated-liquidity/position_test.go index 18fc171ae64..27965d747b8 100644 --- a/x/concentrated-liquidity/position_test.go +++ b/x/concentrated-liquidity/position_test.go @@ -51,7 +51,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { expectedLiquidity: DefaultLiquidityAmt.Add(DefaultLiquidityAmt), }, { - name: "Update position from -50 to 50 that already contains DefaultLiquidityAmt liquidity with DefaultLiquidityAmt more liquidity, this time with an hour freeze duration", + name: "Update position from -50 to 50 that already contains DefaultLiquidityAmt liquidity with DefaultLiquidityAmt more liquidity with an hour freeze duration", param: param{ poolId: validPoolId, lowerTick: -50, @@ -162,6 +162,15 @@ func (s *KeeperTestSuite) TestGetPosition() { frozenUntil: defaultFrozenUntil, expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick, FrozenUntil: defaultFrozenUntil}, }, + { + name: "Get position info on existing pool and existing position but wrong frozenUntil time", + poolToGet: validPoolId, + ownerIndex: 1, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick, + frozenUntil: defaultFrozenUntil.Add(time.Second), + expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick, FrozenUntil: defaultFrozenUntil.Add(time.Second)}, + }, { name: "Get position info on existing pool with no existing position", poolToGet: validPoolId, @@ -233,6 +242,14 @@ func (s *KeeperTestSuite) TestDeletePosition() { frozenUntil: defaultFrozenUntil, expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick, FrozenUntil: defaultFrozenUntil}, }, + { + name: "Delete position on existing pool and existing position but wrong frozenUntil time", + poolToGet: validPoolId, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick, + frozenUntil: defaultFrozenUntil.Add(time.Second), + expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick, FrozenUntil: defaultFrozenUntil.Add(time.Second)}, + }, { name: "Delete position on existing pool with no existing position", poolToGet: validPoolId, diff --git a/x/concentrated-liquidity/types/errors.go b/x/concentrated-liquidity/types/errors.go index 688382871b8..8c126372ef0 100644 --- a/x/concentrated-liquidity/types/errors.go +++ b/x/concentrated-liquidity/types/errors.go @@ -215,3 +215,11 @@ type InvalidSwapFeeError struct { func (e InvalidSwapFeeError) Error() string { return fmt.Sprintf("invalid swap fee(%s), must be in [0, 1) range", e.ActualFee) } + +type PositionStillFrozenError struct { + FrozenUntil time.Time +} + +func (e PositionStillFrozenError) Error() string { + return fmt.Sprintf("position is still frozen until %s", e.FrozenUntil) +} From 2e4fd0f1206f5eaa1fadf1619367c0e6f5c10ac0 Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Thu, 26 Jan 2023 12:46:51 -0600 Subject: [PATCH 006/136] add changes required for fees --- osmoutils/store_helper.go | 1 - x/concentrated-liquidity/export_test.go | 12 +- x/concentrated-liquidity/fees.go | 83 ++++++----- x/concentrated-liquidity/fees_test.go | 174 ++++++++++++++---------- x/concentrated-liquidity/keeper_test.go | 10 +- x/concentrated-liquidity/lp.go | 4 +- x/concentrated-liquidity/lp_test.go | 2 +- x/concentrated-liquidity/types/keys.go | 18 --- 8 files changed, 168 insertions(+), 136 deletions(-) diff --git a/osmoutils/store_helper.go b/osmoutils/store_helper.go index 7f45f90f40c..2a3c377a69b 100644 --- a/osmoutils/store_helper.go +++ b/osmoutils/store_helper.go @@ -89,7 +89,6 @@ func gatherValuesFromIterator[T any](iterator db.Iterator, parseValue func([]byt break } val, err := parseValue(iterator.Value()) - fmt.Printf("val: %v \n", val) if err != nil { return nil, err } diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index 7508ca7bd49..7dd1a5c4f91 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -110,12 +110,12 @@ func (k Keeper) GetFeeAccumulator(ctx sdk.Context, poolId uint64) (accum.Accumul return k.getFeeAccumulator(ctx, poolId) } -func (k Keeper) InitializeFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64) error { - return k.initializeFeeAccumulatorPosition(ctx, poolId, owner, lowerTick, upperTick) +func (k Keeper) InitializeFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) error { + return k.initializeFeeAccumulatorPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) } -func (k Keeper) UpdateFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, liquidityDelta sdk.Dec, lowerTick int64, upperTick int64) error { - return k.updateFeeAccumulatorPosition(ctx, poolId, owner, liquidityDelta, lowerTick, upperTick) +func (k Keeper) UpdateFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, liquidityDelta sdk.Dec, lowerTick int64, upperTick int64, frozenUntil time.Time) error { + return k.updateFeeAccumulatorPosition(ctx, poolId, owner, liquidityDelta, lowerTick, upperTick, frozenUntil) } func (k Keeper) GetFeeGrowthOutside(ctx sdk.Context, poolId uint64, lowerTick, upperTick int64) (sdk.DecCoins, error) { @@ -138,6 +138,6 @@ func (k Keeper) ChargeFee(ctx sdk.Context, poolId uint64, feeUpdate sdk.DecCoin) return k.chargeFee(ctx, poolId, feeUpdate) } -func FormatPositionAccumulatorKey(poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64) string { - return formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick) +func FormatPositionAccumulatorKey(poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) string { + return formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick, frozenUntil) } diff --git a/x/concentrated-liquidity/fees.go b/x/concentrated-liquidity/fees.go index c77e2e94143..e4fd19a6ff6 100644 --- a/x/concentrated-liquidity/fees.go +++ b/x/concentrated-liquidity/fees.go @@ -4,6 +4,7 @@ import ( "fmt" "strconv" "strings" + "time" sdk "github.com/cosmos/cosmos-sdk/types" @@ -64,14 +65,14 @@ func (k Keeper) chargeFee(ctx sdk.Context, poolId uint64, feeUpdate sdk.DecCoin) // - fails to get an accumulator for a given poold id // - attempts to re-initialize an existing fee accumulator liqudity position // - fails to create a position -func (k Keeper) initializeFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64) error { +func (k Keeper) initializeFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) error { // get fee accumulator for the pool feeAccumulator, err := k.getFeeAccumulator(ctx, poolId) if err != nil { return err } - positionKey := formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick) + positionKey := formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick, frozenUntil) hasPosition, err := feeAccumulator.HasPosition(positionKey) if err != nil { @@ -94,7 +95,7 @@ func (k Keeper) initializeFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, // updateFeeAccumulatorPosition updates the fee accumulator position for a given pool, owner, and tick range. // It retrieves the current fee growth outside of the given tick range and updates the position's accumulator // with the provided liquidity delta and the retrieved fee growth outside. -func (k Keeper) updateFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, liquidityDelta sdk.Dec, lowerTick int64, upperTick int64) error { +func (k Keeper) updateFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, liquidityDelta sdk.Dec, lowerTick int64, upperTick int64, frozenUntil time.Time) error { feeGrowthOutside, err := k.getFeeGrowthOutside(ctx, poolId, lowerTick, upperTick) if err != nil { return err @@ -107,7 +108,7 @@ func (k Keeper) updateFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, own // replace position's accumulator with the updated liquidity and the feeGrowthOutside err = feeAccumulator.UpdatePositionCustomAcc( - formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick), + formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick, frozenUntil), liquidityDelta, feeGrowthOutside) if err != nil { @@ -189,46 +190,62 @@ func (k Keeper) collectFees(ctx sdk.Context, poolId uint64, owner sdk.AccAddress return sdk.Coins{}, err } - positionKey := formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick) - - hasPosition, err := feeAccumulator.HasPosition(positionKey) + positions, err := k.getAllPositionsWithVaryingFreezeTimes(ctx, poolId, owner, lowerTick, upperTick) if err != nil { return sdk.Coins{}, err } - if !hasPosition { + if positions == nil { return sdk.Coins{}, cltypes.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick} } - // compute fee growth outside of the range between lower tick and upper tick. - feeGrowthOutside, err := k.getFeeGrowthOutside(ctx, poolId, lowerTick, upperTick) - if err != nil { - return sdk.Coins{}, err - } + var totalFeesClaimed sdk.Coins - // We need to update the position's accumulator to the current fee growth outside - // before we claim rewards. - if err := feeAccumulator.SetPositionCustomAcc(positionKey, feeGrowthOutside); err != nil { - return sdk.Coins{}, err - } + for _, position := range positions { - // claim fees. - feesClaimed, err := feeAccumulator.ClaimRewards(positionKey) - if err != nil { - return sdk.Coins{}, err - } + positionKey := formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick, position.FrozenUntil) - pool, err := k.getPoolById(ctx, poolId) - if err != nil { - return sdk.Coins{}, err - } + hasPosition, err := feeAccumulator.HasPosition(positionKey) + if err != nil { + return sdk.Coins{}, err + } - // distribute the fees from pool to the position owner. - if err := k.bankKeeper.SendCoins(ctx, pool.GetAddress(), owner, feesClaimed); err != nil { - return sdk.Coins{}, err + if !hasPosition { + return sdk.Coins{}, cltypes.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick} + } + + // compute fee growth outside of the range between lower tick and upper tick. + feeGrowthOutside, err := k.getFeeGrowthOutside(ctx, poolId, lowerTick, upperTick) + if err != nil { + return sdk.Coins{}, err + } + + // We need to update the position's accumulator to the current fee growth outside + // before we claim rewards. + if err := feeAccumulator.SetPositionCustomAcc(positionKey, feeGrowthOutside); err != nil { + return sdk.Coins{}, err + } + + // claim fees. + feesClaimed, err := feeAccumulator.ClaimRewards(positionKey) + if err != nil { + return sdk.Coins{}, err + } + + totalFeesClaimed = totalFeesClaimed.Add(feesClaimed...) + + pool, err := k.getPoolById(ctx, poolId) + if err != nil { + return sdk.Coins{}, err + } + + // distribute the fees from pool to the position owner. + if err := k.bankKeeper.SendCoins(ctx, pool.GetAddress(), owner, feesClaimed); err != nil { + return sdk.Coins{}, err + } } - return feesClaimed, nil + return totalFeesClaimed, nil } func getFeeAccumulatorName(poolId uint64) string { @@ -252,6 +269,6 @@ func calculateFeeGrowth(targetTick int64, feeGrowthOutside sdk.DecCoins, current // formatPositionAccumulatorKey formats the position accumulator key prefixed by pool id, owner, lower tick // and upper tick with a key separator in-between. // nolint: unused -func formatPositionAccumulatorKey(poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64) string { - return strings.Join([]string{strconv.FormatUint(poolId, uintBase), owner.String(), strconv.FormatInt(lowerTick, uintBase), strconv.FormatInt(upperTick, uintBase)}, keySeparator) +func formatPositionAccumulatorKey(poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) string { + return strings.Join([]string{strconv.FormatUint(poolId, uintBase), owner.String(), strconv.FormatInt(lowerTick, uintBase), strconv.FormatInt(upperTick, uintBase), frozenUntil.String()}, keySeparator) } diff --git a/x/concentrated-liquidity/fees_test.go b/x/concentrated-liquidity/fees_test.go index 4b989297565..2d044672844 100644 --- a/x/concentrated-liquidity/fees_test.go +++ b/x/concentrated-liquidity/fees_test.go @@ -1,11 +1,14 @@ package concentrated_liquidity_test import ( + "time" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/osmosis-labs/osmosis/osmoutils/accum" cl "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/internal/math" + "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" clmodel "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" cltypes "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" @@ -13,10 +16,11 @@ import ( // fields used to identify a fee position. type positionIdentifiers struct { - poolId uint64 - owner sdk.AccAddress - lowerTick int64 - upperTick int64 + poolId uint64 + owner sdk.AccAddress + lowerTick int64 + upperTick int64 + frozenUntil time.Time } var ( @@ -30,14 +34,17 @@ func (s *KeeperTestSuite) TestInitializeFeeAccumulatorPosition() { // For example, that positions with non-zero liquidity // cannot be overriden. s.SetupTest() + defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + defaultAccount := s.TestAccs[0] var ( defaultPoolId = uint64(1) defaultPositionId = positionIdentifiers{ defaultPoolId, - s.TestAccs[0], + defaultAccount, DefaultLowerTick, DefaultUpperTick, + defaultFrozenUntil, } ) @@ -91,12 +98,13 @@ func (s *KeeperTestSuite) TestInitializeFeeAccumulatorPosition() { expectedPass: false, }, { - name: "error: non-existing accumulator", + name: "error: non-existing accumulator (wrong pool)", positionId: positionIdentifiers{ defaultPoolId + 1, // non-existing pool - s.TestAccs[0], + defaultAccount, DefaultLowerTick, DefaultUpperTick, + defaultFrozenUntil, }, expectedPass: false, }, @@ -121,7 +129,7 @@ func (s *KeeperTestSuite) TestInitializeFeeAccumulatorPosition() { tc := tc s.Run(tc.name, func() { // system under test - err := clKeeper.InitializeFeeAccumulatorPosition(s.Ctx, tc.positionId.poolId, tc.positionId.owner, tc.positionId.lowerTick, tc.positionId.upperTick) + err := clKeeper.InitializeFeeAccumulatorPosition(s.Ctx, tc.positionId.poolId, tc.positionId.owner, tc.positionId.lowerTick, tc.positionId.upperTick, tc.positionId.frozenUntil) if tc.expectedPass { s.Require().NoError(err) @@ -129,7 +137,7 @@ func (s *KeeperTestSuite) TestInitializeFeeAccumulatorPosition() { poolFeeAccumulator, err := clKeeper.GetFeeAccumulator(s.Ctx, defaultPoolId) s.Require().NoError(err) - positionKey := cl.FormatPositionAccumulatorKey(tc.positionId.poolId, tc.positionId.owner, tc.positionId.lowerTick, tc.positionId.upperTick) + positionKey := cl.FormatPositionAccumulatorKey(tc.positionId.poolId, tc.positionId.owner, tc.positionId.lowerTick, tc.positionId.upperTick, tc.positionId.frozenUntil) positionSize, err := poolFeeAccumulator.GetPositionSize(positionKey) s.Require().NoError(err) @@ -450,6 +458,7 @@ func (s *KeeperTestSuite) TestCollectFees() { var ( ownerWithValidPosition = s.TestAccs[0] ) + defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) tests := map[string]struct { // setup parameters. @@ -461,9 +470,10 @@ func (s *KeeperTestSuite) TestCollectFees() { isInvalidPoolIdGiven bool // inputs parameters. - owner sdk.AccAddress - lowerTick int64 - upperTick int64 + owner sdk.AccAddress + lowerTick int64 + upperTick int64 + frozenUntil time.Time // expectations. expectedFeesClaimed sdk.Coins @@ -483,9 +493,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: 0, - upperTick: 1, + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 1, + frozenUntil: defaultFrozenUntil, currentTick: 2, @@ -499,9 +510,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: 0, - upperTick: 2, + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + frozenUntil: defaultFrozenUntil, currentTick: 3, @@ -515,9 +527,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: 0, - upperTick: 1, + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 1, + frozenUntil: defaultFrozenUntil, currentTick: 1, @@ -538,9 +551,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: 0, - upperTick: 1, + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 1, + frozenUntil: defaultFrozenUntil, currentTick: 0, @@ -555,9 +569,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: 0, - upperTick: 1, + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 1, + frozenUntil: defaultFrozenUntil, currentTick: -1, @@ -575,9 +590,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: 0, - upperTick: 1, + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 1, + frozenUntil: defaultFrozenUntil, currentTick: 5, @@ -592,9 +608,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: -10, - upperTick: -4, + owner: ownerWithValidPosition, + lowerTick: -10, + upperTick: -4, + frozenUntil: defaultFrozenUntil, currentTick: -13, @@ -611,9 +628,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: 0, - upperTick: 1, + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 1, + frozenUntil: defaultFrozenUntil, currentTick: 2, @@ -628,9 +646,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: s.TestAccs[1], // different owner from the one who initialized the position. - lowerTick: 0, - upperTick: 1, + owner: s.TestAccs[1], // different owner from the one who initialized the position. + lowerTick: 0, + upperTick: 1, + frozenUntil: defaultFrozenUntil, currentTick: 2, @@ -651,7 +670,12 @@ func (s *KeeperTestSuite) TestCollectFees() { clKeeper := s.App.ConcentratedLiquidityKeeper ctx := s.Ctx - s.initializeFeeAccumulatorPositionWithLiquidity(ctx, validPoolId, tc.owner, tc.lowerTick, tc.upperTick, tc.initialLiquidity) + // Position needs to be set in the store before calling CollectFees. + // This is because we iterate through all positions instead of having to call each position with separate frozenUntil times. + position := model.Position{Liquidity: tc.initialLiquidity, FrozenUntil: tc.frozenUntil} + s.App.ConcentratedLiquidityKeeper.SetPosition(ctx, validPoolId, tc.owner, tc.lowerTick, tc.upperTick, &position, tc.frozenUntil) + + s.initializeFeeAccumulatorPositionWithLiquidity(ctx, validPoolId, tc.owner, tc.lowerTick, tc.upperTick, tc.frozenUntil, tc.initialLiquidity) s.initializeTick(ctx, tc.lowerTick, tc.initialLiquidity, tc.lowerTickFeeGrowthOutside, false) @@ -705,6 +729,7 @@ func (s *KeeperTestSuite) TestUpdateFeeAccumulatorPosition() { ownerOne = s.TestAccs[0] ownerTwo = s.TestAccs[1] ) + defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) type updateFeeAccumPositionTest struct { poolId uint64 @@ -712,52 +737,60 @@ func (s *KeeperTestSuite) TestUpdateFeeAccumulatorPosition() { liquidity sdk.Dec lowerTick int64 upperTick int64 + frozenUntil time.Time expectedError error } positions := map[int]updateFeeAccumPositionTest{ 1: { - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick, + frozenUntil: defaultFrozenUntil, }, 2: { - lowerTick: DefaultLowerTick + 1, - upperTick: DefaultUpperTick, + lowerTick: DefaultLowerTick + 1, + upperTick: DefaultUpperTick, + frozenUntil: defaultFrozenUntil, }, 3: { - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick + 1, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick + 1, + frozenUntil: defaultFrozenUntil, }, } tests := map[string]updateFeeAccumPositionTest{ "update position with a different pool ID": { - poolId: 2, - owner: ownerOne, - liquidity: DefaultLiquidityAmt, - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick, + poolId: 2, + owner: ownerOne, + liquidity: DefaultLiquidityAmt, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick, + frozenUntil: defaultFrozenUntil, }, "update position with a different owner": { - poolId: 1, - owner: ownerTwo, - liquidity: DefaultLiquidityAmt, - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick, + poolId: 1, + owner: ownerTwo, + liquidity: DefaultLiquidityAmt, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick, + frozenUntil: defaultFrozenUntil, }, "update position with a different lower tick": { - poolId: 1, - owner: ownerOne, - liquidity: DefaultLiquidityAmt, - lowerTick: DefaultLowerTick + 1, - upperTick: DefaultUpperTick, + poolId: 1, + owner: ownerOne, + liquidity: DefaultLiquidityAmt, + lowerTick: DefaultLowerTick + 1, + upperTick: DefaultUpperTick, + frozenUntil: defaultFrozenUntil, }, "update position with a different upper tick": { - poolId: 1, - owner: ownerOne, - liquidity: DefaultLiquidityAmt, - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick + 1, + poolId: 1, + owner: ownerOne, + liquidity: DefaultLiquidityAmt, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick + 1, + frozenUntil: defaultFrozenUntil, }, "err: pool does not exist": { poolId: 3, @@ -769,7 +802,8 @@ func (s *KeeperTestSuite) TestUpdateFeeAccumulatorPosition() { liquidity: DefaultLiquidityAmt, lowerTick: DefaultLowerTick - 1, upperTick: DefaultUpperTick, - expectedError: accum.NoPositionError{Name: cl.FormatPositionAccumulatorKey(1, ownerOne, DefaultLowerTick-1, DefaultUpperTick)}, + frozenUntil: defaultFrozenUntil, + expectedError: accum.NoPositionError{Name: cl.FormatPositionAccumulatorKey(1, ownerOne, DefaultLowerTick-1, DefaultUpperTick, defaultFrozenUntil)}, }, } @@ -788,14 +822,14 @@ func (s *KeeperTestSuite) TestUpdateFeeAccumulatorPosition() { for _, pos := range positions { for _, pool := range pools { for _, owner := range owners { - s.initializeFeeAccumulatorPositionWithLiquidity(s.Ctx, pool.GetId(), owner, pos.lowerTick, pos.upperTick, DefaultLiquidityAmt) + s.initializeFeeAccumulatorPositionWithLiquidity(s.Ctx, pool.GetId(), owner, pos.lowerTick, pos.upperTick, pos.frozenUntil, DefaultLiquidityAmt) } } } // System under test // Update one of the positions as per the test case - err := s.App.ConcentratedLiquidityKeeper.UpdateFeeAccumulatorPosition(s.Ctx, tc.poolId, tc.owner, tc.liquidity, tc.lowerTick, tc.upperTick) + err := s.App.ConcentratedLiquidityKeeper.UpdateFeeAccumulatorPosition(s.Ctx, tc.poolId, tc.owner, tc.liquidity, tc.lowerTick, tc.upperTick, tc.frozenUntil) if tc.expectedError != nil { s.Require().Error(err) @@ -813,7 +847,7 @@ func (s *KeeperTestSuite) TestUpdateFeeAccumulatorPosition() { if pool.GetId() == tc.poolId && owner.Equals(tc.owner) && pos.lowerTick == tc.lowerTick && pos.upperTick == tc.upperTick { liq = DefaultLiquidityAmt.Mul(sdk.NewDec(2)) } - s.validatePositionFeeAccUpdate(s.Ctx, pool.GetId(), owner, pos.lowerTick, pos.upperTick, liq) + s.validatePositionFeeAccUpdate(s.Ctx, pool.GetId(), owner, pos.lowerTick, pos.upperTick, pos.frozenUntil, liq) } } } diff --git a/x/concentrated-liquidity/keeper_test.go b/x/concentrated-liquidity/keeper_test.go index 1c01ab78ae1..37bf05a366c 100644 --- a/x/concentrated-liquidity/keeper_test.go +++ b/x/concentrated-liquidity/keeper_test.go @@ -103,21 +103,21 @@ func (s *KeeperTestSuite) initializeTick(ctx sdk.Context, tickIndex int64, initi } // initializeFeeAccumulatorPositionWithLiquidity initializes fee accumulator position with given parameters and updates it with given liquidity. -func (s *KeeperTestSuite) initializeFeeAccumulatorPositionWithLiquidity(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, liquidity sdk.Dec) { - err := s.App.ConcentratedLiquidityKeeper.InitializeFeeAccumulatorPosition(ctx, poolId, owner, lowerTick, upperTick) +func (s *KeeperTestSuite) initializeFeeAccumulatorPositionWithLiquidity(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time, liquidity sdk.Dec) { + err := s.App.ConcentratedLiquidityKeeper.InitializeFeeAccumulatorPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) s.Require().NoError(err) - err = s.App.ConcentratedLiquidityKeeper.UpdateFeeAccumulatorPosition(ctx, poolId, owner, liquidity, lowerTick, upperTick) + err = s.App.ConcentratedLiquidityKeeper.UpdateFeeAccumulatorPosition(ctx, poolId, owner, liquidity, lowerTick, upperTick, frozenUntil) s.Require().NoError(err) } // validatePositionFeeAccUpdate validates that the position's accumulator with given parameters // has been updated with liquidity. -func (s *KeeperTestSuite) validatePositionFeeAccUpdate(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64, liquidity sdk.Dec) { +func (s *KeeperTestSuite) validatePositionFeeAccUpdate(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64, frozenUntil time.Time, liquidity sdk.Dec) { accum, err := s.App.ConcentratedLiquidityKeeper.GetFeeAccumulator(ctx, poolId) s.Require().NoError(err) - accumulatorPosition, err := accum.GetPositionSize(cl.FormatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick)) + accumulatorPosition, err := accum.GetPositionSize(cl.FormatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick, frozenUntil)) s.Require().NoError(err) s.Require().Equal(liquidity.String(), accumulatorPosition.String()) diff --git a/x/concentrated-liquidity/lp.go b/x/concentrated-liquidity/lp.go index 0a54ccfddb1..69b6d32db09 100644 --- a/x/concentrated-liquidity/lp.go +++ b/x/concentrated-liquidity/lp.go @@ -65,7 +65,7 @@ func (k Keeper) CreatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddr // If this is a new position, initialize the fee accumulator for the position. if !k.hasPosition(cacheCtx, poolId, owner, lowerTick, upperTick, frozenUntil) { - if err := k.initializeFeeAccumulatorPosition(cacheCtx, poolId, owner, lowerTick, upperTick); err != nil { + if err := k.initializeFeeAccumulatorPosition(cacheCtx, poolId, owner, lowerTick, upperTick, frozenUntil); err != nil { return sdk.Int{}, sdk.Int{}, sdk.Dec{}, err } } @@ -213,7 +213,7 @@ func (k Keeper) updatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddr } // TODO: test https://github.com/osmosis-labs/osmosis/issues/3997 - if err := k.updateFeeAccumulatorPosition(ctx, poolId, owner, liquidityDelta, lowerTick, upperTick); err != nil { + if err := k.updateFeeAccumulatorPosition(ctx, poolId, owner, liquidityDelta, lowerTick, upperTick, frozenUntil); err != nil { return sdk.Int{}, sdk.Int{}, err } diff --git a/x/concentrated-liquidity/lp_test.go b/x/concentrated-liquidity/lp_test.go index ef2971bb092..5a503f5a17b 100644 --- a/x/concentrated-liquidity/lp_test.go +++ b/x/concentrated-liquidity/lp_test.go @@ -279,7 +279,7 @@ func (s *KeeperTestSuite) TestCreatePosition() { // Check position state s.validatePositionUpdate(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.frozenUntil, tc.liquidityAmount) - s.validatePositionFeeAccUpdate(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.liquidityAmount) + s.validatePositionFeeAccUpdate(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.frozenUntil, tc.liquidityAmount) // Check tick state s.validateTickUpdates(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.liquidityAmount, tc.expectedFeeGrowthOutsideLower, tc.expectedFeeGrowthOutsideUpper) diff --git a/x/concentrated-liquidity/types/keys.go b/x/concentrated-liquidity/types/keys.go index 417d55dafb7..11725f7973e 100644 --- a/x/concentrated-liquidity/types/keys.go +++ b/x/concentrated-liquidity/types/keys.go @@ -69,30 +69,12 @@ func KeyTickPrefix(poolId uint64) []byte { // KeyFullPosition uses pool Id, owner, lower tick, upper tick, and frozenUntil for keys func KeyFullPosition(poolId uint64, addr sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) []byte { frozenUntilKey := osmoutils.FormatTimeString(frozenUntil) - //addrKey := address.MustLengthPrefix(addr.Bytes()) - // var key []byte - // key = append(key, PositionPrefix...) - // key = append(key, sdk.Uint64ToBigEndian(poolId)...) - // key = append(key, addr.Bytes()...) - // key = append(key, sdk.Uint64ToBigEndian(uint64(lowerTick))...) - // key = append(key, sdk.Uint64ToBigEndian(uint64(upperTick))...) - // key = append(key, frozenUntilKey...) - // return key - // frozenUntilKey := osmoutils.FormatTimeString(frozenUntil) addrKey := address.MustLengthPrefix(addr.Bytes()) return []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d%s%s", PositionPrefix, KeySeparator, addrKey, KeySeparator, poolId, KeySeparator, lowerTick, KeySeparator, upperTick, KeySeparator, frozenUntilKey)) } // KeyPosition uses pool Id, owner, lower tick and upper tick for keys func KeyPosition(poolId uint64, addr sdk.AccAddress, lowerTick, upperTick int64) []byte { - //addrKey := address.MustLengthPrefix(addr.Bytes()) - // var key []byte - // key = append(key, PositionPrefix...) - // key = append(key, sdk.Uint64ToBigEndian(poolId)...) - // key = append(key, addr.Bytes()...) - // key = append(key, sdk.Uint64ToBigEndian(uint64(lowerTick))...) - // key = append(key, sdk.Uint64ToBigEndian(uint64(upperTick))...) - // return key addrKey := address.MustLengthPrefix(addr.Bytes()) return []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d", PositionPrefix, KeySeparator, addrKey, KeySeparator, poolId, KeySeparator, lowerTick, KeySeparator, upperTick)) } From 79017a358f35ed88b53e2a76921f114076ffabb0 Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Thu, 26 Jan 2023 12:49:12 -0600 Subject: [PATCH 007/136] lint --- x/concentrated-liquidity/fees.go | 1 - 1 file changed, 1 deletion(-) diff --git a/x/concentrated-liquidity/fees.go b/x/concentrated-liquidity/fees.go index e4fd19a6ff6..11b25c37681 100644 --- a/x/concentrated-liquidity/fees.go +++ b/x/concentrated-liquidity/fees.go @@ -202,7 +202,6 @@ func (k Keeper) collectFees(ctx sdk.Context, poolId uint64, owner sdk.AccAddress var totalFeesClaimed sdk.Coins for _, position := range positions { - positionKey := formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick, position.FrozenUntil) hasPosition, err := feeAccumulator.HasPosition(positionKey) From 8e68719c58d6f19eb25c27e6e36d93752c460b9c Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Thu, 26 Jan 2023 13:00:28 -0600 Subject: [PATCH 008/136] fix test errors --- x/concentrated-liquidity/fees.go | 2 +- x/concentrated-liquidity/lp_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x/concentrated-liquidity/fees.go b/x/concentrated-liquidity/fees.go index 11b25c37681..58788e7e37a 100644 --- a/x/concentrated-liquidity/fees.go +++ b/x/concentrated-liquidity/fees.go @@ -195,7 +195,7 @@ func (k Keeper) collectFees(ctx sdk.Context, poolId uint64, owner sdk.AccAddress return sdk.Coins{}, err } - if positions == nil { + if len(positions) == 0 { return sdk.Coins{}, cltypes.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick} } diff --git a/x/concentrated-liquidity/lp_test.go b/x/concentrated-liquidity/lp_test.go index 5a503f5a17b..91657757c8a 100644 --- a/x/concentrated-liquidity/lp_test.go +++ b/x/concentrated-liquidity/lp_test.go @@ -830,7 +830,7 @@ func (s *KeeperTestSuite) TestUpdatePosition() { DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, - s.Ctx.BlockTime().Add(DefaultFreezeDuration), + defaultFrozenUntil, ) s.Require().NoError(err) From b221dcfb625ef799871bf379f922cf21d71908f1 Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Thu, 26 Jan 2023 16:13:53 -0600 Subject: [PATCH 009/136] clean up --- x/concentrated-liquidity/fees.go | 25 ++++++++++++++----------- x/concentrated-liquidity/fees_test.go | 10 +++++----- x/concentrated-liquidity/position.go | 2 +- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/x/concentrated-liquidity/fees.go b/x/concentrated-liquidity/fees.go index 58788e7e37a..dd1f64dbc23 100644 --- a/x/concentrated-liquidity/fees.go +++ b/x/concentrated-liquidity/fees.go @@ -92,7 +92,7 @@ func (k Keeper) initializeFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, return nil } -// updateFeeAccumulatorPosition updates the fee accumulator position for a given pool, owner, and tick range. +// updateFeeAccumulatorPosition updates the fee accumulator position for a given pool, owner, tick range, and frozenUntil time. // It retrieves the current fee growth outside of the given tick range and updates the position's accumulator // with the provided liquidity delta and the retrieved fee growth outside. func (k Keeper) updateFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, liquidityDelta sdk.Dec, lowerTick int64, upperTick int64, frozenUntil time.Time) error { @@ -190,6 +190,8 @@ func (k Keeper) collectFees(ctx sdk.Context, poolId uint64, owner sdk.AccAddress return sdk.Coins{}, err } + // There may be multiple positions with the same lower and upper tick, but different frozenUntil times. + // We retrieve all of them and claim fees for each one. positions, err := k.getAllPositionsWithVaryingFreezeTimes(ctx, poolId, owner, lowerTick, upperTick) if err != nil { return sdk.Coins{}, err @@ -231,19 +233,20 @@ func (k Keeper) collectFees(ctx sdk.Context, poolId uint64, owner sdk.AccAddress return sdk.Coins{}, err } + // Update total fees claim counter totalFeesClaimed = totalFeesClaimed.Add(feesClaimed...) - - pool, err := k.getPoolById(ctx, poolId) - if err != nil { - return sdk.Coins{}, err - } - - // distribute the fees from pool to the position owner. - if err := k.bankKeeper.SendCoins(ctx, pool.GetAddress(), owner, feesClaimed); err != nil { - return sdk.Coins{}, err - } } + // Once we have iterated through all the positions, we do a single bank send from the pool to the owner. + pool, err := k.getPoolById(ctx, poolId) + if err != nil { + return sdk.Coins{}, err + } + fmt.Println("test1") + if err := k.bankKeeper.SendCoins(ctx, pool.GetAddress(), owner, totalFeesClaimed); err != nil { + return sdk.Coins{}, err + } + fmt.Println("test2") return totalFeesClaimed, nil } diff --git a/x/concentrated-liquidity/fees_test.go b/x/concentrated-liquidity/fees_test.go index 2d044672844..34d9c5ffe3a 100644 --- a/x/concentrated-liquidity/fees_test.go +++ b/x/concentrated-liquidity/fees_test.go @@ -620,7 +620,7 @@ func (s *KeeperTestSuite) TestCollectFees() { // error cases. - "invalid pool id given": { + "accumulator does not exist": { initialLiquidity: sdk.OneDec(), lowerTickFeeGrowthOutside: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(0))), @@ -636,7 +636,7 @@ func (s *KeeperTestSuite) TestCollectFees() { currentTick: 2, isInvalidPoolIdGiven: true, - expectedError: cltypes.PoolNotFoundError{PoolId: 2}, + expectedError: accum.AccumDoesNotExistError{AccumName: "fee/2"}, }, "position does not exist": { initialLiquidity: sdk.OneDec(), @@ -673,9 +673,9 @@ func (s *KeeperTestSuite) TestCollectFees() { // Position needs to be set in the store before calling CollectFees. // This is because we iterate through all positions instead of having to call each position with separate frozenUntil times. position := model.Position{Liquidity: tc.initialLiquidity, FrozenUntil: tc.frozenUntil} - s.App.ConcentratedLiquidityKeeper.SetPosition(ctx, validPoolId, tc.owner, tc.lowerTick, tc.upperTick, &position, tc.frozenUntil) + s.App.ConcentratedLiquidityKeeper.SetPosition(ctx, validPoolId, ownerWithValidPosition, tc.lowerTick, tc.upperTick, &position, tc.frozenUntil) - s.initializeFeeAccumulatorPositionWithLiquidity(ctx, validPoolId, tc.owner, tc.lowerTick, tc.upperTick, tc.frozenUntil, tc.initialLiquidity) + s.initializeFeeAccumulatorPositionWithLiquidity(ctx, validPoolId, ownerWithValidPosition, tc.lowerTick, tc.upperTick, tc.frozenUntil, tc.initialLiquidity) s.initializeTick(ctx, tc.lowerTick, tc.initialLiquidity, tc.lowerTickFeeGrowthOutside, false) @@ -705,7 +705,7 @@ func (s *KeeperTestSuite) TestCollectFees() { if tc.expectedError != nil { s.Require().Error(err) - s.Require().ErrorAs(err, &tc.expectedError) + s.Require().ErrorContains(err, tc.expectedError.Error()) s.Require().Equal(sdk.Coins{}, actualFeesClaimed) // balances are unchanged diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 41b6065ceb8..7342199fe7d 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -72,7 +72,7 @@ func (k Keeper) hasPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress return store.Has(key) } -// GetPosition checks if a position exists at the provided upper and lower ticks for the given owner. Returns position if found. +// GetPosition checks if a position exists at the provided upper and lower ticks and frozenUntil time for the given owner. Returns position if found. func (k Keeper) GetPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) (*model.Position, error) { store := ctx.KVStore(k.storeKey) positionStruct := &model.Position{} From d2ede58919b11c3911911c49ad5f95ec5db613dd Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Thu, 26 Jan 2023 16:41:31 -0600 Subject: [PATCH 010/136] remove print lines --- x/concentrated-liquidity/fees.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/x/concentrated-liquidity/fees.go b/x/concentrated-liquidity/fees.go index dd1f64dbc23..724e814109f 100644 --- a/x/concentrated-liquidity/fees.go +++ b/x/concentrated-liquidity/fees.go @@ -242,11 +242,9 @@ func (k Keeper) collectFees(ctx sdk.Context, poolId uint64, owner sdk.AccAddress if err != nil { return sdk.Coins{}, err } - fmt.Println("test1") if err := k.bankKeeper.SendCoins(ctx, pool.GetAddress(), owner, totalFeesClaimed); err != nil { return sdk.Coins{}, err } - fmt.Println("test2") return totalFeesClaimed, nil } From a515d5dfb8ea1c8cbf8aa4e05a7d6948be415c09 Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Thu, 26 Jan 2023 22:11:30 -0600 Subject: [PATCH 011/136] feat: single fee accum (#4116) * single fee accum * lint --- x/concentrated-liquidity/export_test.go | 16 +++--- x/concentrated-liquidity/fees.go | 70 +++++++++++-------------- x/concentrated-liquidity/fees_test.go | 12 ++--- x/concentrated-liquidity/keeper_test.go | 8 +-- x/concentrated-liquidity/lp.go | 10 ++-- x/concentrated-liquidity/lp_test.go | 2 +- x/concentrated-liquidity/position.go | 4 +- 7 files changed, 59 insertions(+), 63 deletions(-) diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index 7dd1a5c4f91..8832328df1d 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -25,8 +25,8 @@ func (k Keeper) SetPool(ctx sdk.Context, pool types.ConcentratedPoolExtension) e return k.setPool(ctx, pool) } -func (k Keeper) HasPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) bool { - return k.hasPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) +func (k Keeper) HasFullPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) bool { + return k.hasFullPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) } func (k Keeper) DeletePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) error { @@ -110,12 +110,12 @@ func (k Keeper) GetFeeAccumulator(ctx sdk.Context, poolId uint64) (accum.Accumul return k.getFeeAccumulator(ctx, poolId) } -func (k Keeper) InitializeFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) error { - return k.initializeFeeAccumulatorPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) +func (k Keeper) InitializeFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64) error { + return k.initializeFeeAccumulatorPosition(ctx, poolId, owner, lowerTick, upperTick) } -func (k Keeper) UpdateFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, liquidityDelta sdk.Dec, lowerTick int64, upperTick int64, frozenUntil time.Time) error { - return k.updateFeeAccumulatorPosition(ctx, poolId, owner, liquidityDelta, lowerTick, upperTick, frozenUntil) +func (k Keeper) UpdateFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, liquidityDelta sdk.Dec, lowerTick int64, upperTick int64) error { + return k.updateFeeAccumulatorPosition(ctx, poolId, owner, liquidityDelta, lowerTick, upperTick) } func (k Keeper) GetFeeGrowthOutside(ctx sdk.Context, poolId uint64, lowerTick, upperTick int64) (sdk.DecCoins, error) { @@ -138,6 +138,6 @@ func (k Keeper) ChargeFee(ctx sdk.Context, poolId uint64, feeUpdate sdk.DecCoin) return k.chargeFee(ctx, poolId, feeUpdate) } -func FormatPositionAccumulatorKey(poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) string { - return formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick, frozenUntil) +func FormatPositionAccumulatorKey(poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64) string { + return formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick) } diff --git a/x/concentrated-liquidity/fees.go b/x/concentrated-liquidity/fees.go index 724e814109f..cd3449debdc 100644 --- a/x/concentrated-liquidity/fees.go +++ b/x/concentrated-liquidity/fees.go @@ -4,7 +4,6 @@ import ( "fmt" "strconv" "strings" - "time" sdk "github.com/cosmos/cosmos-sdk/types" @@ -65,14 +64,14 @@ func (k Keeper) chargeFee(ctx sdk.Context, poolId uint64, feeUpdate sdk.DecCoin) // - fails to get an accumulator for a given poold id // - attempts to re-initialize an existing fee accumulator liqudity position // - fails to create a position -func (k Keeper) initializeFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) error { +func (k Keeper) initializeFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64) error { // get fee accumulator for the pool feeAccumulator, err := k.getFeeAccumulator(ctx, poolId) if err != nil { return err } - positionKey := formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick, frozenUntil) + positionKey := formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick) hasPosition, err := feeAccumulator.HasPosition(positionKey) if err != nil { @@ -92,10 +91,10 @@ func (k Keeper) initializeFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, return nil } -// updateFeeAccumulatorPosition updates the fee accumulator position for a given pool, owner, tick range, and frozenUntil time. +// updateFeeAccumulatorPosition updates the fee accumulator position for a given pool, owner, and tick range. // It retrieves the current fee growth outside of the given tick range and updates the position's accumulator // with the provided liquidity delta and the retrieved fee growth outside. -func (k Keeper) updateFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, liquidityDelta sdk.Dec, lowerTick int64, upperTick int64, frozenUntil time.Time) error { +func (k Keeper) updateFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, liquidityDelta sdk.Dec, lowerTick int64, upperTick int64) error { feeGrowthOutside, err := k.getFeeGrowthOutside(ctx, poolId, lowerTick, upperTick) if err != nil { return err @@ -108,7 +107,7 @@ func (k Keeper) updateFeeAccumulatorPosition(ctx sdk.Context, poolId uint64, own // replace position's accumulator with the updated liquidity and the feeGrowthOutside err = feeAccumulator.UpdatePositionCustomAcc( - formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick, frozenUntil), + formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick), liquidityDelta, feeGrowthOutside) if err != nil { @@ -201,40 +200,33 @@ func (k Keeper) collectFees(ctx sdk.Context, poolId uint64, owner sdk.AccAddress return sdk.Coins{}, cltypes.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick} } - var totalFeesClaimed sdk.Coins + positionKey := formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick) - for _, position := range positions { - positionKey := formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick, position.FrozenUntil) - - hasPosition, err := feeAccumulator.HasPosition(positionKey) - if err != nil { - return sdk.Coins{}, err - } - - if !hasPosition { - return sdk.Coins{}, cltypes.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick} - } + hasPosition, err := feeAccumulator.HasPosition(positionKey) + if err != nil { + return sdk.Coins{}, err + } - // compute fee growth outside of the range between lower tick and upper tick. - feeGrowthOutside, err := k.getFeeGrowthOutside(ctx, poolId, lowerTick, upperTick) - if err != nil { - return sdk.Coins{}, err - } + if !hasPosition { + return sdk.Coins{}, cltypes.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick} + } - // We need to update the position's accumulator to the current fee growth outside - // before we claim rewards. - if err := feeAccumulator.SetPositionCustomAcc(positionKey, feeGrowthOutside); err != nil { - return sdk.Coins{}, err - } + // compute fee growth outside of the range between lower tick and upper tick. + feeGrowthOutside, err := k.getFeeGrowthOutside(ctx, poolId, lowerTick, upperTick) + if err != nil { + return sdk.Coins{}, err + } - // claim fees. - feesClaimed, err := feeAccumulator.ClaimRewards(positionKey) - if err != nil { - return sdk.Coins{}, err - } + // We need to update the position's accumulator to the current fee growth outside + // before we claim rewards. + if err := feeAccumulator.SetPositionCustomAcc(positionKey, feeGrowthOutside); err != nil { + return sdk.Coins{}, err + } - // Update total fees claim counter - totalFeesClaimed = totalFeesClaimed.Add(feesClaimed...) + // claim fees. + feesClaimed, err := feeAccumulator.ClaimRewards(positionKey) + if err != nil { + return sdk.Coins{}, err } // Once we have iterated through all the positions, we do a single bank send from the pool to the owner. @@ -242,10 +234,10 @@ func (k Keeper) collectFees(ctx sdk.Context, poolId uint64, owner sdk.AccAddress if err != nil { return sdk.Coins{}, err } - if err := k.bankKeeper.SendCoins(ctx, pool.GetAddress(), owner, totalFeesClaimed); err != nil { + if err := k.bankKeeper.SendCoins(ctx, pool.GetAddress(), owner, feesClaimed); err != nil { return sdk.Coins{}, err } - return totalFeesClaimed, nil + return feesClaimed, nil } func getFeeAccumulatorName(poolId uint64) string { @@ -269,6 +261,6 @@ func calculateFeeGrowth(targetTick int64, feeGrowthOutside sdk.DecCoins, current // formatPositionAccumulatorKey formats the position accumulator key prefixed by pool id, owner, lower tick // and upper tick with a key separator in-between. // nolint: unused -func formatPositionAccumulatorKey(poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) string { - return strings.Join([]string{strconv.FormatUint(poolId, uintBase), owner.String(), strconv.FormatInt(lowerTick, uintBase), strconv.FormatInt(upperTick, uintBase), frozenUntil.String()}, keySeparator) +func formatPositionAccumulatorKey(poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64) string { + return strings.Join([]string{strconv.FormatUint(poolId, uintBase), owner.String(), strconv.FormatInt(lowerTick, uintBase), strconv.FormatInt(upperTick, uintBase)}, keySeparator) } diff --git a/x/concentrated-liquidity/fees_test.go b/x/concentrated-liquidity/fees_test.go index 34d9c5ffe3a..ad6abb2dc36 100644 --- a/x/concentrated-liquidity/fees_test.go +++ b/x/concentrated-liquidity/fees_test.go @@ -129,7 +129,7 @@ func (s *KeeperTestSuite) TestInitializeFeeAccumulatorPosition() { tc := tc s.Run(tc.name, func() { // system under test - err := clKeeper.InitializeFeeAccumulatorPosition(s.Ctx, tc.positionId.poolId, tc.positionId.owner, tc.positionId.lowerTick, tc.positionId.upperTick, tc.positionId.frozenUntil) + err := clKeeper.InitializeFeeAccumulatorPosition(s.Ctx, tc.positionId.poolId, tc.positionId.owner, tc.positionId.lowerTick, tc.positionId.upperTick) if tc.expectedPass { s.Require().NoError(err) @@ -137,7 +137,7 @@ func (s *KeeperTestSuite) TestInitializeFeeAccumulatorPosition() { poolFeeAccumulator, err := clKeeper.GetFeeAccumulator(s.Ctx, defaultPoolId) s.Require().NoError(err) - positionKey := cl.FormatPositionAccumulatorKey(tc.positionId.poolId, tc.positionId.owner, tc.positionId.lowerTick, tc.positionId.upperTick, tc.positionId.frozenUntil) + positionKey := cl.FormatPositionAccumulatorKey(tc.positionId.poolId, tc.positionId.owner, tc.positionId.lowerTick, tc.positionId.upperTick) positionSize, err := poolFeeAccumulator.GetPositionSize(positionKey) s.Require().NoError(err) @@ -675,7 +675,7 @@ func (s *KeeperTestSuite) TestCollectFees() { position := model.Position{Liquidity: tc.initialLiquidity, FrozenUntil: tc.frozenUntil} s.App.ConcentratedLiquidityKeeper.SetPosition(ctx, validPoolId, ownerWithValidPosition, tc.lowerTick, tc.upperTick, &position, tc.frozenUntil) - s.initializeFeeAccumulatorPositionWithLiquidity(ctx, validPoolId, ownerWithValidPosition, tc.lowerTick, tc.upperTick, tc.frozenUntil, tc.initialLiquidity) + s.initializeFeeAccumulatorPositionWithLiquidity(ctx, validPoolId, ownerWithValidPosition, tc.lowerTick, tc.upperTick, tc.initialLiquidity) s.initializeTick(ctx, tc.lowerTick, tc.initialLiquidity, tc.lowerTickFeeGrowthOutside, false) @@ -803,7 +803,7 @@ func (s *KeeperTestSuite) TestUpdateFeeAccumulatorPosition() { lowerTick: DefaultLowerTick - 1, upperTick: DefaultUpperTick, frozenUntil: defaultFrozenUntil, - expectedError: accum.NoPositionError{Name: cl.FormatPositionAccumulatorKey(1, ownerOne, DefaultLowerTick-1, DefaultUpperTick, defaultFrozenUntil)}, + expectedError: accum.NoPositionError{Name: cl.FormatPositionAccumulatorKey(1, ownerOne, DefaultLowerTick-1, DefaultUpperTick)}, }, } @@ -822,14 +822,14 @@ func (s *KeeperTestSuite) TestUpdateFeeAccumulatorPosition() { for _, pos := range positions { for _, pool := range pools { for _, owner := range owners { - s.initializeFeeAccumulatorPositionWithLiquidity(s.Ctx, pool.GetId(), owner, pos.lowerTick, pos.upperTick, pos.frozenUntil, DefaultLiquidityAmt) + s.initializeFeeAccumulatorPositionWithLiquidity(s.Ctx, pool.GetId(), owner, pos.lowerTick, pos.upperTick, DefaultLiquidityAmt) } } } // System under test // Update one of the positions as per the test case - err := s.App.ConcentratedLiquidityKeeper.UpdateFeeAccumulatorPosition(s.Ctx, tc.poolId, tc.owner, tc.liquidity, tc.lowerTick, tc.upperTick, tc.frozenUntil) + err := s.App.ConcentratedLiquidityKeeper.UpdateFeeAccumulatorPosition(s.Ctx, tc.poolId, tc.owner, tc.liquidity, tc.lowerTick, tc.upperTick) if tc.expectedError != nil { s.Require().Error(err) diff --git a/x/concentrated-liquidity/keeper_test.go b/x/concentrated-liquidity/keeper_test.go index 37bf05a366c..7719bd897a0 100644 --- a/x/concentrated-liquidity/keeper_test.go +++ b/x/concentrated-liquidity/keeper_test.go @@ -103,11 +103,11 @@ func (s *KeeperTestSuite) initializeTick(ctx sdk.Context, tickIndex int64, initi } // initializeFeeAccumulatorPositionWithLiquidity initializes fee accumulator position with given parameters and updates it with given liquidity. -func (s *KeeperTestSuite) initializeFeeAccumulatorPositionWithLiquidity(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time, liquidity sdk.Dec) { - err := s.App.ConcentratedLiquidityKeeper.InitializeFeeAccumulatorPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) +func (s *KeeperTestSuite) initializeFeeAccumulatorPositionWithLiquidity(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, liquidity sdk.Dec) { + err := s.App.ConcentratedLiquidityKeeper.InitializeFeeAccumulatorPosition(ctx, poolId, owner, lowerTick, upperTick) s.Require().NoError(err) - err = s.App.ConcentratedLiquidityKeeper.UpdateFeeAccumulatorPosition(ctx, poolId, owner, liquidity, lowerTick, upperTick, frozenUntil) + err = s.App.ConcentratedLiquidityKeeper.UpdateFeeAccumulatorPosition(ctx, poolId, owner, liquidity, lowerTick, upperTick) s.Require().NoError(err) } @@ -117,7 +117,7 @@ func (s *KeeperTestSuite) validatePositionFeeAccUpdate(ctx sdk.Context, poolId u accum, err := s.App.ConcentratedLiquidityKeeper.GetFeeAccumulator(ctx, poolId) s.Require().NoError(err) - accumulatorPosition, err := accum.GetPositionSize(cl.FormatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick, frozenUntil)) + accumulatorPosition, err := accum.GetPositionSize(cl.FormatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick)) s.Require().NoError(err) s.Require().Equal(liquidity.String(), accumulatorPosition.String()) diff --git a/x/concentrated-liquidity/lp.go b/x/concentrated-liquidity/lp.go index 69b6d32db09..aa19c167325 100644 --- a/x/concentrated-liquidity/lp.go +++ b/x/concentrated-liquidity/lp.go @@ -64,8 +64,12 @@ func (k Keeper) CreatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddr } // If this is a new position, initialize the fee accumulator for the position. - if !k.hasPosition(cacheCtx, poolId, owner, lowerTick, upperTick, frozenUntil) { - if err := k.initializeFeeAccumulatorPosition(cacheCtx, poolId, owner, lowerTick, upperTick, frozenUntil); err != nil { + positions, err := k.getAllPositionsWithVaryingFreezeTimes(ctx, poolId, owner, lowerTick, upperTick) + if err != nil { + return sdk.Int{}, sdk.Int{}, sdk.Dec{}, err + } + if len(positions) == 0 { + if err := k.initializeFeeAccumulatorPosition(cacheCtx, poolId, owner, lowerTick, upperTick); err != nil { return sdk.Int{}, sdk.Int{}, sdk.Dec{}, err } } @@ -213,7 +217,7 @@ func (k Keeper) updatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddr } // TODO: test https://github.com/osmosis-labs/osmosis/issues/3997 - if err := k.updateFeeAccumulatorPosition(ctx, poolId, owner, liquidityDelta, lowerTick, upperTick, frozenUntil); err != nil { + if err := k.updateFeeAccumulatorPosition(ctx, poolId, owner, liquidityDelta, lowerTick, upperTick); err != nil { return sdk.Int{}, sdk.Int{}, err } diff --git a/x/concentrated-liquidity/lp_test.go b/x/concentrated-liquidity/lp_test.go index 91657757c8a..b187031e85d 100644 --- a/x/concentrated-liquidity/lp_test.go +++ b/x/concentrated-liquidity/lp_test.go @@ -273,7 +273,7 @@ func (s *KeeperTestSuite) TestCreatePosition() { s.Require().Equal(userBalancePrePositionCreation.Sub(sdk.NewCoins(sdk.NewCoin(ETH, asset0), (sdk.NewCoin(USDC, asset1)))).String(), userBalancePostPositionCreation.String()) s.Require().Equal(poolBalancePrePositionCreation.Add(sdk.NewCoin(ETH, asset0), (sdk.NewCoin(USDC, asset1))).String(), poolBalancePostPositionCreation.String()) - hasPosition := clKeeper.HasPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.frozenUntil) + hasPosition := clKeeper.HasFullPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.frozenUntil) s.Require().True(hasPosition) // Check position state diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 7342199fe7d..13814987ee2 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -21,7 +21,7 @@ func (k Keeper) getOrInitPosition( if !k.poolExists(ctx, poolId) { return nil, types.PoolNotFoundError{PoolId: poolId} } - if k.hasPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) { + if k.hasFullPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) { position, err := k.GetPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) if err != nil { return nil, err @@ -66,7 +66,7 @@ func (k Keeper) initOrUpdatePosition( return nil } -func (k Keeper) hasPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) bool { +func (k Keeper) hasFullPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) bool { store := ctx.KVStore(k.storeKey) key := types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil) return store.Has(key) From 838c2ab9855677769da8374c5abbf1dcca93537d Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Fri, 27 Jan 2023 10:18:18 -0600 Subject: [PATCH 012/136] no longer need to get all positions for fee --- x/concentrated-liquidity/fees.go | 11 ----------- x/concentrated-liquidity/fees_test.go | 6 ------ 2 files changed, 17 deletions(-) diff --git a/x/concentrated-liquidity/fees.go b/x/concentrated-liquidity/fees.go index cd3449debdc..8cc98e36bb6 100644 --- a/x/concentrated-liquidity/fees.go +++ b/x/concentrated-liquidity/fees.go @@ -189,17 +189,6 @@ func (k Keeper) collectFees(ctx sdk.Context, poolId uint64, owner sdk.AccAddress return sdk.Coins{}, err } - // There may be multiple positions with the same lower and upper tick, but different frozenUntil times. - // We retrieve all of them and claim fees for each one. - positions, err := k.getAllPositionsWithVaryingFreezeTimes(ctx, poolId, owner, lowerTick, upperTick) - if err != nil { - return sdk.Coins{}, err - } - - if len(positions) == 0 { - return sdk.Coins{}, cltypes.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick} - } - positionKey := formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick) hasPosition, err := feeAccumulator.HasPosition(positionKey) diff --git a/x/concentrated-liquidity/fees_test.go b/x/concentrated-liquidity/fees_test.go index ad6abb2dc36..0c87c63d2ef 100644 --- a/x/concentrated-liquidity/fees_test.go +++ b/x/concentrated-liquidity/fees_test.go @@ -8,7 +8,6 @@ import ( "github.com/osmosis-labs/osmosis/osmoutils/accum" cl "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/internal/math" - "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" clmodel "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" cltypes "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" @@ -670,11 +669,6 @@ func (s *KeeperTestSuite) TestCollectFees() { clKeeper := s.App.ConcentratedLiquidityKeeper ctx := s.Ctx - // Position needs to be set in the store before calling CollectFees. - // This is because we iterate through all positions instead of having to call each position with separate frozenUntil times. - position := model.Position{Liquidity: tc.initialLiquidity, FrozenUntil: tc.frozenUntil} - s.App.ConcentratedLiquidityKeeper.SetPosition(ctx, validPoolId, ownerWithValidPosition, tc.lowerTick, tc.upperTick, &position, tc.frozenUntil) - s.initializeFeeAccumulatorPositionWithLiquidity(ctx, validPoolId, ownerWithValidPosition, tc.lowerTick, tc.upperTick, tc.initialLiquidity) s.initializeTick(ctx, tc.lowerTick, tc.initialLiquidity, tc.lowerTickFeeGrowthOutside, false) From c75f16328ccea7abcbb26ca802a01251ffbfe71b Mon Sep 17 00:00:00 2001 From: alpo Date: Fri, 27 Jan 2023 13:55:14 -0800 Subject: [PATCH 013/136] incentive accum initialization --- x/concentrated-liquidity/incentives.go | 51 +++++++++++++++++++++ x/concentrated-liquidity/pool.go | 4 ++ x/concentrated-liquidity/pool_test.go | 8 ++++ x/concentrated-liquidity/types/constants.go | 4 ++ 4 files changed, 67 insertions(+) create mode 100644 x/concentrated-liquidity/incentives.go diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go new file mode 100644 index 00000000000..67a4294b34e --- /dev/null +++ b/x/concentrated-liquidity/incentives.go @@ -0,0 +1,51 @@ +package concentrated_liquidity + +import ( + "strconv" + "strings" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/osmosis-labs/osmosis/osmoutils/accum" + "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" +) + +const ( + uptimeAccumPrefix = "uptime" +) + +// createUptimeAccumulators creates accumulator objects in store for each supported uptime for the given poolId. +// The accumulators are initialized with the default (zero) values. +func (k Keeper) createUptimeAccumulators(ctx sdk.Context, poolId uint64) error { + for uptimeId := range types.SupportedUptimes { + err := accum.MakeAccumulator(ctx.KVStore(k.storeKey), getUptimeAccumulatorName(poolId, uint64(uptimeId))) + if err != nil { + return err + } + } + + return nil +} + +func getUptimeAccumulatorName(poolId uint64, uptimeId uint64) string { + poolIdStr := strconv.FormatUint(poolId, uintBase) + uptimeIdStr := strconv.FormatUint(uptimeId, uintBase) + return strings.Join([]string{uptimeAccumPrefix, uptimeIdStr, poolIdStr}, "/") +} + +// nolint: unused +// getUptimeAccumulators gets the uptime accumulator objects for the given poolId +// Returns error if accumulator for the given poolId does not exist. +func (k Keeper) GetUptimeAccumulators(ctx sdk.Context, poolId uint64) ([]accum.AccumulatorObject, error) { + accums := make([]accum.AccumulatorObject, len(types.SupportedUptimes)) + for uptimeId := range types.SupportedUptimes { + acc, err := accum.GetAccumulator(ctx.KVStore(k.storeKey), getUptimeAccumulatorName(poolId, uint64(uptimeId))) + if err != nil { + return []accum.AccumulatorObject{}, err + } + + accums[uptimeId] = acc + } + + return accums, nil +} diff --git a/x/concentrated-liquidity/pool.go b/x/concentrated-liquidity/pool.go index 1500b9ca3fa..4bf8c0974ae 100644 --- a/x/concentrated-liquidity/pool.go +++ b/x/concentrated-liquidity/pool.go @@ -23,6 +23,10 @@ func (k Keeper) InitializePool(ctx sdk.Context, poolI poolmanagertypes.PoolI, cr return err } + if err := k.createUptimeAccumulators(ctx, concentratedPool.GetId()); err != nil { + return err + } + tickSpacing := concentratedPool.GetTickSpacing() if !k.validateTickSpacing(ctx, tickSpacing) { diff --git a/x/concentrated-liquidity/pool_test.go b/x/concentrated-liquidity/pool_test.go index 48797fcb11a..d9f62ef84cd 100644 --- a/x/concentrated-liquidity/pool_test.go +++ b/x/concentrated-liquidity/pool_test.go @@ -85,6 +85,14 @@ func (s *KeeperTestSuite) TestInitializePool() { feeAccumulator, err := s.App.ConcentratedLiquidityKeeper.GetFeeAccumulator(s.Ctx, test.poolI.GetId()) s.Require().NoError(err) s.Require().Equal(sdk.DecCoins(nil), feeAccumulator.GetValue()) + + // Ensure that uptime accumulators have been properly initialized + uptimeAccumulators, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulators(s.Ctx, test.poolI.GetId()) + s.Require().NoError(err) + s.Require().Equal(len(types.SupportedUptimes), len(uptimeAccumulators)) + for _, uptimeAccumulator := range uptimeAccumulators { + s.Require().Equal(sdk.DecCoins(nil), uptimeAccumulator.GetValue()) + } } else { // Ensure specified error is returned s.Require().Error(err) diff --git a/x/concentrated-liquidity/types/constants.go b/x/concentrated-liquidity/types/constants.go index 6ad65deb877..75253605d78 100644 --- a/x/concentrated-liquidity/types/constants.go +++ b/x/concentrated-liquidity/types/constants.go @@ -1,6 +1,8 @@ package types import ( + "time" + sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -16,4 +18,6 @@ var ( ExponentAtPriceOneMin = sdk.NewInt(-12) MaxSpotPrice = sdk.MustNewDecFromStr("100000000000000000000000000000000000000") MinSpotPrice = sdk.MustNewDecFromStr("0.000000000000000001") + // Supported uptimes preset to 1 min, 1 hr, 1D, 1W + SupportedUptimes = []time.Duration{time.Minute, time.Hour, time.Hour * 24, time.Hour * 24 * 7} ) From 447967e101e5459ec32a35ebe508538f8733dea6 Mon Sep 17 00:00:00 2001 From: alpo Date: Fri, 27 Jan 2023 14:03:47 -0800 Subject: [PATCH 014/136] lint --- x/concentrated-liquidity/incentives.go | 2 +- x/concentrated-liquidity/pool_test.go | 1 - x/concentrated-liquidity/types/constants.go | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 67a4294b34e..8ec4d222ddc 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -23,7 +23,7 @@ func (k Keeper) createUptimeAccumulators(ctx sdk.Context, poolId uint64) error { return err } } - + return nil } diff --git a/x/concentrated-liquidity/pool_test.go b/x/concentrated-liquidity/pool_test.go index d9f62ef84cd..1fcdb463d41 100644 --- a/x/concentrated-liquidity/pool_test.go +++ b/x/concentrated-liquidity/pool_test.go @@ -24,7 +24,6 @@ func (s *KeeperTestSuite) TestOrderInitialPoolDenoms() { denom0, denom1, err = types.OrderInitialPoolDenoms("usdc", "usdc") s.Require().Error(err) - } func (s *KeeperTestSuite) TestInitializePool() { diff --git a/x/concentrated-liquidity/types/constants.go b/x/concentrated-liquidity/types/constants.go index 75253605d78..77b48a30cd7 100644 --- a/x/concentrated-liquidity/types/constants.go +++ b/x/concentrated-liquidity/types/constants.go @@ -19,5 +19,5 @@ var ( MaxSpotPrice = sdk.MustNewDecFromStr("100000000000000000000000000000000000000") MinSpotPrice = sdk.MustNewDecFromStr("0.000000000000000001") // Supported uptimes preset to 1 min, 1 hr, 1D, 1W - SupportedUptimes = []time.Duration{time.Minute, time.Hour, time.Hour * 24, time.Hour * 24 * 7} + SupportedUptimes = []time.Duration{time.Minute, time.Hour, time.Hour * 24, time.Hour * 24 * 7} ) From 0adb8013afed288c391723631dad5dcff110be97 Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Fri, 27 Jan 2023 20:40:05 -0600 Subject: [PATCH 015/136] Update x/concentrated-liquidity/store_test.go Co-authored-by: Sishir Giri --- x/concentrated-liquidity/store_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/store_test.go b/x/concentrated-liquidity/store_test.go index 6a33fb29a35..301376d3e7e 100644 --- a/x/concentrated-liquidity/store_test.go +++ b/x/concentrated-liquidity/store_test.go @@ -24,7 +24,7 @@ func (s *KeeperTestSuite) TestGetAllPositionsWithVaryingFreezeTimes() { tests := map[string]struct { setupPositions []position - expectedPositions []position + }{ "no positions": { setupPositions: []position{}, From 17f47fe6d0804faec4803caf34d61ee408b1b3d5 Mon Sep 17 00:00:00 2001 From: alpo Date: Sun, 29 Jan 2023 11:39:44 -0800 Subject: [PATCH 016/136] add lower level tests and make uptime accum access private --- x/concentrated-liquidity/export_test.go | 9 +++ x/concentrated-liquidity/incentives.go | 2 +- x/concentrated-liquidity/incentives_test.go | 89 +++++++++++++++++++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 x/concentrated-liquidity/incentives_test.go diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index 7dd1a5c4f91..d45b98c4f36 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -141,3 +141,12 @@ func (k Keeper) ChargeFee(ctx sdk.Context, poolId uint64, feeUpdate sdk.DecCoin) func FormatPositionAccumulatorKey(poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) string { return formatPositionAccumulatorKey(poolId, owner, lowerTick, upperTick, frozenUntil) } + +// incentive methods +func (k Keeper) CreateUptimeAccumulators(ctx sdk.Context, poolId uint64) error { + return k.createUptimeAccumulators(ctx, poolId) +} + +func (k Keeper) GetUptimeAccumulators(ctx sdk.Context, poolId uint64) ([]accum.AccumulatorObject, error) { + return k.getUptimeAccumulators(ctx, poolId) +} \ No newline at end of file diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 8ec4d222ddc..b773b582349 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -36,7 +36,7 @@ func getUptimeAccumulatorName(poolId uint64, uptimeId uint64) string { // nolint: unused // getUptimeAccumulators gets the uptime accumulator objects for the given poolId // Returns error if accumulator for the given poolId does not exist. -func (k Keeper) GetUptimeAccumulators(ctx sdk.Context, poolId uint64) ([]accum.AccumulatorObject, error) { +func (k Keeper) getUptimeAccumulators(ctx sdk.Context, poolId uint64) ([]accum.AccumulatorObject, error) { accums := make([]accum.AccumulatorObject, len(types.SupportedUptimes)) for uptimeId := range types.SupportedUptimes { acc, err := accum.GetAccumulator(ctx.KVStore(k.storeKey), getUptimeAccumulatorName(poolId, uint64(uptimeId))) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go new file mode 100644 index 00000000000..f92aef81ec5 --- /dev/null +++ b/x/concentrated-liquidity/incentives_test.go @@ -0,0 +1,89 @@ +package concentrated_liquidity_test + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + + cl "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity" + "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" +) + +var ( + defaultPoolId = uint64(1) +) + +func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { + // We expect there to be len(types.SupportedUptimes) number of initialized accumulators + // for a successful pool creation. We calculate this upfront to ensure test compatibility + // if the uptimes we support ever change. + curExpectedAccumValues := []sdk.DecCoins{} + for range types.SupportedUptimes { + curExpectedAccumValues = append(curExpectedAccumValues, cl.EmptyCoins) + } + s.Require().Equal(len(types.SupportedUptimes), len(curExpectedAccumValues)) + + type initUptimeAccumTest struct { + name string + poolId uint64 + initializePool bool + expectedAccumValues []sdk.DecCoins + + expectedPass bool + } + tests := []initUptimeAccumTest{ + { + name: "default pool setup", + poolId: defaultPoolId, + initializePool: true, + expectedAccumValues: curExpectedAccumValues, + expectedPass: true, + }, + { + name: "setup with different poolId", + poolId: defaultPoolId + 1, + initializePool: true, + expectedAccumValues: curExpectedAccumValues, + expectedPass: true, + }, + { + name: "pool not initialized", + initializePool: false, + poolId: defaultPoolId, + expectedAccumValues: []sdk.DecCoins{}, + expectedPass: false, + }, + } + + for _, tc := range tests { + tc := tc + s.Run(tc.name, func() { + s.SetupTest() + clKeeper := s.App.ConcentratedLiquidityKeeper + + // system under test + var err error + if tc.initializePool { + err = clKeeper.CreateUptimeAccumulators(s.Ctx, tc.poolId) + } + poolUptimeAccumulators, err := clKeeper.GetUptimeAccumulators(s.Ctx, tc.poolId) + + if tc.expectedPass { + s.Require().NoError(err) + + // ensure number of uptime accumulators match supported uptimes + s.Require().Equal(len(tc.expectedAccumValues), len(poolUptimeAccumulators)) + + // ensure that each uptime was initialized to the correct value (sdk.DecCoins(nil)) + accumValues := []sdk.DecCoins{} + for _, accum := range poolUptimeAccumulators { + accumValues = append(accumValues, accum.GetValue()) + } + s.Require().Equal(tc.expectedAccumValues, accumValues) + } else { + s.Require().Error(err) + + // ensure no accumulators exist for an uninitialized pool + s.Require().Equal(0, len(poolUptimeAccumulators)) + } + }) + } +} \ No newline at end of file From 75e0c1449b384878a0ed2ad92a6359048d3b2823 Mon Sep 17 00:00:00 2001 From: alpo Date: Sun, 29 Jan 2023 11:41:21 -0800 Subject: [PATCH 017/136] lint --- x/concentrated-liquidity/export_test.go | 6 ++-- x/concentrated-liquidity/incentives_test.go | 40 ++++++++++----------- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index d45b98c4f36..d8b7653f788 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -12,9 +12,7 @@ import ( poolmanagertypes "github.com/osmosis-labs/osmosis/v14/x/poolmanager/types" ) -var ( - EmptyCoins = emptyCoins -) +var EmptyCoins = emptyCoins // OrderInitialPoolDenoms sets the pool denoms of a cl pool func OrderInitialPoolDenoms(denom0, denom1 string) (string, string, error) { @@ -149,4 +147,4 @@ func (k Keeper) CreateUptimeAccumulators(ctx sdk.Context, poolId uint64) error { func (k Keeper) GetUptimeAccumulators(ctx sdk.Context, poolId uint64) ([]accum.AccumulatorObject, error) { return k.getUptimeAccumulators(ctx, poolId) -} \ No newline at end of file +} diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index f92aef81ec5..68711930e69 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -7,9 +7,7 @@ import ( "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" ) -var ( - defaultPoolId = uint64(1) -) +var defaultPoolId = uint64(1) func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { // We expect there to be len(types.SupportedUptimes) number of initialized accumulators @@ -22,34 +20,34 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { s.Require().Equal(len(types.SupportedUptimes), len(curExpectedAccumValues)) type initUptimeAccumTest struct { - name string - poolId uint64 - initializePool bool + name string + poolId uint64 + initializePool bool expectedAccumValues []sdk.DecCoins expectedPass bool } tests := []initUptimeAccumTest{ { - name: "default pool setup", - poolId: defaultPoolId, - initializePool: true, - expectedAccumValues: curExpectedAccumValues, - expectedPass: true, + name: "default pool setup", + poolId: defaultPoolId, + initializePool: true, + expectedAccumValues: curExpectedAccumValues, + expectedPass: true, }, { - name: "setup with different poolId", - poolId: defaultPoolId + 1, - initializePool: true, - expectedAccumValues: curExpectedAccumValues, - expectedPass: true, + name: "setup with different poolId", + poolId: defaultPoolId + 1, + initializePool: true, + expectedAccumValues: curExpectedAccumValues, + expectedPass: true, }, { - name: "pool not initialized", - initializePool: false, - poolId: defaultPoolId, + name: "pool not initialized", + initializePool: false, + poolId: defaultPoolId, expectedAccumValues: []sdk.DecCoins{}, - expectedPass: false, + expectedPass: false, }, } @@ -86,4 +84,4 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { } }) } -} \ No newline at end of file +} From 5f2e7a518cd81a2c539869567a766167b35ca766 Mon Sep 17 00:00:00 2001 From: alpo Date: Sun, 29 Jan 2023 12:12:18 -0800 Subject: [PATCH 018/136] add gotests for helper fn --- x/concentrated-liquidity/export_test.go | 4 ++ x/concentrated-liquidity/incentives.go | 2 +- x/concentrated-liquidity/incentives_test.go | 52 +++++++++++++++++---- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index d8b7653f788..8119127b2ce 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -148,3 +148,7 @@ func (k Keeper) CreateUptimeAccumulators(ctx sdk.Context, poolId uint64) error { func (k Keeper) GetUptimeAccumulators(ctx sdk.Context, poolId uint64) ([]accum.AccumulatorObject, error) { return k.getUptimeAccumulators(ctx, poolId) } + +func GetUptimeAccumulatorName(poolId, uptimeId uint64) string { + return getUptimeAccumulatorName(poolId, uptimeId) +} diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index b773b582349..9d8ad6b8055 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -30,7 +30,7 @@ func (k Keeper) createUptimeAccumulators(ctx sdk.Context, poolId uint64) error { func getUptimeAccumulatorName(poolId uint64, uptimeId uint64) string { poolIdStr := strconv.FormatUint(poolId, uintBase) uptimeIdStr := strconv.FormatUint(uptimeId, uintBase) - return strings.Join([]string{uptimeAccumPrefix, uptimeIdStr, poolIdStr}, "/") + return strings.Join([]string{uptimeAccumPrefix, poolIdStr, uptimeIdStr}, "/") } // nolint: unused diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 68711930e69..02c3bf0e074 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -20,30 +20,26 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { s.Require().Equal(len(types.SupportedUptimes), len(curExpectedAccumValues)) type initUptimeAccumTest struct { - name string poolId uint64 initializePool bool expectedAccumValues []sdk.DecCoins expectedPass bool } - tests := []initUptimeAccumTest{ - { - name: "default pool setup", + tests := map[string]initUptimeAccumTest{ + "default pool setup": { poolId: defaultPoolId, initializePool: true, expectedAccumValues: curExpectedAccumValues, expectedPass: true, }, - { - name: "setup with different poolId", + "setup with different poolId": { poolId: defaultPoolId + 1, initializePool: true, expectedAccumValues: curExpectedAccumValues, expectedPass: true, }, - { - name: "pool not initialized", + "pool not initialized": { initializePool: false, poolId: defaultPoolId, expectedAccumValues: []sdk.DecCoins{}, @@ -51,9 +47,9 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { }, } - for _, tc := range tests { + for name, tc := range tests { tc := tc - s.Run(tc.name, func() { + s.Run(name, func() { s.SetupTest() clKeeper := s.App.ConcentratedLiquidityKeeper @@ -85,3 +81,39 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { }) } } + +func (s *KeeperTestSuite) TestGetUptimeAccumulatorName() { + type getUptimeNameTest struct { + poolId uint64 + uptimeId uint64 + expectedAccumName string + } + tests := map[string]getUptimeNameTest{ + "pool id 1, uptime id 0": { + poolId: defaultPoolId, + uptimeId: uint64(0), + expectedAccumName: "uptime/1/0", + }, + "pool id 1, uptime id 999": { + poolId: defaultPoolId, + uptimeId: uint64(999), + expectedAccumName: "uptime/1/999", + }, + "pool id 999, uptime id 1": { + poolId: uint64(999), + uptimeId: uint64(1), + expectedAccumName: "uptime/999/1", + }, + } + + for name, tc := range tests { + tc := tc + s.Run(name, func() { + s.SetupTest() + + // system under test + accumName := cl.GetUptimeAccumulatorName(tc.poolId, tc.uptimeId) + s.Require().Equal(tc.expectedAccumName, accumName) + }) + } +} From 400ac3e5245238c656ba4b4d967068ff850bdca3 Mon Sep 17 00:00:00 2001 From: alpo <62043214+AlpinYukseloglu@users.noreply.github.com> Date: Sun, 29 Jan 2023 12:31:08 -0800 Subject: [PATCH 019/136] Update test to use existing variable Co-authored-by: Roman --- x/concentrated-liquidity/pool_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/pool_test.go b/x/concentrated-liquidity/pool_test.go index 1fcdb463d41..50c39c64c4c 100644 --- a/x/concentrated-liquidity/pool_test.go +++ b/x/concentrated-liquidity/pool_test.go @@ -90,7 +90,7 @@ func (s *KeeperTestSuite) TestInitializePool() { s.Require().NoError(err) s.Require().Equal(len(types.SupportedUptimes), len(uptimeAccumulators)) for _, uptimeAccumulator := range uptimeAccumulators { - s.Require().Equal(sdk.DecCoins(nil), uptimeAccumulator.GetValue()) + s.Require().Equal(cl.EmptyCoins, uptimeAccumulator.GetValue()) } } else { // Ensure specified error is returned From a4fbf0b7ca3156f7446f812a107e710d802ffeff Mon Sep 17 00:00:00 2001 From: alpo Date: Sun, 29 Jan 2023 15:10:51 -0800 Subject: [PATCH 020/136] create or update records upon position creation/update --- x/concentrated-liquidity/position.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 13814987ee2..47ae9351aad 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -6,6 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/osmosis-labs/osmosis/osmoutils" + "github.com/osmosis-labs/osmosis/osmoutils/accum" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" types "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" ) @@ -62,6 +63,33 @@ func (k Keeper) initOrUpdatePosition( // TODO: consider deleting position if liquidity becomes zero + // Create records for relevant uptime accumulators here. + for uptimeId, uptime := range types.SupportedUptimes { + if position.FrozenUntil.Sub(ctx.BlockTime()) >= uptime { + store := ctx.KVStore(k.storeKey) + + // TODO: move to getUptimeAccumulator helper + uptimeAccum, err := accum.GetAccumulator(store, getUptimeAccumulatorName(poolId, uint64(uptimeId))) + if err != nil { + return err + } + + positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil)) + recordExists, err := uptimeAccum.HasPosition(positionName) + if err != nil { + return err + } + + // If a record does not exist for this uptime accumulator, create a new position. + // Otherwise, add to existing record. + if !recordExists { + uptimeAccum.NewPosition(positionName, position.Liquidity, &accum.Options{}) + } else { + uptimeAccum.AddToPosition(positionName, position.Liquidity) + } + } + } + k.setPosition(ctx, poolId, owner, lowerTick, upperTick, position, frozenUntil) return nil } From c604659de5e55c336eeaaef43dcc318d5bfa558e Mon Sep 17 00:00:00 2001 From: alpo Date: Sun, 29 Jan 2023 19:32:35 -0800 Subject: [PATCH 021/136] add tests and clean up --- x/concentrated-liquidity/fees_test.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/x/concentrated-liquidity/fees_test.go b/x/concentrated-liquidity/fees_test.go index 2a50ad338eb..5c27e415ef0 100644 --- a/x/concentrated-liquidity/fees_test.go +++ b/x/concentrated-liquidity/fees_test.go @@ -387,7 +387,6 @@ func (s *KeeperTestSuite) TestCalculateFeeGrowth() { s.Require().Equal(feeGrowth, tc.expectedFeeGrowth) }) } - } func (suite *KeeperTestSuite) TestGetInitialFeeGrowthOutsideForTick() { @@ -464,6 +463,9 @@ func (suite *KeeperTestSuite) TestGetInitialFeeGrowthOutsideForTick() { suite.Require().NoError(err) // Setup test position to make sure that tick is initialized + // We also set up uptime accums to ensure position creation works as intended + err = clKeeper.CreateUptimeAccumulators(ctx, validPoolId) + suite.Require().NoError(err) suite.SetupDefaultPosition(validPoolId) err = clKeeper.ChargeFee(ctx, validPoolId, tc.initialGlobalFeeGrowth) @@ -556,9 +558,7 @@ func (suite *KeeperTestSuite) TestChargeFee() { } func (s *KeeperTestSuite) TestCollectFees() { - var ( - ownerWithValidPosition = s.TestAccs[0] - ) + ownerWithValidPosition := s.TestAccs[0] defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) tests := map[string]struct { @@ -949,5 +949,4 @@ func (s *KeeperTestSuite) TestUpdateFeeAccumulatorPosition() { } }) } - } From 1f75cead17782dca77ff4b7e4e7c82de94f1f1ec Mon Sep 17 00:00:00 2001 From: alpo Date: Sun, 29 Jan 2023 19:39:18 -0800 Subject: [PATCH 022/136] sync position-related changes --- x/concentrated-liquidity/position.go | 28 ++++++++++++----------- x/concentrated-liquidity/position_test.go | 17 +++++++++++++- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 47ae9351aad..6ad27db0a3d 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -64,31 +64,33 @@ func (k Keeper) initOrUpdatePosition( // TODO: consider deleting position if liquidity becomes zero // Create records for relevant uptime accumulators here. + uptimeAccumulators, err := k.getUptimeAccumulators(ctx, poolId) + if err != nil { + return err + } + for uptimeId, uptime := range types.SupportedUptimes { if position.FrozenUntil.Sub(ctx.BlockTime()) >= uptime { - store := ctx.KVStore(k.storeKey) - - // TODO: move to getUptimeAccumulator helper - uptimeAccum, err := accum.GetAccumulator(store, getUptimeAccumulatorName(poolId, uint64(uptimeId))) - if err != nil { - return err - } + curUptimeAccum := uptimeAccumulators[uptimeId] + // If a record does not exist for this uptime accumulator, create a new position. + // Otherwise, add to existing record. positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil)) - recordExists, err := uptimeAccum.HasPosition(positionName) + recordExists, err := curUptimeAccum.HasPosition(positionName) if err != nil { return err } - // If a record does not exist for this uptime accumulator, create a new position. - // Otherwise, add to existing record. if !recordExists { - uptimeAccum.NewPosition(positionName, position.Liquidity, &accum.Options{}) + err = curUptimeAccum.NewPosition(positionName, position.Liquidity, &accum.Options{}) } else { - uptimeAccum.AddToPosition(positionName, position.Liquidity) + err = curUptimeAccum.AddToPosition(positionName, position.Liquidity) + } + if err != nil { + return err } } - } + } k.setPosition(ctx, poolId, owner, lowerTick, upperTick, position, frozenUntil) return nil diff --git a/x/concentrated-liquidity/position_test.go b/x/concentrated-liquidity/position_test.go index 27965d747b8..5347debcf0f 100644 --- a/x/concentrated-liquidity/position_test.go +++ b/x/concentrated-liquidity/position_test.go @@ -129,6 +129,22 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { // Check that the initialized or updated position matches our expectation s.Require().Equal(test.expectedLiquidity, positionInfo.Liquidity) + + // Check that the relevant uptime accumulators were properly checkpointed + positionName := string(types.KeyFullPosition(validPoolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.frozenUntil)) + uptimeAccums, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulators(s.Ctx, test.param.poolId) + s.Require().NoError(err) + + // If frozen for more than a specific uptime's period, the record should exist + for uptimeId, uptime := range types.SupportedUptimes { + recordExists, err := uptimeAccums[uptimeId].HasPosition(positionName) + s.Require().NoError(err) + if test.param.frozenUntil.Sub(s.Ctx.BlockTime()) >= uptime { + s.Require().True(recordExists) + } else { + s.Require().False(recordExists) + } + } }) } } @@ -210,7 +226,6 @@ func (s *KeeperTestSuite) TestGetPosition() { s.Require().NoError(err) s.Require().Equal(test.expectedPosition, position) } - }) } } From 982830e76fc063d7f5aed78e35fce4e8d6a4cc39 Mon Sep 17 00:00:00 2001 From: alpo Date: Sun, 29 Jan 2023 20:05:07 -0800 Subject: [PATCH 023/136] add support for negative liquidity delta --- x/concentrated-liquidity/position.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 6ad27db0a3d..d973fa39135 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -83,8 +83,10 @@ func (k Keeper) initOrUpdatePosition( if !recordExists { err = curUptimeAccum.NewPosition(positionName, position.Liquidity, &accum.Options{}) + } else if !liquidityDelta.IsNegative() { + err = curUptimeAccum.AddToPosition(positionName, liquidityDelta) } else { - err = curUptimeAccum.AddToPosition(positionName, position.Liquidity) + err = curUptimeAccum.RemoveFromPosition(positionName, liquidityDelta.Neg()) } if err != nil { return err From 768ec68c6eab99cae9c89ba15c4fb7c290bc2651 Mon Sep 17 00:00:00 2001 From: alpo Date: Tue, 31 Jan 2023 14:52:50 -0800 Subject: [PATCH 024/136] add and test helper & set up tick initialization logic --- .../concentrated-liquidity/tickInfo.proto | 16 + x/concentrated-liquidity/export_test.go | 6 + x/concentrated-liquidity/incentives.go | 14 + x/concentrated-liquidity/incentives_test.go | 137 +++++++ x/concentrated-liquidity/model/tickInfo.pb.go | 347 ++++++++++++++++-- x/concentrated-liquidity/position.go | 4 +- x/concentrated-liquidity/tick.go | 20 +- 7 files changed, 514 insertions(+), 30 deletions(-) diff --git a/proto/osmosis/concentrated-liquidity/tickInfo.proto b/proto/osmosis/concentrated-liquidity/tickInfo.proto index 9fbeddf4863..a77aed0afd5 100644 --- a/proto/osmosis/concentrated-liquidity/tickInfo.proto +++ b/proto/osmosis/concentrated-liquidity/tickInfo.proto @@ -26,4 +26,20 @@ message TickInfo { (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins", (gogoproto.nullable) = false ]; + repeated UptimeTracker uptime_trackers = 4 [ + (gogoproto.moretags) = "yaml:\"uptime_growth_outside\"", + (gogoproto.nullable) = false + ]; +} + +message UptimeTracker { + repeated cosmos.base.v1beta1.DecCoin uptime_growth_outside = 1 [ + (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins", + (gogoproto.nullable) = false + ]; + string qualifying_liquidity = 2 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.moretags) = "yaml:\"qualifying_liquidity\"", + (gogoproto.nullable) = false + ]; } diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index 6b4741a2c36..9ddd5468766 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -13,6 +13,8 @@ import ( ) var EmptyCoins = emptyCoins +var HundredFooCoins = sdk.NewDecCoin("foo", sdk.NewInt(100)) +var HundredBarCoins = sdk.NewDecCoin("bar", sdk.NewInt(100)) // OrderInitialPoolDenoms sets the pool denoms of a cl pool func OrderInitialPoolDenoms(denom0, denom1 string) (string, string, error) { @@ -152,3 +154,7 @@ func (k Keeper) GetUptimeAccumulators(ctx sdk.Context, poolId uint64) ([]accum.A func GetUptimeAccumulatorName(poolId, uptimeId uint64) string { return getUptimeAccumulatorName(poolId, uptimeId) } + +func (k Keeper) GetUptimeAccumulatorValues(ctx sdk.Context, poolId uint64) ([]sdk.DecCoins, error) { + return k.getUptimeAccumulatorValues(ctx, poolId) +} diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 9d8ad6b8055..4edf4165845 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -49,3 +49,17 @@ func (k Keeper) getUptimeAccumulators(ctx sdk.Context, poolId uint64) ([]accum.A return accums, nil } + +func (k Keeper) getUptimeAccumulatorValues(ctx sdk.Context, poolId uint64) ([]sdk.DecCoins, error) { + uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) + if err != nil { + return []sdk.DecCoins{}, err + } + + uptimeValues := []sdk.DecCoins{} + for _, uptimeAccum := range uptimeAccums { + uptimeValues = append(uptimeValues, uptimeAccum.GetValue()) + } + + return uptimeValues, nil +} diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 02c3bf0e074..4f0b75156ea 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -117,3 +117,140 @@ func (s *KeeperTestSuite) TestGetUptimeAccumulatorName() { }) } } + +func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulatorValues() { + // We expect there to be len(types.SupportedUptimes) number of initialized accumulators + // for a successful pool creation. + // We re-calculate these values each time to ensure test compatibility if the uptimes + // we support ever change. + curExpectedAccumValues := []sdk.DecCoins{} + hundredTokensSingleDenom := []sdk.DecCoins{} + hundredTokensMultiDenom := []sdk.DecCoins{} + twoHundredTokensMultiDenom := []sdk.DecCoins{} + varyingTokensSingleDenom := []sdk.DecCoins{} + varyingTokensMultiDenom := []sdk.DecCoins{} + for i := range types.SupportedUptimes { + curExpectedAccumValues = append(curExpectedAccumValues, cl.EmptyCoins) + hundredTokensSingleDenom = append(hundredTokensSingleDenom, sdk.NewDecCoins(cl.HundredFooCoins)) + hundredTokensMultiDenom = append(hundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins, cl.HundredBarCoins)) + twoHundredTokensMultiDenom = append(twoHundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(cl.HundredFooCoins), cl.HundredBarCoins.Add(cl.HundredBarCoins))) + varyingTokensSingleDenom = append(varyingTokensSingleDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(sdk.NewDecCoin("foo", sdk.NewInt(int64(i)))))) + varyingTokensMultiDenom = append(varyingTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(sdk.NewDecCoin("foo", sdk.NewInt(int64(i)))), cl.HundredBarCoins.Add(sdk.NewDecCoin("bar", sdk.NewInt(int64(i * 3)))))) + } + s.Require().Equal(len(types.SupportedUptimes), len(curExpectedAccumValues)) + s.Require().Equal(len(types.SupportedUptimes), len(hundredTokensSingleDenom)) + s.Require().Equal(len(types.SupportedUptimes), len(hundredTokensMultiDenom)) + s.Require().Equal(len(types.SupportedUptimes), len(twoHundredTokensMultiDenom)) + s.Require().Equal(len(types.SupportedUptimes), len(varyingTokensSingleDenom)) + s.Require().Equal(len(types.SupportedUptimes), len(varyingTokensMultiDenom)) + + type initUptimeAccumTest struct { + poolId uint64 + initializePoolAccums bool + addedAccumValues []sdk.DecCoins + numTimesAdded int + expectedAccumValues []sdk.DecCoins + + expectedPass bool + } + tests := map[string]initUptimeAccumTest{ + "hundred of a single denom in each accumulator added once": { + poolId: defaultPoolId, + initializePoolAccums: true, + addedAccumValues: hundredTokensSingleDenom, + numTimesAdded: 1, + expectedAccumValues: hundredTokensSingleDenom, + expectedPass: true, + }, + "hundred of multiple denom in each accumulator added once": { + poolId: defaultPoolId, + initializePoolAccums: true, + addedAccumValues: hundredTokensMultiDenom, + numTimesAdded: 1, + expectedAccumValues: hundredTokensMultiDenom, + expectedPass: true, + }, + "varying amounts of single denom in each accumulator added once": { + poolId: defaultPoolId, + initializePoolAccums: true, + addedAccumValues: varyingTokensSingleDenom, + numTimesAdded: 1, + expectedAccumValues: varyingTokensSingleDenom, + expectedPass: true, + }, + "varying of multiple denoms in each accumulator added once": { + poolId: defaultPoolId, + initializePoolAccums: true, + addedAccumValues: varyingTokensMultiDenom, + numTimesAdded: 1, + expectedAccumValues: varyingTokensMultiDenom, + expectedPass: true, + }, + "hundred of multiple denom in each accumulator added twice": { + poolId: defaultPoolId, + initializePoolAccums: true, + addedAccumValues: hundredTokensMultiDenom, + numTimesAdded: 2, + expectedAccumValues: twoHundredTokensMultiDenom, + expectedPass: true, + }, + "setup with different poolId": { + poolId: defaultPoolId + 1, + initializePoolAccums: true, + addedAccumValues: hundredTokensSingleDenom, + numTimesAdded: 1, + expectedAccumValues: hundredTokensSingleDenom, + expectedPass: true, + }, + "pool not initialized": { + initializePoolAccums: false, + poolId: defaultPoolId, + addedAccumValues: hundredTokensSingleDenom, + numTimesAdded: 1, + expectedAccumValues: []sdk.DecCoins{}, + expectedPass: false, + }, + } + + for name, tc := range tests { + tc := tc + s.Run(name, func() { + s.SetupTest() + clKeeper := s.App.ConcentratedLiquidityKeeper + + // system under test + var err error + if tc.initializePoolAccums { + err = clKeeper.CreateUptimeAccumulators(s.Ctx, tc.poolId) + s.Require().NoError(err) + + poolUptimeAccumulators, err := clKeeper.GetUptimeAccumulators(s.Ctx, tc.poolId) + s.Require().NoError(err) + + for i := 0; i < tc.numTimesAdded; i++ { + for uptimeId, uptimeAccum := range poolUptimeAccumulators { + uptimeAccum.AddToAccumulator(tc.addedAccumValues[uptimeId]) + } + poolUptimeAccumulators, err = clKeeper.GetUptimeAccumulators(s.Ctx, tc.poolId) + s.Require().NoError(err) + } + } + poolUptimeAccumulatorValues, err := clKeeper.GetUptimeAccumulatorValues(s.Ctx, tc.poolId) + + if tc.expectedPass { + s.Require().NoError(err) + + // ensure number of uptime accumulators match supported uptimes + s.Require().Equal(len(tc.expectedAccumValues), len(poolUptimeAccumulatorValues)) + + // ensure that each uptime was initialized to the correct value (sdk.DecCoins(nil)) + s.Require().Equal(tc.expectedAccumValues, poolUptimeAccumulatorValues) + } else { + s.Require().Error(err) + + // ensure no accumulators exist for an uninitialized pool + s.Require().Equal(0, len(poolUptimeAccumulatorValues)) + } + }) + } +} diff --git a/x/concentrated-liquidity/model/tickInfo.pb.go b/x/concentrated-liquidity/model/tickInfo.pb.go index eae11a55333..cd2acfc7077 100644 --- a/x/concentrated-liquidity/model/tickInfo.pb.go +++ b/x/concentrated-liquidity/model/tickInfo.pb.go @@ -35,6 +35,7 @@ type TickInfo struct { LiquidityGross github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=liquidity_gross,json=liquidityGross,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"liquidity_gross" yaml:"liquidity_gross"` LiquidityNet github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=liquidity_net,json=liquidityNet,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"liquidity_net" yaml:"liquidity_net"` FeeGrowthOutside github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,3,rep,name=fee_growth_outside,json=feeGrowthOutside,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"fee_growth_outside"` + UptimeTrackers []UptimeTracker `protobuf:"bytes,4,rep,name=uptime_trackers,json=uptimeTrackers,proto3" json:"uptime_trackers" yaml:"uptime_growth_outside"` } func (m *TickInfo) Reset() { *m = TickInfo{} } @@ -77,8 +78,61 @@ func (m *TickInfo) GetFeeGrowthOutside() github_com_cosmos_cosmos_sdk_types.DecC return nil } +func (m *TickInfo) GetUptimeTrackers() []UptimeTracker { + if m != nil { + return m.UptimeTrackers + } + return nil +} + +type UptimeTracker struct { + UptimeGrowthOutside github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,1,rep,name=uptime_growth_outside,json=uptimeGrowthOutside,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"uptime_growth_outside"` + QualifyingLiquidity github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=qualifying_liquidity,json=qualifyingLiquidity,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"qualifying_liquidity" yaml:"qualifying_liquidity"` +} + +func (m *UptimeTracker) Reset() { *m = UptimeTracker{} } +func (m *UptimeTracker) String() string { return proto.CompactTextString(m) } +func (*UptimeTracker) ProtoMessage() {} +func (*UptimeTracker) Descriptor() ([]byte, []int) { + return fileDescriptor_1ccb7e45032b943a, []int{1} +} +func (m *UptimeTracker) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *UptimeTracker) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_UptimeTracker.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *UptimeTracker) XXX_Merge(src proto.Message) { + xxx_messageInfo_UptimeTracker.Merge(m, src) +} +func (m *UptimeTracker) XXX_Size() int { + return m.Size() +} +func (m *UptimeTracker) XXX_DiscardUnknown() { + xxx_messageInfo_UptimeTracker.DiscardUnknown(m) +} + +var xxx_messageInfo_UptimeTracker proto.InternalMessageInfo + +func (m *UptimeTracker) GetUptimeGrowthOutside() github_com_cosmos_cosmos_sdk_types.DecCoins { + if m != nil { + return m.UptimeGrowthOutside + } + return nil +} + func init() { proto.RegisterType((*TickInfo)(nil), "osmosis.concentratedliquidity.v1beta1.TickInfo") + proto.RegisterType((*UptimeTracker)(nil), "osmosis.concentratedliquidity.v1beta1.UptimeTracker") } func init() { @@ -86,31 +140,38 @@ func init() { } var fileDescriptor_1ccb7e45032b943a = []byte{ - // 374 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0xcd, 0x2f, 0xce, 0xcd, - 0x2f, 0xce, 0x2c, 0xd6, 0x4f, 0xce, 0xcf, 0x4b, 0x4e, 0xcd, 0x2b, 0x29, 0x4a, 0x2c, 0x49, 0x4d, - 0xd1, 0xcd, 0xc9, 0x2c, 0x2c, 0xcd, 0x4c, 0xc9, 0x2c, 0xa9, 0xd4, 0x2f, 0xc9, 0x4c, 0xce, 0xf6, - 0xcc, 0x4b, 0xcb, 0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x52, 0x85, 0x2a, 0xd7, 0x43, 0x56, - 0x0e, 0x57, 0xad, 0x57, 0x66, 0x98, 0x94, 0x5a, 0x92, 0x68, 0x28, 0x25, 0x99, 0x0c, 0x56, 0x17, - 0x0f, 0xd6, 0xa4, 0x0f, 0xe1, 0x40, 0x4c, 0x90, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x87, 0x88, 0x83, - 0x58, 0x50, 0x51, 0x39, 0x88, 0x1a, 0xfd, 0xa4, 0xc4, 0xe2, 0x54, 0x7d, 0xa8, 0x29, 0xfa, 0xc9, - 0xf9, 0x99, 0x79, 0x10, 0x79, 0xa5, 0xd7, 0x4c, 0x5c, 0x1c, 0x21, 0x50, 0xa7, 0x08, 0x15, 0x72, - 0xf1, 0xc3, 0xad, 0x8c, 0x4f, 0x2f, 0xca, 0x2f, 0x2e, 0x96, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x74, - 0xf2, 0x38, 0x71, 0x4f, 0x9e, 0xe1, 0xd6, 0x3d, 0x79, 0xb5, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, - 0xbd, 0xe4, 0xfc, 0x5c, 0xa8, 0xe5, 0x50, 0x4a, 0xb7, 0x38, 0x25, 0x5b, 0xbf, 0xa4, 0xb2, 0x20, - 0xb5, 0x58, 0xcf, 0x25, 0x35, 0xf9, 0xd3, 0x3d, 0x79, 0xb1, 0xca, 0xc4, 0xdc, 0x1c, 0x2b, 0x25, - 0x34, 0xe3, 0x94, 0x82, 0xf8, 0xe0, 0x22, 0xee, 0x20, 0x01, 0xa1, 0x6c, 0x2e, 0x5e, 0x84, 0x9a, - 0xbc, 0xd4, 0x12, 0x09, 0x26, 0xb0, 0x85, 0x6e, 0x24, 0x5b, 0x28, 0x82, 0x6e, 0x61, 0x5e, 0x6a, - 0x89, 0x52, 0x10, 0x0f, 0x9c, 0xef, 0x97, 0x5a, 0x22, 0x54, 0xcf, 0x25, 0x94, 0x96, 0x9a, 0x0a, - 0x72, 0x4a, 0x79, 0x49, 0x46, 0x7c, 0x7e, 0x69, 0x49, 0x71, 0x66, 0x4a, 0xaa, 0x04, 0xb3, 0x02, - 0xb3, 0x06, 0xb7, 0x91, 0x8c, 0x1e, 0x34, 0x34, 0x41, 0x21, 0x05, 0x0b, 0x6f, 0x90, 0xd9, 0xce, - 0xf9, 0x99, 0x79, 0x4e, 0xc6, 0x20, 0xf7, 0xac, 0xba, 0x2f, 0xaf, 0x4d, 0x9c, 0x7b, 0x40, 0x7a, - 0x8a, 0x83, 0x04, 0xd2, 0x52, 0x53, 0xdd, 0xc1, 0x76, 0xf9, 0x43, 0xac, 0x72, 0x8a, 0x39, 0xf1, - 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, - 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0x27, 0x24, 0x83, 0xa1, 0x49, 0x41, 0x37, - 0x27, 0x31, 0xa9, 0x18, 0xc6, 0xd1, 0x2f, 0x33, 0x34, 0xd1, 0xaf, 0xc0, 0x95, 0x98, 0x72, 0xf3, - 0x53, 0x52, 0x73, 0x92, 0xd8, 0xc0, 0x51, 0x6a, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x93, 0x5e, - 0x70, 0x0c, 0x7b, 0x02, 0x00, 0x00, + // 488 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x53, 0x4d, 0x6b, 0xd4, 0x40, + 0x18, 0xde, 0xe9, 0x8a, 0xe8, 0x68, 0x5b, 0x49, 0x57, 0x89, 0xb5, 0x24, 0x25, 0xa8, 0x14, 0x64, + 0x33, 0xac, 0xed, 0xc9, 0x63, 0x14, 0xab, 0xe0, 0x07, 0x84, 0x7a, 0x11, 0x21, 0xe4, 0xe3, 0xdd, + 0x74, 0xd8, 0x24, 0xb3, 0x9b, 0x99, 0x54, 0xf7, 0xa4, 0x20, 0xde, 0x3d, 0xfb, 0x13, 0xfc, 0x25, + 0x3d, 0xf6, 0x28, 0x1e, 0xa2, 0xec, 0xfe, 0x02, 0xfb, 0x0b, 0x24, 0x99, 0xd9, 0x74, 0xb7, 0x54, + 0x68, 0x0f, 0x9e, 0x92, 0x79, 0xf2, 0x7c, 0xbc, 0xf3, 0x64, 0x06, 0x77, 0x19, 0x4f, 0x19, 0xa7, + 0x9c, 0x84, 0x2c, 0x0b, 0x21, 0x13, 0xb9, 0x2f, 0x20, 0xea, 0x26, 0x74, 0x54, 0xd0, 0x88, 0x8a, + 0x31, 0x11, 0x34, 0x1c, 0x3c, 0xcf, 0xfa, 0xcc, 0x1e, 0xe6, 0x4c, 0x30, 0xed, 0x9e, 0xa2, 0xdb, + 0xf3, 0xf4, 0x86, 0x6d, 0x1f, 0xf4, 0x02, 0x10, 0x7e, 0x6f, 0xfd, 0x76, 0x58, 0xf3, 0xbc, 0x5a, + 0x44, 0xe4, 0x42, 0x3a, 0xac, 0x77, 0x62, 0x16, 0x33, 0x89, 0x57, 0x6f, 0x0a, 0x35, 0x24, 0x87, + 0x04, 0x3e, 0x07, 0xa2, 0x5c, 0x48, 0xc8, 0x68, 0x26, 0xbf, 0x5b, 0x7f, 0xda, 0xf8, 0xca, 0x9e, + 0x1a, 0x45, 0x1b, 0xe1, 0xd5, 0x26, 0xd2, 0x8b, 0x73, 0xc6, 0xb9, 0x8e, 0x36, 0xd1, 0xd6, 0x55, + 0xe7, 0xd9, 0x61, 0x69, 0xb6, 0x7e, 0x96, 0xe6, 0xfd, 0x98, 0x8a, 0xfd, 0x22, 0xb0, 0x43, 0x96, + 0xaa, 0x70, 0xf5, 0xe8, 0xf2, 0x68, 0x40, 0xc4, 0x78, 0x08, 0xdc, 0x7e, 0x02, 0xe1, 0x71, 0x69, + 0xde, 0x1a, 0xfb, 0x69, 0xf2, 0xc8, 0x3a, 0x65, 0x67, 0xb9, 0x2b, 0x0d, 0xb2, 0x5b, 0x01, 0xda, + 0x00, 0x2f, 0x9f, 0x70, 0x32, 0x10, 0xfa, 0x52, 0x1d, 0xf8, 0xf4, 0xc2, 0x81, 0x9d, 0xd3, 0x81, + 0x19, 0x08, 0xcb, 0xbd, 0xde, 0xac, 0x5f, 0x81, 0xd0, 0x3e, 0x62, 0xad, 0x0f, 0x50, 0x8d, 0xf2, + 0x5e, 0xec, 0x7b, 0xac, 0x10, 0x9c, 0x46, 0xa0, 0xb7, 0x37, 0xdb, 0x5b, 0xd7, 0x1e, 0x6e, 0xd8, + 0xaa, 0xcd, 0xaa, 0xa9, 0x59, 0xdf, 0x95, 0xf7, 0x63, 0x46, 0x33, 0x67, 0xbb, 0x9a, 0xe7, 0xfb, + 0x2f, 0xf3, 0xc1, 0xf9, 0xe6, 0xa9, 0x34, 0xdc, 0xbd, 0xd1, 0x07, 0xd8, 0xad, 0xb3, 0x5e, 0xcb, + 0x28, 0xed, 0x33, 0xc2, 0xab, 0xc5, 0x50, 0xd0, 0x14, 0x3c, 0x91, 0xfb, 0xe1, 0x00, 0x72, 0xae, + 0x5f, 0xaa, 0xe3, 0x77, 0xec, 0x73, 0x1d, 0x00, 0xfb, 0x4d, 0xad, 0xde, 0x93, 0x62, 0xe7, 0x6e, + 0x35, 0xd6, 0x71, 0x69, 0x6e, 0xc8, 0xcd, 0x2b, 0xeb, 0xc5, 0xfd, 0x59, 0xee, 0x4a, 0x31, 0x2f, + 0xe2, 0xd6, 0xb7, 0x25, 0xbc, 0xbc, 0xe0, 0xa3, 0x7d, 0x41, 0xf8, 0xe6, 0x99, 0x62, 0x1d, 0xfd, + 0xaf, 0x72, 0xd6, 0x64, 0xde, 0x62, 0x3f, 0x9f, 0x10, 0xee, 0x8c, 0x0a, 0x3f, 0xa1, 0xfd, 0x31, + 0xcd, 0x62, 0xaf, 0xd9, 0xbe, 0x3a, 0x15, 0x2f, 0x2f, 0x7c, 0x2a, 0xee, 0xc8, 0x62, 0xce, 0xf2, + 0xb4, 0xdc, 0xb5, 0x13, 0xf8, 0xc5, 0x0c, 0x75, 0xde, 0x1d, 0x4e, 0x0c, 0x74, 0x34, 0x31, 0xd0, + 0xef, 0x89, 0x81, 0xbe, 0x4e, 0x8d, 0xd6, 0xd1, 0xd4, 0x68, 0xfd, 0x98, 0x1a, 0xad, 0xb7, 0xce, + 0x5c, 0xaa, 0xfa, 0x59, 0xdd, 0xc4, 0x0f, 0xf8, 0x6c, 0x41, 0x0e, 0x7a, 0x3b, 0xe4, 0xc3, 0xbf, + 0xee, 0x7b, 0xca, 0x22, 0x48, 0x82, 0xcb, 0xf5, 0xad, 0xdb, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, + 0x50, 0xe7, 0xad, 0xcd, 0x1e, 0x04, 0x00, 0x00, } func (m *TickInfo) Marshal() (dAtA []byte, err error) { @@ -133,6 +194,20 @@ func (m *TickInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.UptimeTrackers) > 0 { + for iNdEx := len(m.UptimeTrackers) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.UptimeTrackers[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTickInfo(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } if len(m.FeeGrowthOutside) > 0 { for iNdEx := len(m.FeeGrowthOutside) - 1; iNdEx >= 0; iNdEx-- { { @@ -170,6 +245,53 @@ func (m *TickInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *UptimeTracker) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UptimeTracker) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *UptimeTracker) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.QualifyingLiquidity.Size() + i -= size + if _, err := m.QualifyingLiquidity.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTickInfo(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.UptimeGrowthOutside) > 0 { + for iNdEx := len(m.UptimeGrowthOutside) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.UptimeGrowthOutside[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTickInfo(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintTickInfo(dAtA []byte, offset int, v uint64) int { offset -= sovTickInfo(v) base := offset @@ -197,6 +319,29 @@ func (m *TickInfo) Size() (n int) { n += 1 + l + sovTickInfo(uint64(l)) } } + if len(m.UptimeTrackers) > 0 { + for _, e := range m.UptimeTrackers { + l = e.Size() + n += 1 + l + sovTickInfo(uint64(l)) + } + } + return n +} + +func (m *UptimeTracker) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.UptimeGrowthOutside) > 0 { + for _, e := range m.UptimeGrowthOutside { + l = e.Size() + n += 1 + l + sovTickInfo(uint64(l)) + } + } + l = m.QualifyingLiquidity.Size() + n += 1 + l + sovTickInfo(uint64(l)) return n } @@ -337,6 +482,158 @@ func (m *TickInfo) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UptimeTrackers", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTickInfo + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTickInfo + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTickInfo + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UptimeTrackers = append(m.UptimeTrackers, UptimeTracker{}) + if err := m.UptimeTrackers[len(m.UptimeTrackers)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTickInfo(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTickInfo + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UptimeTracker) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTickInfo + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UptimeTracker: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UptimeTracker: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UptimeGrowthOutside", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTickInfo + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTickInfo + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTickInfo + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UptimeGrowthOutside = append(m.UptimeGrowthOutside, types.DecCoin{}) + if err := m.UptimeGrowthOutside[len(m.UptimeGrowthOutside)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field QualifyingLiquidity", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTickInfo + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTickInfo + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTickInfo + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.QualifyingLiquidity.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTickInfo(dAtA[iNdEx:]) diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index d973fa39135..97b3f1a41f4 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -61,8 +61,6 @@ func (k Keeper) initOrUpdatePosition( position.FrozenUntil = frozenUntil - // TODO: consider deleting position if liquidity becomes zero - // Create records for relevant uptime accumulators here. uptimeAccumulators, err := k.getUptimeAccumulators(ctx, poolId) if err != nil { @@ -147,6 +145,8 @@ func (k Keeper) deletePosition(ctx sdk.Context, return types.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick, FrozenUntil: frozenUntil} } + // TODO: remove uptime records + store.Delete(key) return nil } diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index dac70143ad4..51c211684ff 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -62,13 +62,16 @@ func (k Keeper) crossTick(ctx sdk.Context, poolId uint64, tickIndex int64) (liqu return sdk.Dec{}, err } - accum, err := k.getFeeAccumulator(ctx, poolId) + feeAccum, err := k.getFeeAccumulator(ctx, poolId) if err != nil { return sdk.Dec{}, err } // subtract tick's fee growth outside from current fee accumulator - tickInfo.FeeGrowthOutside = accum.GetValue().Sub(tickInfo.FeeGrowthOutside) + tickInfo.FeeGrowthOutside = feeAccum.GetValue().Sub(tickInfo.FeeGrowthOutside) + + // TODO: update uptime accumulators here + k.SetTickInfo(ctx, poolId, tickIndex, tickInfo) return tickInfo.LiquidityNet, nil @@ -93,7 +96,18 @@ func (k Keeper) getTickInfo(ctx sdk.Context, poolId uint64, tickIndex int64) (ti return tickStruct, err } - return model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: initialFeeGrowthOutside}, nil + // We also initialize the uptime trackers for the new tick + globaUptimeAccumValues, err := k.getUptimeAccumulatorValues(ctx, poolId) + if err != nil { + return tickStruct, err + } + + initialUptimeTrackers := []model.UptimeTracker{} + for _, uptimeValue := range globaUptimeAccumValues { + initialUptimeTrackers = append(initialUptimeTrackers, model.UptimeTracker{uptimeValue, sdk.ZeroDec()}) + } + + return model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: initialFeeGrowthOutside, UptimeTrackers: initialUptimeTrackers}, nil } if err != nil { return tickStruct, err From c318fa036c22ff7cdc96aab28d0560e02009839f Mon Sep 17 00:00:00 2001 From: alpo Date: Tue, 31 Jan 2023 15:55:28 -0800 Subject: [PATCH 025/136] implement accumulator updates on tick crossing and clean up proto --- .../concentrated-liquidity/tickInfo.proto | 5 - x/concentrated-liquidity/incentives.go | 3 + x/concentrated-liquidity/model/tickInfo.pb.go | 109 +++++------------- x/concentrated-liquidity/position.go | 2 + x/concentrated-liquidity/tick.go | 12 +- 5 files changed, 46 insertions(+), 85 deletions(-) diff --git a/proto/osmosis/concentrated-liquidity/tickInfo.proto b/proto/osmosis/concentrated-liquidity/tickInfo.proto index a77aed0afd5..e8d8606e66b 100644 --- a/proto/osmosis/concentrated-liquidity/tickInfo.proto +++ b/proto/osmosis/concentrated-liquidity/tickInfo.proto @@ -37,9 +37,4 @@ message UptimeTracker { (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins", (gogoproto.nullable) = false ]; - string qualifying_liquidity = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.moretags) = "yaml:\"qualifying_liquidity\"", - (gogoproto.nullable) = false - ]; } diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 4edf4165845..e78f5c94d46 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -50,6 +50,9 @@ func (k Keeper) getUptimeAccumulators(ctx sdk.Context, poolId uint64) ([]accum.A return accums, nil } +// nolint: unused +// getUptimeAccumulatorValues gets the accumulator values for the supported uptimes for the given poolId +// Returns error if accumulator for the given poolId does not exist. func (k Keeper) getUptimeAccumulatorValues(ctx sdk.Context, poolId uint64) ([]sdk.DecCoins, error) { uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) if err != nil { diff --git a/x/concentrated-liquidity/model/tickInfo.pb.go b/x/concentrated-liquidity/model/tickInfo.pb.go index cd2acfc7077..57d98d2c6e6 100644 --- a/x/concentrated-liquidity/model/tickInfo.pb.go +++ b/x/concentrated-liquidity/model/tickInfo.pb.go @@ -87,7 +87,6 @@ func (m *TickInfo) GetUptimeTrackers() []UptimeTracker { type UptimeTracker struct { UptimeGrowthOutside github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,1,rep,name=uptime_growth_outside,json=uptimeGrowthOutside,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"uptime_growth_outside"` - QualifyingLiquidity github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=qualifying_liquidity,json=qualifyingLiquidity,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"qualifying_liquidity" yaml:"qualifying_liquidity"` } func (m *UptimeTracker) Reset() { *m = UptimeTracker{} } @@ -140,38 +139,36 @@ func init() { } var fileDescriptor_1ccb7e45032b943a = []byte{ - // 488 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x53, 0x4d, 0x6b, 0xd4, 0x40, - 0x18, 0xde, 0xe9, 0x8a, 0xe8, 0x68, 0x5b, 0x49, 0x57, 0x89, 0xb5, 0x24, 0x25, 0xa8, 0x14, 0x64, - 0x33, 0xac, 0xed, 0xc9, 0x63, 0x14, 0xab, 0xe0, 0x07, 0x84, 0x7a, 0x11, 0x21, 0xe4, 0xe3, 0xdd, - 0x74, 0xd8, 0x24, 0xb3, 0x9b, 0x99, 0x54, 0xf7, 0xa4, 0x20, 0xde, 0x3d, 0xfb, 0x13, 0xfc, 0x25, - 0x3d, 0xf6, 0x28, 0x1e, 0xa2, 0xec, 0xfe, 0x02, 0xfb, 0x0b, 0x24, 0x99, 0xd9, 0x74, 0xb7, 0x54, - 0x68, 0x0f, 0x9e, 0x92, 0x79, 0xf2, 0x7c, 0xbc, 0xf3, 0x64, 0x06, 0x77, 0x19, 0x4f, 0x19, 0xa7, - 0x9c, 0x84, 0x2c, 0x0b, 0x21, 0x13, 0xb9, 0x2f, 0x20, 0xea, 0x26, 0x74, 0x54, 0xd0, 0x88, 0x8a, - 0x31, 0x11, 0x34, 0x1c, 0x3c, 0xcf, 0xfa, 0xcc, 0x1e, 0xe6, 0x4c, 0x30, 0xed, 0x9e, 0xa2, 0xdb, - 0xf3, 0xf4, 0x86, 0x6d, 0x1f, 0xf4, 0x02, 0x10, 0x7e, 0x6f, 0xfd, 0x76, 0x58, 0xf3, 0xbc, 0x5a, - 0x44, 0xe4, 0x42, 0x3a, 0xac, 0x77, 0x62, 0x16, 0x33, 0x89, 0x57, 0x6f, 0x0a, 0x35, 0x24, 0x87, - 0x04, 0x3e, 0x07, 0xa2, 0x5c, 0x48, 0xc8, 0x68, 0x26, 0xbf, 0x5b, 0x7f, 0xda, 0xf8, 0xca, 0x9e, - 0x1a, 0x45, 0x1b, 0xe1, 0xd5, 0x26, 0xd2, 0x8b, 0x73, 0xc6, 0xb9, 0x8e, 0x36, 0xd1, 0xd6, 0x55, - 0xe7, 0xd9, 0x61, 0x69, 0xb6, 0x7e, 0x96, 0xe6, 0xfd, 0x98, 0x8a, 0xfd, 0x22, 0xb0, 0x43, 0x96, - 0xaa, 0x70, 0xf5, 0xe8, 0xf2, 0x68, 0x40, 0xc4, 0x78, 0x08, 0xdc, 0x7e, 0x02, 0xe1, 0x71, 0x69, - 0xde, 0x1a, 0xfb, 0x69, 0xf2, 0xc8, 0x3a, 0x65, 0x67, 0xb9, 0x2b, 0x0d, 0xb2, 0x5b, 0x01, 0xda, - 0x00, 0x2f, 0x9f, 0x70, 0x32, 0x10, 0xfa, 0x52, 0x1d, 0xf8, 0xf4, 0xc2, 0x81, 0x9d, 0xd3, 0x81, - 0x19, 0x08, 0xcb, 0xbd, 0xde, 0xac, 0x5f, 0x81, 0xd0, 0x3e, 0x62, 0xad, 0x0f, 0x50, 0x8d, 0xf2, - 0x5e, 0xec, 0x7b, 0xac, 0x10, 0x9c, 0x46, 0xa0, 0xb7, 0x37, 0xdb, 0x5b, 0xd7, 0x1e, 0x6e, 0xd8, - 0xaa, 0xcd, 0xaa, 0xa9, 0x59, 0xdf, 0x95, 0xf7, 0x63, 0x46, 0x33, 0x67, 0xbb, 0x9a, 0xe7, 0xfb, - 0x2f, 0xf3, 0xc1, 0xf9, 0xe6, 0xa9, 0x34, 0xdc, 0xbd, 0xd1, 0x07, 0xd8, 0xad, 0xb3, 0x5e, 0xcb, - 0x28, 0xed, 0x33, 0xc2, 0xab, 0xc5, 0x50, 0xd0, 0x14, 0x3c, 0x91, 0xfb, 0xe1, 0x00, 0x72, 0xae, - 0x5f, 0xaa, 0xe3, 0x77, 0xec, 0x73, 0x1d, 0x00, 0xfb, 0x4d, 0xad, 0xde, 0x93, 0x62, 0xe7, 0x6e, - 0x35, 0xd6, 0x71, 0x69, 0x6e, 0xc8, 0xcd, 0x2b, 0xeb, 0xc5, 0xfd, 0x59, 0xee, 0x4a, 0x31, 0x2f, - 0xe2, 0xd6, 0xb7, 0x25, 0xbc, 0xbc, 0xe0, 0xa3, 0x7d, 0x41, 0xf8, 0xe6, 0x99, 0x62, 0x1d, 0xfd, - 0xaf, 0x72, 0xd6, 0x64, 0xde, 0x62, 0x3f, 0x9f, 0x10, 0xee, 0x8c, 0x0a, 0x3f, 0xa1, 0xfd, 0x31, - 0xcd, 0x62, 0xaf, 0xd9, 0xbe, 0x3a, 0x15, 0x2f, 0x2f, 0x7c, 0x2a, 0xee, 0xc8, 0x62, 0xce, 0xf2, - 0xb4, 0xdc, 0xb5, 0x13, 0xf8, 0xc5, 0x0c, 0x75, 0xde, 0x1d, 0x4e, 0x0c, 0x74, 0x34, 0x31, 0xd0, - 0xef, 0x89, 0x81, 0xbe, 0x4e, 0x8d, 0xd6, 0xd1, 0xd4, 0x68, 0xfd, 0x98, 0x1a, 0xad, 0xb7, 0xce, - 0x5c, 0xaa, 0xfa, 0x59, 0xdd, 0xc4, 0x0f, 0xf8, 0x6c, 0x41, 0x0e, 0x7a, 0x3b, 0xe4, 0xc3, 0xbf, - 0xee, 0x7b, 0xca, 0x22, 0x48, 0x82, 0xcb, 0xf5, 0xad, 0xdb, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, - 0x50, 0xe7, 0xad, 0xcd, 0x1e, 0x04, 0x00, 0x00, + // 453 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x53, 0xcf, 0x6a, 0xd4, 0x40, + 0x18, 0xdf, 0x71, 0x45, 0x74, 0xb4, 0xad, 0xc4, 0x2a, 0xb1, 0x94, 0xa4, 0x04, 0x95, 0x82, 0xec, + 0x0c, 0x6b, 0x7b, 0xf2, 0x18, 0xc5, 0xea, 0x45, 0x61, 0xa9, 0x17, 0x11, 0x96, 0x64, 0xf2, 0xed, + 0x76, 0xd8, 0x24, 0xb3, 0xcd, 0x4c, 0xaa, 0x7b, 0xf2, 0x20, 0xde, 0xbd, 0xf9, 0x0e, 0x3e, 0x49, + 0x8f, 0x3d, 0x8a, 0x87, 0x28, 0xbb, 0x4f, 0x60, 0x9f, 0x40, 0x26, 0x33, 0x8d, 0xbb, 0x45, 0x61, + 0x3d, 0xf4, 0x94, 0x7c, 0x5f, 0x7e, 0xff, 0xe6, 0xc7, 0x04, 0x77, 0x84, 0xcc, 0x84, 0xe4, 0x92, + 0x32, 0x91, 0x33, 0xc8, 0x55, 0x11, 0x29, 0x48, 0x3a, 0x29, 0x3f, 0x2c, 0x79, 0xc2, 0xd5, 0x84, + 0x2a, 0xce, 0x46, 0x2f, 0xf2, 0x81, 0x20, 0xe3, 0x42, 0x28, 0xe1, 0xdc, 0xb7, 0x70, 0x32, 0x0f, + 0x6f, 0xd0, 0xe4, 0xa8, 0x1b, 0x83, 0x8a, 0xba, 0x1b, 0x77, 0x59, 0x8d, 0xeb, 0xd7, 0x24, 0x6a, + 0x06, 0xa3, 0xb0, 0xb1, 0x3e, 0x14, 0x43, 0x61, 0xf6, 0xfa, 0xcd, 0x6e, 0x3d, 0x83, 0xa1, 0x71, + 0x24, 0x81, 0x5a, 0x15, 0xca, 0x04, 0xcf, 0xcd, 0xf7, 0xe0, 0x57, 0x1b, 0x5f, 0xdd, 0xb7, 0x51, + 0x9c, 0x43, 0xbc, 0xd6, 0x58, 0xf6, 0x87, 0x85, 0x90, 0xd2, 0x45, 0x5b, 0x68, 0xfb, 0x5a, 0xf8, + 0xfc, 0xb8, 0xf2, 0x5b, 0xdf, 0x2b, 0xff, 0xc1, 0x90, 0xab, 0x83, 0x32, 0x26, 0x4c, 0x64, 0xd6, + 0xdc, 0x3e, 0x3a, 0x32, 0x19, 0x51, 0x35, 0x19, 0x83, 0x24, 0x4f, 0x81, 0x9d, 0x56, 0xfe, 0x9d, + 0x49, 0x94, 0xa5, 0x8f, 0x83, 0x73, 0x72, 0x41, 0x6f, 0xb5, 0xd9, 0xec, 0xe9, 0x85, 0x33, 0xc2, + 0x2b, 0x7f, 0x30, 0x39, 0x28, 0xf7, 0x52, 0x6d, 0xf8, 0xec, 0xbf, 0x0d, 0xd7, 0xcf, 0x1b, 0xe6, + 0xa0, 0x82, 0xde, 0x8d, 0x66, 0x7e, 0x09, 0xca, 0xf9, 0x80, 0x9d, 0x01, 0x80, 0x8e, 0xf2, 0x4e, + 0x1d, 0xf4, 0x45, 0xa9, 0x24, 0x4f, 0xc0, 0x6d, 0x6f, 0xb5, 0xb7, 0xaf, 0x3f, 0xda, 0x24, 0xb6, + 0x4d, 0xdd, 0xd4, 0x59, 0xdf, 0x5a, 0xfb, 0x89, 0xe0, 0x79, 0xb8, 0xa3, 0xf3, 0x7c, 0xfd, 0xe1, + 0x3f, 0x5c, 0x2e, 0x8f, 0xe6, 0xc8, 0xde, 0xcd, 0x01, 0xc0, 0x5e, 0xed, 0xf5, 0xca, 0x58, 0x39, + 0x1f, 0x11, 0x5e, 0x2b, 0xc7, 0x8a, 0x67, 0xd0, 0x57, 0x45, 0xc4, 0x46, 0x50, 0x48, 0xf7, 0x72, + 0x6d, 0xbf, 0x4b, 0x96, 0xba, 0x00, 0xe4, 0x75, 0xcd, 0xde, 0x37, 0xe4, 0xf0, 0x9e, 0x8e, 0x75, + 0x5a, 0xf9, 0x9b, 0xe6, 0xf0, 0x56, 0x7a, 0xf1, 0x7c, 0x41, 0x6f, 0xb5, 0x9c, 0x27, 0xc9, 0xe0, + 0x0b, 0xc2, 0x2b, 0x0b, 0x3a, 0xce, 0x27, 0x84, 0x6f, 0xff, 0x95, 0xec, 0xa2, 0x8b, 0x2a, 0xe7, + 0x96, 0xf1, 0x5b, 0xe8, 0x27, 0x7c, 0x7b, 0x3c, 0xf5, 0xd0, 0xc9, 0xd4, 0x43, 0x3f, 0xa7, 0x1e, + 0xfa, 0x3c, 0xf3, 0x5a, 0x27, 0x33, 0xaf, 0xf5, 0x6d, 0xe6, 0xb5, 0xde, 0x84, 0x73, 0xda, 0xb6, + 0xa9, 0x4e, 0x1a, 0xc5, 0xf2, 0x6c, 0xa0, 0x47, 0xdd, 0x5d, 0xfa, 0xfe, 0x5f, 0x3f, 0x5b, 0x26, + 0x12, 0x48, 0xe3, 0x2b, 0xf5, 0x95, 0xdf, 0xf9, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xf2, 0x8b, 0x67, + 0x7b, 0x9b, 0x03, 0x00, 0x00, } func (m *TickInfo) Marshal() (dAtA []byte, err error) { @@ -265,16 +262,6 @@ func (m *UptimeTracker) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - { - size := m.QualifyingLiquidity.Size() - i -= size - if _, err := m.QualifyingLiquidity.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTickInfo(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 if len(m.UptimeGrowthOutside) > 0 { for iNdEx := len(m.UptimeGrowthOutside) - 1; iNdEx >= 0; iNdEx-- { { @@ -340,8 +327,6 @@ func (m *UptimeTracker) Size() (n int) { n += 1 + l + sovTickInfo(uint64(l)) } } - l = m.QualifyingLiquidity.Size() - n += 1 + l + sovTickInfo(uint64(l)) return n } @@ -600,40 +585,6 @@ func (m *UptimeTracker) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field QualifyingLiquidity", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTickInfo - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTickInfo - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTickInfo - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.QualifyingLiquidity.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTickInfo(dAtA[iNdEx:]) diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 97b3f1a41f4..a8245c4c88e 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -73,6 +73,8 @@ func (k Keeper) initOrUpdatePosition( // If a record does not exist for this uptime accumulator, create a new position. // Otherwise, add to existing record. + // Note that adding to a record resets its checkpointed accumulator value and sets + // aside any earned rewards to be claimed later. positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil)) recordExists, err := curUptimeAccum.HasPosition(positionName) if err != nil { diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index 51c211684ff..6abbebfc75f 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -71,6 +71,16 @@ func (k Keeper) crossTick(ctx sdk.Context, poolId uint64, tickIndex int64) (liqu tickInfo.FeeGrowthOutside = feeAccum.GetValue().Sub(tickInfo.FeeGrowthOutside) // TODO: update uptime accumulators here + uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) + if err != nil { + return sdk.Dec{}, err + } + + // for each supported uptime, subtract tick's uptime growth outside from the respective uptime accumulator + for uptimeId, uptimeAccum := range uptimeAccums { + curUptimeTracker := tickInfo.UptimeTrackers[uptimeId] + curUptimeTracker.UptimeGrowthOutside = uptimeAccum.GetValue().Sub(curUptimeTracker.UptimeGrowthOutside) + } k.SetTickInfo(ctx, poolId, tickIndex, tickInfo) @@ -104,7 +114,7 @@ func (k Keeper) getTickInfo(ctx sdk.Context, poolId uint64, tickIndex int64) (ti initialUptimeTrackers := []model.UptimeTracker{} for _, uptimeValue := range globaUptimeAccumValues { - initialUptimeTrackers = append(initialUptimeTrackers, model.UptimeTracker{uptimeValue, sdk.ZeroDec()}) + initialUptimeTrackers = append(initialUptimeTrackers, model.UptimeTracker{uptimeValue}) } return model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: initialFeeGrowthOutside, UptimeTrackers: initialUptimeTrackers}, nil From d0184b721ee712855d468f79381b77afb110a08e Mon Sep 17 00:00:00 2001 From: alpo Date: Tue, 31 Jan 2023 15:56:07 -0800 Subject: [PATCH 026/136] clean up comments --- x/concentrated-liquidity/tick.go | 1 - 1 file changed, 1 deletion(-) diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index 6abbebfc75f..98dc8867fee 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -70,7 +70,6 @@ func (k Keeper) crossTick(ctx sdk.Context, poolId uint64, tickIndex int64) (liqu // subtract tick's fee growth outside from current fee accumulator tickInfo.FeeGrowthOutside = feeAccum.GetValue().Sub(tickInfo.FeeGrowthOutside) - // TODO: update uptime accumulators here uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) if err != nil { return sdk.Dec{}, err From 60208369af15299986482efdf3c2ea434337edb2 Mon Sep 17 00:00:00 2001 From: alpo Date: Tue, 31 Jan 2023 16:15:40 -0800 Subject: [PATCH 027/136] minor test cleanup --- x/concentrated-liquidity/incentives_test.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 02c3bf0e074..61ff658fb19 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -21,7 +21,7 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { type initUptimeAccumTest struct { poolId uint64 - initializePool bool + initializePoolAccum bool expectedAccumValues []sdk.DecCoins expectedPass bool @@ -29,18 +29,18 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { tests := map[string]initUptimeAccumTest{ "default pool setup": { poolId: defaultPoolId, - initializePool: true, + initializePoolAccum: true, expectedAccumValues: curExpectedAccumValues, expectedPass: true, }, "setup with different poolId": { poolId: defaultPoolId + 1, - initializePool: true, + initializePoolAccum: true, expectedAccumValues: curExpectedAccumValues, expectedPass: true, }, "pool not initialized": { - initializePool: false, + initializePoolAccum: false, poolId: defaultPoolId, expectedAccumValues: []sdk.DecCoins{}, expectedPass: false, @@ -54,9 +54,9 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { clKeeper := s.App.ConcentratedLiquidityKeeper // system under test - var err error - if tc.initializePool { - err = clKeeper.CreateUptimeAccumulators(s.Ctx, tc.poolId) + if tc.initializePoolAccum { + err := clKeeper.CreateUptimeAccumulators(s.Ctx, tc.poolId) + s.Require().NoError(err) } poolUptimeAccumulators, err := clKeeper.GetUptimeAccumulators(s.Ctx, tc.poolId) From 01bd068e60c2d50d15be485d0809340702feb7dd Mon Sep 17 00:00:00 2001 From: alpo Date: Wed, 1 Feb 2023 13:59:21 -0800 Subject: [PATCH 028/136] ensure accum initalization follows conventions and clean up tests --- x/concentrated-liquidity/incentives.go | 34 +++++++ x/concentrated-liquidity/incentives_test.go | 101 ++++++++++++-------- x/concentrated-liquidity/tick.go | 4 +- x/concentrated-liquidity/tick_test.go | 16 ++-- 4 files changed, 107 insertions(+), 48 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index e78f5c94d46..c282aed1505 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -66,3 +66,37 @@ func (k Keeper) getUptimeAccumulatorValues(ctx sdk.Context, poolId uint64) ([]sd return uptimeValues, nil } + +// getInitialUptimeGrowthOutsidesForTick returns an array of the initial values of uptime growth outside +// for each supported uptime for a given tick. This value depends on the tick's location relative to the current tick. +// +// uptimeGrowthOutside = +// { uptimeGrowthGlobal current tick >= tick } +// { 0 current tick < tick } +// +// Similar to fees, by convention the value is chosen as if all of the uptime (seconds per liquidity) to date has +// occurred below the tick. +// Returns error if the pool with the given id does not exist or if fails to get any of the uptime accumulators. +func (k Keeper) getInitialUptimeGrowthOutsidesForTick(ctx sdk.Context, poolId uint64, tick int64) ([]sdk.DecCoins, error) { + pool, err := k.getPoolById(ctx, poolId) + if err != nil { + return []sdk.DecCoins{}, err + } + + currentTick := pool.GetCurrentTick().Int64() + if currentTick >= tick { + uptimeAccumulatorValues, err := k.getUptimeAccumulatorValues(ctx, poolId) + if err != nil { + return []sdk.DecCoins{}, err + } + return uptimeAccumulatorValues, nil + } + + // If currentTick < tick, we return len(SupportedUptimes) empty DecCoins + emptyUptimeValues := []sdk.DecCoins{} + for range types.SupportedUptimes { + emptyUptimeValues = append(emptyUptimeValues, emptyCoins) + } + + return emptyUptimeValues, nil +} \ No newline at end of file diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 2bfec08d331..5ae001dad75 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -4,20 +4,60 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" cl "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity" + "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" ) var defaultPoolId = uint64(1) +type ExpectedUptimes struct { + emptyExpectedAccumValues []sdk.DecCoins + hundredTokensSingleDenom []sdk.DecCoins + hundredTokensMultiDenom []sdk.DecCoins + twoHundredTokensMultiDenom []sdk.DecCoins + varyingTokensSingleDenom []sdk.DecCoins + varyingTokensMultiDenom []sdk.DecCoins +} + +// getExpectedUptimes returns a base set of expected values for testing based on the number +// of supported uptimes at runtime. This abstraction exists only to ensure backwards-compatibility +// of incentives-related tests if the supported uptimes are ever changed. +func getExpectedUptimes() ExpectedUptimes { + expUptimes := ExpectedUptimes{ + emptyExpectedAccumValues: []sdk.DecCoins{}, + hundredTokensSingleDenom: []sdk.DecCoins{}, + hundredTokensMultiDenom: []sdk.DecCoins{}, + twoHundredTokensMultiDenom: []sdk.DecCoins{}, + varyingTokensSingleDenom: []sdk.DecCoins{}, + varyingTokensMultiDenom: []sdk.DecCoins{}, + } + for i := range types.SupportedUptimes { + expUptimes.emptyExpectedAccumValues = append(expUptimes.emptyExpectedAccumValues, cl.EmptyCoins) + expUptimes.hundredTokensSingleDenom = append(expUptimes.hundredTokensSingleDenom, sdk.NewDecCoins(cl.HundredFooCoins)) + expUptimes.hundredTokensMultiDenom = append(expUptimes.hundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins, cl.HundredBarCoins)) + expUptimes.twoHundredTokensMultiDenom = append(expUptimes.twoHundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(cl.HundredFooCoins), cl.HundredBarCoins.Add(cl.HundredBarCoins))) + expUptimes.varyingTokensSingleDenom = append(expUptimes.varyingTokensSingleDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(sdk.NewDecCoin("foo", sdk.NewInt(int64(i)))))) + expUptimes.varyingTokensMultiDenom = append(expUptimes.varyingTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(sdk.NewDecCoin("foo", sdk.NewInt(int64(i)))), cl.HundredBarCoins.Add(sdk.NewDecCoin("bar", sdk.NewInt(int64(i * 3)))))) + } + + return expUptimes +} + +// Helper for converting raw DecCoins accum values to pool proto compatible UptimeTrackers +func wrapUptimeTrackers(accumValues []sdk.DecCoins) []model.UptimeTracker { + wrappedUptimeTrackers := []model.UptimeTracker{} + for _, accumValue := range accumValues { + wrappedUptimeTrackers = append(wrappedUptimeTrackers, model.UptimeTracker{accumValue}) + } + + return wrappedUptimeTrackers +} + func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { // We expect there to be len(types.SupportedUptimes) number of initialized accumulators // for a successful pool creation. We calculate this upfront to ensure test compatibility // if the uptimes we support ever change. - curExpectedAccumValues := []sdk.DecCoins{} - for range types.SupportedUptimes { - curExpectedAccumValues = append(curExpectedAccumValues, cl.EmptyCoins) - } - s.Require().Equal(len(types.SupportedUptimes), len(curExpectedAccumValues)) + expectedUptimes := getExpectedUptimes() type initUptimeAccumTest struct { poolId uint64 @@ -30,13 +70,13 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { "default pool setup": { poolId: defaultPoolId, initializePoolAccum: true, - expectedAccumValues: curExpectedAccumValues, + expectedAccumValues: expectedUptimes.emptyExpectedAccumValues, expectedPass: true, }, "setup with different poolId": { poolId: defaultPoolId + 1, initializePoolAccum: true, - expectedAccumValues: curExpectedAccumValues, + expectedAccumValues: expectedUptimes.emptyExpectedAccumValues, expectedPass: true, }, "pool not initialized": { @@ -123,26 +163,7 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulatorValues() { // for a successful pool creation. // We re-calculate these values each time to ensure test compatibility if the uptimes // we support ever change. - curExpectedAccumValues := []sdk.DecCoins{} - hundredTokensSingleDenom := []sdk.DecCoins{} - hundredTokensMultiDenom := []sdk.DecCoins{} - twoHundredTokensMultiDenom := []sdk.DecCoins{} - varyingTokensSingleDenom := []sdk.DecCoins{} - varyingTokensMultiDenom := []sdk.DecCoins{} - for i := range types.SupportedUptimes { - curExpectedAccumValues = append(curExpectedAccumValues, cl.EmptyCoins) - hundredTokensSingleDenom = append(hundredTokensSingleDenom, sdk.NewDecCoins(cl.HundredFooCoins)) - hundredTokensMultiDenom = append(hundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins, cl.HundredBarCoins)) - twoHundredTokensMultiDenom = append(twoHundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(cl.HundredFooCoins), cl.HundredBarCoins.Add(cl.HundredBarCoins))) - varyingTokensSingleDenom = append(varyingTokensSingleDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(sdk.NewDecCoin("foo", sdk.NewInt(int64(i)))))) - varyingTokensMultiDenom = append(varyingTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(sdk.NewDecCoin("foo", sdk.NewInt(int64(i)))), cl.HundredBarCoins.Add(sdk.NewDecCoin("bar", sdk.NewInt(int64(i * 3)))))) - } - s.Require().Equal(len(types.SupportedUptimes), len(curExpectedAccumValues)) - s.Require().Equal(len(types.SupportedUptimes), len(hundredTokensSingleDenom)) - s.Require().Equal(len(types.SupportedUptimes), len(hundredTokensMultiDenom)) - s.Require().Equal(len(types.SupportedUptimes), len(twoHundredTokensMultiDenom)) - s.Require().Equal(len(types.SupportedUptimes), len(varyingTokensSingleDenom)) - s.Require().Equal(len(types.SupportedUptimes), len(varyingTokensMultiDenom)) + expectedUptimes := getExpectedUptimes() type initUptimeAccumTest struct { poolId uint64 @@ -157,55 +178,55 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulatorValues() { "hundred of a single denom in each accumulator added once": { poolId: defaultPoolId, initializePoolAccums: true, - addedAccumValues: hundredTokensSingleDenom, + addedAccumValues: expectedUptimes.hundredTokensSingleDenom, numTimesAdded: 1, - expectedAccumValues: hundredTokensSingleDenom, + expectedAccumValues: expectedUptimes.hundredTokensSingleDenom, expectedPass: true, }, "hundred of multiple denom in each accumulator added once": { poolId: defaultPoolId, initializePoolAccums: true, - addedAccumValues: hundredTokensMultiDenom, + addedAccumValues: expectedUptimes.hundredTokensMultiDenom, numTimesAdded: 1, - expectedAccumValues: hundredTokensMultiDenom, + expectedAccumValues: expectedUptimes.hundredTokensMultiDenom, expectedPass: true, }, "varying amounts of single denom in each accumulator added once": { poolId: defaultPoolId, initializePoolAccums: true, - addedAccumValues: varyingTokensSingleDenom, + addedAccumValues: expectedUptimes.varyingTokensSingleDenom, numTimesAdded: 1, - expectedAccumValues: varyingTokensSingleDenom, + expectedAccumValues: expectedUptimes.varyingTokensSingleDenom, expectedPass: true, }, "varying of multiple denoms in each accumulator added once": { poolId: defaultPoolId, initializePoolAccums: true, - addedAccumValues: varyingTokensMultiDenom, + addedAccumValues: expectedUptimes.varyingTokensMultiDenom, numTimesAdded: 1, - expectedAccumValues: varyingTokensMultiDenom, + expectedAccumValues: expectedUptimes.varyingTokensMultiDenom, expectedPass: true, }, "hundred of multiple denom in each accumulator added twice": { poolId: defaultPoolId, initializePoolAccums: true, - addedAccumValues: hundredTokensMultiDenom, + addedAccumValues: expectedUptimes.hundredTokensMultiDenom, numTimesAdded: 2, - expectedAccumValues: twoHundredTokensMultiDenom, + expectedAccumValues: expectedUptimes.twoHundredTokensMultiDenom, expectedPass: true, }, "setup with different poolId": { poolId: defaultPoolId + 1, initializePoolAccums: true, - addedAccumValues: hundredTokensSingleDenom, + addedAccumValues: expectedUptimes.hundredTokensSingleDenom, numTimesAdded: 1, - expectedAccumValues: hundredTokensSingleDenom, + expectedAccumValues: expectedUptimes.hundredTokensSingleDenom, expectedPass: true, }, "pool not initialized": { initializePoolAccums: false, poolId: defaultPoolId, - addedAccumValues: hundredTokensSingleDenom, + addedAccumValues: expectedUptimes.hundredTokensSingleDenom, numTimesAdded: 1, expectedAccumValues: []sdk.DecCoins{}, expectedPass: false, diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index 98dc8867fee..5f9164f8d7f 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -106,13 +106,13 @@ func (k Keeper) getTickInfo(ctx sdk.Context, poolId uint64, tickIndex int64) (ti } // We also initialize the uptime trackers for the new tick - globaUptimeAccumValues, err := k.getUptimeAccumulatorValues(ctx, poolId) + initialUptimeGrowthOutsideValues, err := k.getInitialUptimeGrowthOutsidesForTick(ctx, poolId, tickIndex) if err != nil { return tickStruct, err } initialUptimeTrackers := []model.UptimeTracker{} - for _, uptimeValue := range globaUptimeAccumValues { + for _, uptimeValue := range initialUptimeGrowthOutsideValues { initialUptimeTrackers = append(initialUptimeTrackers, model.UptimeTracker{uptimeValue}) } diff --git a/x/concentrated-liquidity/tick_test.go b/x/concentrated-liquidity/tick_test.go index fed272dccf6..2f17e79f95f 100644 --- a/x/concentrated-liquidity/tick_test.go +++ b/x/concentrated-liquidity/tick_test.go @@ -282,6 +282,8 @@ func (s *KeeperTestSuite) TestInitOrUpdateTick() { func (s *KeeperTestSuite) TestGetTickInfo() { var ( preInitializedTickIndex = DefaultCurrTick.Int64() + 2 + expectedUptimes = getExpectedUptimes() + emptyUptimeTrackers = wrapUptimeTrackers(expectedUptimes.emptyExpectedAccumValues) ) tests := []struct { @@ -295,22 +297,22 @@ func (s *KeeperTestSuite) TestGetTickInfo() { name: "Get tick info on existing pool and existing tick", poolToGet: validPoolId, tickToGet: preInitializedTickIndex, - // Note that FeeGrowthOutside is not updated. - expectedTickInfo: model.TickInfo{LiquidityGross: DefaultLiquidityAmt, LiquidityNet: DefaultLiquidityAmt.Neg()}, + // Note that FeeGrowthOutside and UptimeGrowthOutside(s) is (are) not updated. + expectedTickInfo: model.TickInfo{LiquidityGross: DefaultLiquidityAmt, LiquidityNet: DefaultLiquidityAmt.Neg(), UptimeTrackers: emptyUptimeTrackers}, }, { name: "Get tick info on existing pool with no existing tick (cur pool tick > tick)", poolToGet: validPoolId, tickToGet: DefaultCurrTick.Int64() + 1, - // Note that FeeGrowthOutside is not initialized. - expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec()}, + // Note that FeeGrowthOutside and UptimeGrowthOutside(s) is (are) not initialized. + expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), UptimeTrackers: emptyUptimeTrackers}, }, { name: "Get tick info on existing pool with no existing tick (cur pool tick == tick), initialized fee growth outside", poolToGet: validPoolId, tickToGet: DefaultCurrTick.Int64(), - // Note that FeeGrowthOutside is initialized. - expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: sdk.NewDecCoins(oneEth)}, + // Note that FeeGrowthOutside and UptimeGrowthOutside(s) is (are) initialized. + expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: sdk.NewDecCoins(oneEth), UptimeTrackers: emptyUptimeTrackers}, }, { name: "Get tick info on a non-existing pool with no existing tick", @@ -340,6 +342,8 @@ func (s *KeeperTestSuite) TestGetTickInfo() { err = s.App.ConcentratedLiquidityKeeper.ChargeFee(s.Ctx, validPoolId, oneEth) s.Require().NoError(err) + // TODO: change global uptime accumulators to test that ticks are properly updated/initialized + // System under test tickInfo, err := s.App.ConcentratedLiquidityKeeper.GetTickInfo(s.Ctx, test.poolToGet, test.tickToGet) if test.expectedErr != nil { From 1bc68b5b62c03222bf801dcf98df325b62f81d72 Mon Sep 17 00:00:00 2001 From: alpo Date: Wed, 1 Feb 2023 14:25:31 -0800 Subject: [PATCH 029/136] update pool proto and CL pool extension for tracking liq changes --- .../osmosis/concentrated-liquidity/pool.proto | 9 ++ x/concentrated-liquidity/incentives.go | 11 ++ x/concentrated-liquidity/model/pool.go | 11 ++ x/concentrated-liquidity/model/pool.pb.go | 123 +++++++++++++----- x/concentrated-liquidity/types/pool.go | 4 + 5 files changed, 124 insertions(+), 34 deletions(-) diff --git a/proto/osmosis/concentrated-liquidity/pool.proto b/proto/osmosis/concentrated-liquidity/pool.proto index f472790d3da..0c37964327d 100644 --- a/proto/osmosis/concentrated-liquidity/pool.proto +++ b/proto/osmosis/concentrated-liquidity/pool.proto @@ -7,6 +7,7 @@ package osmosis.concentratedliquidity.v1beta1; import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; +import "google/protobuf/timestamp.proto"; option go_package = "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model"; @@ -53,4 +54,12 @@ message Pool { (gogoproto.moretags) = "yaml:\"swap_fee\"", (gogoproto.nullable) = false ]; + + // last_liquidity_update is the last time either the pool liquidity or the + // active tick changed + google.protobuf.Timestamp last_liquidity_update = 11 [ + (gogoproto.nullable) = false, + (gogoproto.stdtime) = true, + (gogoproto.moretags) = "yaml:\"last_liquidity_update\"" + ]; } diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index c282aed1505..caab2c8a618 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -27,6 +27,17 @@ func (k Keeper) createUptimeAccumulators(ctx sdk.Context, poolId uint64) error { return nil } +// initializeLastLiquidityUpdate initialized the pool's LastLiquidityUpdate time to the current blocktime. +func (k Keeper) initializeLastLiquidityUpdate(ctx sdk.Context, poolId uint64) error { + pool, err := k.getPoolById(ctx, poolId) + if err != nil { + return err + } + pool.SetLastLiquidityUpdate(ctx.BlockTime()) + + return nil +} + func getUptimeAccumulatorName(poolId uint64, uptimeId uint64) string { poolIdStr := strconv.FormatUint(poolId, uintBase) uptimeIdStr := strconv.FormatUint(uptimeId, uintBase) diff --git a/x/concentrated-liquidity/model/pool.go b/x/concentrated-liquidity/model/pool.go index 87248e439ff..b41624351a7 100644 --- a/x/concentrated-liquidity/model/pool.go +++ b/x/concentrated-liquidity/model/pool.go @@ -3,6 +3,7 @@ package model import ( "encoding/json" fmt "fmt" + time "time" sdk "github.com/cosmos/cosmos-sdk/types" @@ -150,6 +151,11 @@ func (p Pool) GetLiquidity() sdk.Dec { return p.Liquidity } +// GetLastLiquidityUpdate returns the last time there was a change in pool liquidity or active tick. +func (p Pool) GetLastLiquidityUpdate() time.Time { + return p.LastLiquidityUpdate +} + func (p Pool) GetType() poolmanagertypes.PoolType { return poolmanagertypes.Concentrated } @@ -169,6 +175,11 @@ func (p *Pool) SetCurrentTick(newTick sdk.Int) { p.CurrentTick = newTick } +// SetLastLiquidityUpdate updates the pool's LastLiquidityUpdate to newTime. +func (p Pool) SetLastLiquidityUpdate(newTime time.Time) { + p.LastLiquidityUpdate = newTime +} + // updateLiquidityIfActivePosition updates the pool's liquidity if the position is active. // Returns true if updated, false otherwise. // TODO: add tests. diff --git a/x/concentrated-liquidity/model/pool.pb.go b/x/concentrated-liquidity/model/pool.pb.go index 17189a8856d..630bfdefc9f 100644 --- a/x/concentrated-liquidity/model/pool.pb.go +++ b/x/concentrated-liquidity/model/pool.pb.go @@ -14,15 +14,19 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" + _ "github.com/gogo/protobuf/types" + github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" io "io" math "math" math_bits "math/bits" + time "time" ) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +var _ = time.Kitchen // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. @@ -45,6 +49,9 @@ type Pool struct { PrecisionFactorAtPriceOne github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,9,opt,name=precision_factor_at_price_one,json=precisionFactorAtPriceOne,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"precision_factor_at_price_one" yaml:"precision_factor_at_price_one"` // swap_fee is the ratio that is charged on the amount of token in. SwapFee github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,10,opt,name=swap_fee,json=swapFee,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"swap_fee" yaml:"swap_fee"` + // last_liquidity_update is the last time either the pool liquidity or the + // active tick changed + LastLiquidityUpdate time.Time `protobuf:"bytes,11,opt,name=last_liquidity_update,json=lastLiquidityUpdate,proto3,stdtime" json:"last_liquidity_update" yaml:"last_liquidity_update"` } func (m *Pool) Reset() { *m = Pool{} } @@ -88,40 +95,45 @@ func init() { } var fileDescriptor_3526ea5373d96c9a = []byte{ - // 522 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x3f, 0x6f, 0xd3, 0x40, - 0x1c, 0xb5, 0x43, 0xfe, 0x34, 0xd7, 0xaa, 0xb4, 0x07, 0x82, 0x6b, 0x25, 0xec, 0xca, 0x02, 0x54, - 0x24, 0x12, 0x13, 0xc1, 0x94, 0xad, 0x01, 0x2a, 0x75, 0xa2, 0x72, 0x11, 0x03, 0xaa, 0x64, 0x9c, - 0xf3, 0x35, 0x3d, 0xc5, 0xf1, 0x39, 0x77, 0x97, 0x42, 0xbe, 0x01, 0x23, 0x63, 0xc7, 0x7e, 0x08, - 0x3e, 0x44, 0xc5, 0xd4, 0x11, 0x31, 0x58, 0x28, 0xf9, 0x06, 0x59, 0x59, 0x90, 0x7d, 0x17, 0xd7, - 0x0b, 0x48, 0x99, 0x7c, 0xef, 0xfd, 0x7e, 0xf7, 0xde, 0xb3, 0x7f, 0xfe, 0x81, 0x67, 0x4c, 0x8c, - 0x98, 0xa0, 0xc2, 0xc5, 0x2c, 0xc6, 0x24, 0x96, 0x3c, 0x90, 0x24, 0x6c, 0x45, 0x74, 0x3c, 0xa1, - 0x21, 0x95, 0x53, 0x37, 0x61, 0x2c, 0x6a, 0x27, 0x9c, 0x49, 0x06, 0x9f, 0xe8, 0xd6, 0x76, 0xb9, - 0xb5, 0xe8, 0x6c, 0x5f, 0x74, 0xfa, 0x44, 0x06, 0x9d, 0xdd, 0x1d, 0x9c, 0xf7, 0xf9, 0xf9, 0x25, - 0x57, 0x01, 0xa5, 0xb0, 0x7b, 0x7f, 0xc0, 0x06, 0x4c, 0xf1, 0xd9, 0x49, 0xb1, 0xce, 0x9f, 0x1a, - 0xa8, 0x1e, 0x33, 0x16, 0xc1, 0xe7, 0xa0, 0x11, 0x84, 0x21, 0x27, 0x42, 0x20, 0x73, 0xcf, 0xdc, - 0x6f, 0xf6, 0xe0, 0x22, 0xb5, 0x37, 0xa7, 0xc1, 0x28, 0xea, 0x3a, 0xba, 0xe0, 0x78, 0xcb, 0x16, - 0xb8, 0x09, 0x2a, 0x34, 0x44, 0x95, 0x3d, 0x73, 0xbf, 0xea, 0x55, 0x68, 0x08, 0x3f, 0x81, 0x66, - 0x11, 0x06, 0xdd, 0xc9, 0xef, 0xf7, 0xae, 0x53, 0xdb, 0xf8, 0x95, 0xda, 0x4f, 0x07, 0x54, 0x9e, - 0x4f, 0xfa, 0x6d, 0xcc, 0x46, 0x3a, 0x90, 0x7e, 0xb4, 0x44, 0x38, 0x74, 0xe5, 0x34, 0x21, 0xa2, - 0xfd, 0x86, 0xe0, 0x45, 0x6a, 0x6f, 0x29, 0xb7, 0x42, 0xc8, 0xf1, 0x6e, 0x45, 0xe1, 0x03, 0x50, - 0x97, 0x6c, 0x48, 0xe2, 0x17, 0xa8, 0x9a, 0xc9, 0x7b, 0x1a, 0x15, 0x7c, 0x07, 0xd5, 0x4a, 0x7c, - 0x07, 0x8e, 0x01, 0xc4, 0x13, 0xce, 0x49, 0x2c, 0x7d, 0x31, 0xe6, 0xd2, 0x4f, 0x38, 0xc5, 0x04, - 0xd5, 0xf3, 0x68, 0xaf, 0x57, 0x8e, 0xb6, 0xad, 0xa2, 0x89, 0x84, 0x69, 0x25, 0xc7, 0xdb, 0xd2, - 0xf2, 0x27, 0x63, 0x2e, 0x8f, 0x33, 0x0a, 0x9e, 0x83, 0x8d, 0xa5, 0xa5, 0xa4, 0x78, 0x88, 0x1a, - 0xb9, 0xd9, 0xdb, 0x15, 0xcc, 0x8e, 0x62, 0xb9, 0x48, 0xed, 0x7b, 0xca, 0xac, 0xac, 0xe5, 0x78, - 0xeb, 0x1a, 0xbe, 0xa7, 0x78, 0x08, 0xbb, 0x60, 0x23, 0x63, 0x7d, 0x91, 0x04, 0x98, 0xc6, 0x03, - 0xb4, 0x96, 0x0d, 0xa2, 0xf7, 0xf0, 0xf6, 0x6e, 0xb9, 0xea, 0x78, 0xeb, 0x19, 0x3c, 0x51, 0x08, - 0x5e, 0x9a, 0xe0, 0x51, 0xc2, 0x09, 0xa6, 0x82, 0xb2, 0xd8, 0x3f, 0x0b, 0xb0, 0x64, 0xdc, 0x0f, - 0xf4, 0x6b, 0xf9, 0x2c, 0x26, 0xa8, 0x99, 0xe7, 0xfe, 0xb0, 0x72, 0xee, 0xc7, 0xca, 0xfb, 0xbf, - 0xe2, 0x8e, 0xb7, 0x53, 0xd4, 0x0f, 0xf3, 0xf2, 0x81, 0xfa, 0x7a, 0xef, 0x62, 0x02, 0x4f, 0xc1, - 0x9a, 0xf8, 0x1c, 0x24, 0xfe, 0x19, 0x21, 0x08, 0xe4, 0x21, 0x0e, 0x56, 0x9e, 0xd4, 0x5d, 0x3d, - 0x29, 0xad, 0xe3, 0x78, 0x8d, 0xec, 0x78, 0x48, 0x48, 0x77, 0xfb, 0xeb, 0x95, 0x6d, 0x5c, 0x5e, - 0xd9, 0xc6, 0x8f, 0xef, 0xad, 0x5a, 0xf6, 0xcf, 0x1f, 0xf5, 0x4e, 0xaf, 0x67, 0x96, 0x79, 0x33, - 0xb3, 0xcc, 0xdf, 0x33, 0xcb, 0xfc, 0x36, 0xb7, 0x8c, 0x9b, 0xb9, 0x65, 0xfc, 0x9c, 0x5b, 0xc6, - 0xc7, 0x5e, 0xc9, 0x50, 0xaf, 0x5e, 0x2b, 0x0a, 0xfa, 0x62, 0x09, 0xdc, 0x8b, 0xce, 0x2b, 0xf7, - 0xcb, 0xbf, 0x16, 0x77, 0xc4, 0x42, 0x12, 0xf5, 0xeb, 0xf9, 0x8a, 0xbd, 0xfc, 0x1b, 0x00, 0x00, - 0xff, 0xff, 0xaf, 0x6b, 0xaf, 0x25, 0xe7, 0x03, 0x00, 0x00, + // 603 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x4f, 0x4f, 0xd4, 0x4e, + 0x18, 0x6e, 0xf9, 0xc1, 0x02, 0xb3, 0x84, 0x1f, 0x0c, 0xfe, 0x29, 0x44, 0x5b, 0xd2, 0xa8, 0x59, + 0x13, 0xb7, 0x75, 0xd5, 0x13, 0x37, 0xaa, 0x92, 0x90, 0x98, 0x48, 0x0a, 0x7a, 0x30, 0x24, 0x75, + 0x76, 0x3a, 0x94, 0xc9, 0xb6, 0x9d, 0x6e, 0x67, 0x16, 0xe1, 0x1b, 0x78, 0xe4, 0xc8, 0x91, 0x0f, + 0xe1, 0x87, 0x20, 0x9e, 0x38, 0x1a, 0x0f, 0xd5, 0xec, 0x7e, 0x83, 0x4d, 0xbc, 0x9b, 0xb6, 0xd3, + 0xb2, 0x07, 0x35, 0xd9, 0x53, 0xe7, 0x79, 0x9f, 0x77, 0x9e, 0xf7, 0x99, 0xbe, 0xf3, 0x0e, 0x78, + 0xcc, 0x78, 0xc4, 0x38, 0xe5, 0x36, 0x66, 0x31, 0x26, 0xb1, 0x48, 0x91, 0x20, 0x7e, 0x3b, 0xa4, + 0xfd, 0x01, 0xf5, 0xa9, 0x38, 0xb3, 0x13, 0xc6, 0x42, 0x2b, 0x49, 0x99, 0x60, 0xf0, 0xa1, 0x4c, + 0xb5, 0x26, 0x53, 0xeb, 0x4c, 0xeb, 0xa4, 0xd3, 0x25, 0x02, 0x75, 0x36, 0xd6, 0x71, 0x91, 0xe7, + 0x15, 0x9b, 0xec, 0x12, 0x94, 0x0a, 0x1b, 0xb7, 0x02, 0x16, 0xb0, 0x32, 0x9e, 0xaf, 0x64, 0xd4, + 0x08, 0x18, 0x0b, 0x42, 0x62, 0x17, 0xa8, 0x3b, 0x38, 0xb2, 0x05, 0x8d, 0x08, 0x17, 0x28, 0x4a, + 0xca, 0x04, 0xf3, 0x57, 0x03, 0xcc, 0xee, 0x31, 0x16, 0xc2, 0x27, 0x60, 0x1e, 0xf9, 0x7e, 0x4a, + 0x38, 0xd7, 0xd4, 0x4d, 0xb5, 0xb5, 0xe8, 0xc0, 0x71, 0x66, 0x2c, 0x9f, 0xa1, 0x28, 0xdc, 0x32, + 0x25, 0x61, 0xba, 0x55, 0x0a, 0x5c, 0x06, 0x33, 0xd4, 0xd7, 0x66, 0x36, 0xd5, 0xd6, 0xac, 0x3b, + 0x43, 0x7d, 0xf8, 0x11, 0x2c, 0xd6, 0x6e, 0xb5, 0xff, 0x8a, 0xfd, 0xce, 0x55, 0x66, 0x28, 0xdf, + 0x33, 0xe3, 0x51, 0x40, 0xc5, 0xf1, 0xa0, 0x6b, 0x61, 0x16, 0x49, 0xc7, 0xf2, 0xd3, 0xe6, 0x7e, + 0xcf, 0x16, 0x67, 0x09, 0xe1, 0xd6, 0x2b, 0x82, 0xc7, 0x99, 0xb1, 0x52, 0x56, 0xab, 0x85, 0x4c, + 0xf7, 0x46, 0x14, 0xde, 0x01, 0x0d, 0xc1, 0x7a, 0x24, 0x7e, 0xaa, 0xcd, 0xe6, 0xf2, 0xae, 0x44, + 0x75, 0xbc, 0xa3, 0xcd, 0x4d, 0xc4, 0x3b, 0xb0, 0x0f, 0x20, 0x1e, 0xa4, 0x29, 0x89, 0x85, 0xc7, + 0xfb, 0xa9, 0xf0, 0x92, 0x94, 0x62, 0xa2, 0x35, 0x0a, 0x6b, 0x2f, 0xa7, 0xb6, 0xb6, 0x5a, 0x5a, + 0xe3, 0x09, 0x93, 0x4a, 0xa6, 0xbb, 0x22, 0xe5, 0xf7, 0xfb, 0xa9, 0xd8, 0xcb, 0x43, 0xf0, 0x18, + 0x2c, 0x55, 0x25, 0x05, 0xc5, 0x3d, 0x6d, 0xbe, 0x28, 0xf6, 0x7a, 0x8a, 0x62, 0xbb, 0xb1, 0x18, + 0x67, 0xc6, 0x5a, 0x59, 0x6c, 0x52, 0xcb, 0x74, 0x9b, 0x12, 0x1e, 0x50, 0xdc, 0x83, 0x5b, 0x60, + 0x29, 0x8f, 0x7a, 0x3c, 0x41, 0x98, 0xc6, 0x81, 0xb6, 0x90, 0x37, 0xc2, 0xb9, 0x7b, 0xb3, 0x77, + 0x92, 0x35, 0xdd, 0x66, 0x0e, 0xf7, 0x4b, 0x04, 0x2f, 0x54, 0x70, 0x3f, 0x49, 0x09, 0xa6, 0x9c, + 0xb2, 0xd8, 0x3b, 0x42, 0x58, 0xb0, 0xd4, 0x43, 0xf2, 0x58, 0x1e, 0x8b, 0x89, 0xb6, 0x58, 0xf8, + 0x7e, 0x3f, 0xb5, 0xef, 0x07, 0x65, 0xed, 0x7f, 0x8a, 0x9b, 0xee, 0x7a, 0xcd, 0xef, 0x14, 0xf4, + 0x76, 0xf9, 0xf7, 0xde, 0xc6, 0x04, 0x1e, 0x82, 0x05, 0xfe, 0x09, 0x25, 0xde, 0x11, 0x21, 0x1a, + 0x28, 0x4c, 0x6c, 0x4f, 0xdd, 0xa9, 0xff, 0x65, 0xa7, 0xa4, 0x8e, 0xe9, 0xce, 0xe7, 0xcb, 0x1d, + 0x42, 0xe0, 0x29, 0xb8, 0x1d, 0x22, 0x2e, 0xbc, 0xfa, 0x4e, 0x79, 0x83, 0xc4, 0x47, 0x82, 0x68, + 0xcd, 0x4d, 0xb5, 0xd5, 0x7c, 0xb6, 0x61, 0x95, 0xb3, 0x62, 0x55, 0xb3, 0x62, 0x1d, 0x54, 0xb3, + 0xe2, 0xb4, 0x72, 0x1b, 0xe3, 0xcc, 0xb8, 0x27, 0x6f, 0xe8, 0x9f, 0x64, 0xcc, 0xf3, 0x1f, 0x86, + 0xea, 0xae, 0xe5, 0xdc, 0x9b, 0x8a, 0x7a, 0x57, 0x30, 0x5b, 0xab, 0x9f, 0x2f, 0x0d, 0xe5, 0xe2, + 0xd2, 0x50, 0xbe, 0x7e, 0x69, 0xcf, 0xe5, 0xd3, 0xb6, 0xeb, 0x1c, 0x5e, 0x0d, 0x75, 0xf5, 0x7a, + 0xa8, 0xab, 0x3f, 0x87, 0xba, 0x7a, 0x3e, 0xd2, 0x95, 0xeb, 0x91, 0xae, 0x7c, 0x1b, 0xe9, 0xca, + 0x07, 0x67, 0xe2, 0xa8, 0xf2, 0x55, 0x68, 0x87, 0xa8, 0xcb, 0x2b, 0x60, 0x9f, 0x74, 0x5e, 0xd8, + 0xa7, 0x7f, 0x7b, 0x53, 0x22, 0xe6, 0x93, 0xb0, 0xdb, 0x28, 0xce, 0xf0, 0xfc, 0x77, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x25, 0x8f, 0x73, 0x4f, 0x82, 0x04, 0x00, 0x00, } func (m *Pool) Marshal() (dAtA []byte, err error) { @@ -144,6 +156,14 @@ func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastLiquidityUpdate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastLiquidityUpdate):]) + if err1 != nil { + return 0, err1 + } + i -= n1 + i = encodeVarintPool(dAtA, i, uint64(n1)) + i-- + dAtA[i] = 0x5a { size := m.SwapFee.Size() i -= size @@ -273,6 +293,8 @@ func (m *Pool) Size() (n int) { n += 1 + l + sovPool(uint64(l)) l = m.SwapFee.Size() n += 1 + l + sovPool(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.LastLiquidityUpdate) + n += 1 + l + sovPool(uint64(l)) return n } @@ -615,6 +637,39 @@ func (m *Pool) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastLiquidityUpdate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPool + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.LastLiquidityUpdate, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPool(dAtA[iNdEx:]) diff --git a/x/concentrated-liquidity/types/pool.go b/x/concentrated-liquidity/types/pool.go index 781db895b96..d6808514069 100644 --- a/x/concentrated-liquidity/types/pool.go +++ b/x/concentrated-liquidity/types/pool.go @@ -1,6 +1,8 @@ package types import ( + "time" + sdk "github.com/cosmos/cosmos-sdk/types" poolmanagertypes "github.com/osmosis-labs/osmosis/v14/x/poolmanager/types" @@ -17,8 +19,10 @@ type ConcentratedPoolExtension interface { GetPrecisionFactorAtPriceOne() sdk.Int GetTickSpacing() uint64 GetLiquidity() sdk.Dec + GetLastLiquidityUpdate() time.Time SetCurrentSqrtPrice(newSqrtPrice sdk.Dec) SetCurrentTick(newTick sdk.Int) + SetLastLiquidityUpdate(newTime time.Time) UpdateLiquidity(newLiquidity sdk.Dec) ApplySwap(newLiquidity sdk.Dec, newCurrentTick sdk.Int, newCurrentSqrtPrice sdk.Dec) error From 188778d40e45d21c8c5936fec3d42a7eba1eeb9e Mon Sep 17 00:00:00 2001 From: alpo Date: Wed, 1 Feb 2023 15:21:32 -0800 Subject: [PATCH 030/136] update new field at pool initialization and add tests --- x/concentrated-liquidity/incentives.go | 11 ----------- x/concentrated-liquidity/model/pool.go | 2 +- x/concentrated-liquidity/pool.go | 4 ++++ x/concentrated-liquidity/pool_test.go | 5 +++++ 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index caab2c8a618..c282aed1505 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -27,17 +27,6 @@ func (k Keeper) createUptimeAccumulators(ctx sdk.Context, poolId uint64) error { return nil } -// initializeLastLiquidityUpdate initialized the pool's LastLiquidityUpdate time to the current blocktime. -func (k Keeper) initializeLastLiquidityUpdate(ctx sdk.Context, poolId uint64) error { - pool, err := k.getPoolById(ctx, poolId) - if err != nil { - return err - } - pool.SetLastLiquidityUpdate(ctx.BlockTime()) - - return nil -} - func getUptimeAccumulatorName(poolId uint64, uptimeId uint64) string { poolIdStr := strconv.FormatUint(poolId, uintBase) uptimeIdStr := strconv.FormatUint(uptimeId, uintBase) diff --git a/x/concentrated-liquidity/model/pool.go b/x/concentrated-liquidity/model/pool.go index b41624351a7..b193e000646 100644 --- a/x/concentrated-liquidity/model/pool.go +++ b/x/concentrated-liquidity/model/pool.go @@ -176,7 +176,7 @@ func (p *Pool) SetCurrentTick(newTick sdk.Int) { } // SetLastLiquidityUpdate updates the pool's LastLiquidityUpdate to newTime. -func (p Pool) SetLastLiquidityUpdate(newTime time.Time) { +func (p *Pool) SetLastLiquidityUpdate(newTime time.Time) { p.LastLiquidityUpdate = newTime } diff --git a/x/concentrated-liquidity/pool.go b/x/concentrated-liquidity/pool.go index 4bf8c0974ae..fafa16844c6 100644 --- a/x/concentrated-liquidity/pool.go +++ b/x/concentrated-liquidity/pool.go @@ -27,6 +27,10 @@ func (k Keeper) InitializePool(ctx sdk.Context, poolI poolmanagertypes.PoolI, cr return err } + concentratedPool.SetLastLiquidityUpdate(ctx.BlockTime()) + + // TODO: add validateLastLiquidityUpdate check + tickSpacing := concentratedPool.GetTickSpacing() if !k.validateTickSpacing(ctx, tickSpacing) { diff --git a/x/concentrated-liquidity/pool_test.go b/x/concentrated-liquidity/pool_test.go index 50c39c64c4c..6ae67970b8a 100644 --- a/x/concentrated-liquidity/pool_test.go +++ b/x/concentrated-liquidity/pool_test.go @@ -92,6 +92,11 @@ func (s *KeeperTestSuite) TestInitializePool() { for _, uptimeAccumulator := range uptimeAccumulators { s.Require().Equal(cl.EmptyCoins, uptimeAccumulator.GetValue()) } + + // Ensure that pool's LastLiquidityUpdate was properly updated to current blocktime + pool, err := s.App.ConcentratedLiquidityKeeper.GetPoolById(s.Ctx, test.poolI.GetId()) + s.Require().NoError(err) + s.Require().Equal(s.Ctx.BlockTime(), pool.GetLastLiquidityUpdate()) } else { // Ensure specified error is returned s.Require().Error(err) From 093024de69bb93d9ecdb340215c8b96b08465534 Mon Sep 17 00:00:00 2001 From: alpo Date: Wed, 1 Feb 2023 16:53:54 -0800 Subject: [PATCH 031/136] comment todos --- x/concentrated-liquidity/incentives.go | 21 +++++++++++++++++++++ x/concentrated-liquidity/position.go | 6 +++++- x/concentrated-liquidity/tick.go | 2 +- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index c282aed1505..97e1b69bcbc 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -99,4 +99,25 @@ func (k Keeper) getInitialUptimeGrowthOutsidesForTick(ctx sdk.Context, poolId ui } return emptyUptimeValues, nil +} + +func (k Keeper) updateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) error { + // pool, err := k.getPoolById(ctx, poolId) + // if err != nil { + // return err + // } + + // lastLiqUpdate := pool.GetLastLiquidityUpdate() + // timeElapsed := sdk.NewDec(int64(time.Since(lastLiqUpdate))) + + // TODO: get liquidity directly from accumulator (total shares) + // Will need to loop through all uptime accums here + + // poolLiquidity := pool.GetLiquidity() + // amountToAdd := timeElapsed.Quo(poolLiquidity) + + // TODO: AddToAccumulator for each uptime accum here using (curTime - lastTime) / frozenLiquidity + // TODO: update LastLiqUpdate time here (using helper w/ new set fn + setPool) + + return nil } \ No newline at end of file diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index a8245c4c88e..e53e69dd042 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -81,6 +81,8 @@ func (k Keeper) initOrUpdatePosition( return err } + // TODO: move these into helper functions that move up position's accum value by + // "incentives earned outside tick range" to not overpay if !recordExists { err = curUptimeAccum.NewPosition(positionName, position.Liquidity, &accum.Options{}) } else if !liquidityDelta.IsNegative() { @@ -93,8 +95,10 @@ func (k Keeper) initOrUpdatePosition( } } } - k.setPosition(ctx, poolId, owner, lowerTick, upperTick, position, frozenUntil) + // TODO: AddToAccumulator for each uptime accum here using (curTime - lastTime) / getPoolById().GetLiquidity() + // TODO: update LastLiqUpdate time here (using helper w/ new set fn + setPool) + // TODO: move the logic from the previous two TODOs into a single helper in incentives.go return nil } diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index 5f9164f8d7f..33aed46b37b 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -113,7 +113,7 @@ func (k Keeper) getTickInfo(ctx sdk.Context, poolId uint64, tickIndex int64) (ti initialUptimeTrackers := []model.UptimeTracker{} for _, uptimeValue := range initialUptimeGrowthOutsideValues { - initialUptimeTrackers = append(initialUptimeTrackers, model.UptimeTracker{uptimeValue}) + initialUptimeTrackers = append(initialUptimeTrackers, model.UptimeTracker{UptimeGrowthOutside: uptimeValue}) } return model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: initialFeeGrowthOutside, UptimeTrackers: initialUptimeTrackers}, nil From a778dbbfed161febf75765a55ab6757b64ad4a45 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Feb 2023 09:25:51 -0800 Subject: [PATCH 032/136] clean up naming and move empty options to global var --- x/concentrated-liquidity/export_test.go | 4 ++-- x/concentrated-liquidity/incentives.go | 16 ++++++++-------- x/concentrated-liquidity/incentives_test.go | 10 +++++----- x/concentrated-liquidity/position.go | 8 +++++--- x/concentrated-liquidity/position_test.go | 4 ++-- 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index 6b4741a2c36..dbf3264f012 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -149,6 +149,6 @@ func (k Keeper) GetUptimeAccumulators(ctx sdk.Context, poolId uint64) ([]accum.A return k.getUptimeAccumulators(ctx, poolId) } -func GetUptimeAccumulatorName(poolId, uptimeId uint64) string { - return getUptimeAccumulatorName(poolId, uptimeId) +func GetUptimeAccumulatorName(poolId, uptimeIndex uint64) string { + return getUptimeAccumulatorName(poolId, uptimeIndex) } diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 9d8ad6b8055..aff5e960a18 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -17,8 +17,8 @@ const ( // createUptimeAccumulators creates accumulator objects in store for each supported uptime for the given poolId. // The accumulators are initialized with the default (zero) values. func (k Keeper) createUptimeAccumulators(ctx sdk.Context, poolId uint64) error { - for uptimeId := range types.SupportedUptimes { - err := accum.MakeAccumulator(ctx.KVStore(k.storeKey), getUptimeAccumulatorName(poolId, uint64(uptimeId))) + for uptimeIndex := range types.SupportedUptimes { + err := accum.MakeAccumulator(ctx.KVStore(k.storeKey), getUptimeAccumulatorName(poolId, uint64(uptimeIndex))) if err != nil { return err } @@ -27,10 +27,10 @@ func (k Keeper) createUptimeAccumulators(ctx sdk.Context, poolId uint64) error { return nil } -func getUptimeAccumulatorName(poolId uint64, uptimeId uint64) string { +func getUptimeAccumulatorName(poolId uint64, uptimeIndex uint64) string { poolIdStr := strconv.FormatUint(poolId, uintBase) - uptimeIdStr := strconv.FormatUint(uptimeId, uintBase) - return strings.Join([]string{uptimeAccumPrefix, poolIdStr, uptimeIdStr}, "/") + uptimeIndexStr := strconv.FormatUint(uptimeIndex, uintBase) + return strings.Join([]string{uptimeAccumPrefix, poolIdStr, uptimeIndexStr}, "/") } // nolint: unused @@ -38,13 +38,13 @@ func getUptimeAccumulatorName(poolId uint64, uptimeId uint64) string { // Returns error if accumulator for the given poolId does not exist. func (k Keeper) getUptimeAccumulators(ctx sdk.Context, poolId uint64) ([]accum.AccumulatorObject, error) { accums := make([]accum.AccumulatorObject, len(types.SupportedUptimes)) - for uptimeId := range types.SupportedUptimes { - acc, err := accum.GetAccumulator(ctx.KVStore(k.storeKey), getUptimeAccumulatorName(poolId, uint64(uptimeId))) + for uptimeIndex := range types.SupportedUptimes { + acc, err := accum.GetAccumulator(ctx.KVStore(k.storeKey), getUptimeAccumulatorName(poolId, uint64(uptimeIndex))) if err != nil { return []accum.AccumulatorObject{}, err } - accums[uptimeId] = acc + accums[uptimeIndex] = acc } return accums, nil diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 61ff658fb19..e7a432fbc42 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -85,23 +85,23 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { func (s *KeeperTestSuite) TestGetUptimeAccumulatorName() { type getUptimeNameTest struct { poolId uint64 - uptimeId uint64 + uptimeIndex uint64 expectedAccumName string } tests := map[string]getUptimeNameTest{ "pool id 1, uptime id 0": { poolId: defaultPoolId, - uptimeId: uint64(0), + uptimeIndex: uint64(0), expectedAccumName: "uptime/1/0", }, "pool id 1, uptime id 999": { poolId: defaultPoolId, - uptimeId: uint64(999), + uptimeIndex: uint64(999), expectedAccumName: "uptime/1/999", }, "pool id 999, uptime id 1": { poolId: uint64(999), - uptimeId: uint64(1), + uptimeIndex: uint64(1), expectedAccumName: "uptime/999/1", }, } @@ -112,7 +112,7 @@ func (s *KeeperTestSuite) TestGetUptimeAccumulatorName() { s.SetupTest() // system under test - accumName := cl.GetUptimeAccumulatorName(tc.poolId, tc.uptimeId) + accumName := cl.GetUptimeAccumulatorName(tc.poolId, tc.uptimeIndex) s.Require().Equal(tc.expectedAccumName, accumName) }) } diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index d973fa39135..0a0575d3eef 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -11,6 +11,8 @@ import ( types "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" ) +var emptyOptions = &accum.Options{} + // getOrInitPosition retrieves the position for the given tick range. If it doesn't exist, it returns an initialized position with zero liquidity. func (k Keeper) getOrInitPosition( ctx sdk.Context, @@ -69,9 +71,9 @@ func (k Keeper) initOrUpdatePosition( return err } - for uptimeId, uptime := range types.SupportedUptimes { + for uptimeIndex, uptime := range types.SupportedUptimes { if position.FrozenUntil.Sub(ctx.BlockTime()) >= uptime { - curUptimeAccum := uptimeAccumulators[uptimeId] + curUptimeAccum := uptimeAccumulators[uptimeIndex] // If a record does not exist for this uptime accumulator, create a new position. // Otherwise, add to existing record. @@ -82,7 +84,7 @@ func (k Keeper) initOrUpdatePosition( } if !recordExists { - err = curUptimeAccum.NewPosition(positionName, position.Liquidity, &accum.Options{}) + err = curUptimeAccum.NewPosition(positionName, position.Liquidity, emptyOptions) } else if !liquidityDelta.IsNegative() { err = curUptimeAccum.AddToPosition(positionName, liquidityDelta) } else { diff --git a/x/concentrated-liquidity/position_test.go b/x/concentrated-liquidity/position_test.go index 5347debcf0f..dfd418c7bd8 100644 --- a/x/concentrated-liquidity/position_test.go +++ b/x/concentrated-liquidity/position_test.go @@ -136,8 +136,8 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { s.Require().NoError(err) // If frozen for more than a specific uptime's period, the record should exist - for uptimeId, uptime := range types.SupportedUptimes { - recordExists, err := uptimeAccums[uptimeId].HasPosition(positionName) + for uptimeIndex, uptime := range types.SupportedUptimes { + recordExists, err := uptimeAccums[uptimeIndex].HasPosition(positionName) s.Require().NoError(err) if test.param.frozenUntil.Sub(s.Ctx.BlockTime()) >= uptime { s.Require().True(recordExists) From 0c9c23501c36d59a427792a9d5b972dbbaa0edee Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Feb 2023 10:18:59 -0800 Subject: [PATCH 033/136] add clarifying comments and lint --- x/concentrated-liquidity/incentives_test.go | 8 ++++---- x/concentrated-liquidity/position.go | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index e7a432fbc42..28f26dd8781 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -85,23 +85,23 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { func (s *KeeperTestSuite) TestGetUptimeAccumulatorName() { type getUptimeNameTest struct { poolId uint64 - uptimeIndex uint64 + uptimeIndex uint64 expectedAccumName string } tests := map[string]getUptimeNameTest{ "pool id 1, uptime id 0": { poolId: defaultPoolId, - uptimeIndex: uint64(0), + uptimeIndex: uint64(0), expectedAccumName: "uptime/1/0", }, "pool id 1, uptime id 999": { poolId: defaultPoolId, - uptimeIndex: uint64(999), + uptimeIndex: uint64(999), expectedAccumName: "uptime/1/999", }, "pool id 999, uptime id 1": { poolId: uint64(999), - uptimeIndex: uint64(1), + uptimeIndex: uint64(1), expectedAccumName: "uptime/999/1", }, } diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 91a29addebf..588eb850d7b 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -72,6 +72,10 @@ func (k Keeper) initOrUpdatePosition( } for uptimeIndex, uptime := range types.SupportedUptimes { + // We assume every position update requires the position to be frozen for the + // min uptime again. Thus, if the difference between the position's `FrozenUntil` + // and the blocktime when the update happens should be greater than the required + // uptime. if position.FrozenUntil.Sub(ctx.BlockTime()) >= uptime { curUptimeAccum := uptimeAccumulators[uptimeIndex] From 7c6eb8fe97eb220b83dcade4c86232fb20cbdcaf Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Feb 2023 11:30:01 -0800 Subject: [PATCH 034/136] implement IncentiveRecord proto --- .../osmosis/concentrated-liquidity/pool.proto | 42 ++ x/concentrated-liquidity/model/pool.pb.go | 521 ++++++++++++++++-- 2 files changed, 523 insertions(+), 40 deletions(-) diff --git a/proto/osmosis/concentrated-liquidity/pool.proto b/proto/osmosis/concentrated-liquidity/pool.proto index 0c37964327d..e8830404448 100644 --- a/proto/osmosis/concentrated-liquidity/pool.proto +++ b/proto/osmosis/concentrated-liquidity/pool.proto @@ -62,4 +62,46 @@ message Pool { (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"last_liquidity_update\"" ]; + + repeated IncentiveRecord pool_incentives = 12 [ + (gogoproto.moretags) = "yaml:\"pool_incentives\"", + (gogoproto.nullable) = false + ]; } + +// IncentiveRecord represents an active perpetual incentive gauge for a pool +message IncentiveRecord { + // min uptime for incentive record, will loop through and compare against + // supported uptimes + string incentive_denom = 1; + + // remaining_amount is the total amount of incentives to be distributed + string remaining_amount = 2 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.moretags) = "yaml:\"remaining_amount\"", + (gogoproto.nullable) = false + ]; + + // emission_rate is the incentive emission rate per second + string emission_rate = 3 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.moretags) = "yaml:\"swap_fee\"", + (gogoproto.nullable) = false + ]; + + // start_time is the time when the incentive starts distributing + google.protobuf.Timestamp start_time = 4 [ + (gogoproto.nullable) = false, + (gogoproto.stdtime) = true, + (gogoproto.moretags) = "yaml:\"start_time\"" + ]; + + // min_uptime is the minimum uptime required for liquidity to qualify for this + // incentive. It should be always be one of the supported uptimes in + // types.SupportedUptimes + google.protobuf.Timestamp min_uptime = 5 [ + (gogoproto.nullable) = false, + (gogoproto.stdtime) = true, + (gogoproto.moretags) = "yaml:\"min_uptime\"" + ]; +} \ No newline at end of file diff --git a/x/concentrated-liquidity/model/pool.pb.go b/x/concentrated-liquidity/model/pool.pb.go index 630bfdefc9f..c2cd20b91d0 100644 --- a/x/concentrated-liquidity/model/pool.pb.go +++ b/x/concentrated-liquidity/model/pool.pb.go @@ -51,7 +51,8 @@ type Pool struct { SwapFee github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,10,opt,name=swap_fee,json=swapFee,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"swap_fee" yaml:"swap_fee"` // last_liquidity_update is the last time either the pool liquidity or the // active tick changed - LastLiquidityUpdate time.Time `protobuf:"bytes,11,opt,name=last_liquidity_update,json=lastLiquidityUpdate,proto3,stdtime" json:"last_liquidity_update" yaml:"last_liquidity_update"` + LastLiquidityUpdate time.Time `protobuf:"bytes,11,opt,name=last_liquidity_update,json=lastLiquidityUpdate,proto3,stdtime" json:"last_liquidity_update" yaml:"last_liquidity_update"` + PoolIncentives []IncentiveRecord `protobuf:"bytes,12,rep,name=pool_incentives,json=poolIncentives,proto3" json:"pool_incentives" yaml:"pool_incentives"` } func (m *Pool) Reset() { *m = Pool{} } @@ -86,8 +87,80 @@ func (m *Pool) XXX_DiscardUnknown() { var xxx_messageInfo_Pool proto.InternalMessageInfo +// IncentiveRecord represents an active perpetual incentive gauge for a pool +type IncentiveRecord struct { + // min uptime for incentive record, will loop through and compare against + // supported uptimes + IncentiveDenom string `protobuf:"bytes,1,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` + // remaining_amount is the total amount of incentives to be distributed + RemainingAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=remaining_amount,json=remainingAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"remaining_amount" yaml:"remaining_amount"` + // emission_rate is the incentive emission rate per second + EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"swap_fee"` + // start_time is the time when the incentive starts distributing + StartTime time.Time `protobuf:"bytes,4,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` + // min_uptime is the minimum uptime required for liquidity to qualify for this + // incentive. It should be always be one of the supported uptimes in + // types.SupportedUptimes + MinUptime time.Time `protobuf:"bytes,5,opt,name=min_uptime,json=minUptime,proto3,stdtime" json:"min_uptime" yaml:"min_uptime"` +} + +func (m *IncentiveRecord) Reset() { *m = IncentiveRecord{} } +func (m *IncentiveRecord) String() string { return proto.CompactTextString(m) } +func (*IncentiveRecord) ProtoMessage() {} +func (*IncentiveRecord) Descriptor() ([]byte, []int) { + return fileDescriptor_3526ea5373d96c9a, []int{1} +} +func (m *IncentiveRecord) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IncentiveRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_IncentiveRecord.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *IncentiveRecord) XXX_Merge(src proto.Message) { + xxx_messageInfo_IncentiveRecord.Merge(m, src) +} +func (m *IncentiveRecord) XXX_Size() int { + return m.Size() +} +func (m *IncentiveRecord) XXX_DiscardUnknown() { + xxx_messageInfo_IncentiveRecord.DiscardUnknown(m) +} + +var xxx_messageInfo_IncentiveRecord proto.InternalMessageInfo + +func (m *IncentiveRecord) GetIncentiveDenom() string { + if m != nil { + return m.IncentiveDenom + } + return "" +} + +func (m *IncentiveRecord) GetStartTime() time.Time { + if m != nil { + return m.StartTime + } + return time.Time{} +} + +func (m *IncentiveRecord) GetMinUptime() time.Time { + if m != nil { + return m.MinUptime + } + return time.Time{} +} + func init() { proto.RegisterType((*Pool)(nil), "osmosis.concentratedliquidity.v1beta1.Pool") + proto.RegisterType((*IncentiveRecord)(nil), "osmosis.concentratedliquidity.v1beta1.IncentiveRecord") } func init() { @@ -95,45 +168,56 @@ func init() { } var fileDescriptor_3526ea5373d96c9a = []byte{ - // 603 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x4f, 0x4f, 0xd4, 0x4e, - 0x18, 0x6e, 0xf9, 0xc1, 0x02, 0xb3, 0x84, 0x1f, 0x0c, 0xfe, 0x29, 0x44, 0x5b, 0xd2, 0xa8, 0x59, - 0x13, 0xb7, 0x75, 0xd5, 0x13, 0x37, 0xaa, 0x92, 0x90, 0x98, 0x48, 0x0a, 0x7a, 0x30, 0x24, 0x75, - 0x76, 0x3a, 0x94, 0xc9, 0xb6, 0x9d, 0x6e, 0x67, 0x16, 0xe1, 0x1b, 0x78, 0xe4, 0xc8, 0x91, 0x0f, - 0xe1, 0x87, 0x20, 0x9e, 0x38, 0x1a, 0x0f, 0xd5, 0xec, 0x7e, 0x83, 0x4d, 0xbc, 0x9b, 0xb6, 0xd3, - 0xb2, 0x07, 0x35, 0xd9, 0x53, 0xe7, 0x79, 0x9f, 0x77, 0x9e, 0xf7, 0x99, 0xbe, 0xf3, 0x0e, 0x78, - 0xcc, 0x78, 0xc4, 0x38, 0xe5, 0x36, 0x66, 0x31, 0x26, 0xb1, 0x48, 0x91, 0x20, 0x7e, 0x3b, 0xa4, - 0xfd, 0x01, 0xf5, 0xa9, 0x38, 0xb3, 0x13, 0xc6, 0x42, 0x2b, 0x49, 0x99, 0x60, 0xf0, 0xa1, 0x4c, - 0xb5, 0x26, 0x53, 0xeb, 0x4c, 0xeb, 0xa4, 0xd3, 0x25, 0x02, 0x75, 0x36, 0xd6, 0x71, 0x91, 0xe7, - 0x15, 0x9b, 0xec, 0x12, 0x94, 0x0a, 0x1b, 0xb7, 0x02, 0x16, 0xb0, 0x32, 0x9e, 0xaf, 0x64, 0xd4, - 0x08, 0x18, 0x0b, 0x42, 0x62, 0x17, 0xa8, 0x3b, 0x38, 0xb2, 0x05, 0x8d, 0x08, 0x17, 0x28, 0x4a, - 0xca, 0x04, 0xf3, 0x57, 0x03, 0xcc, 0xee, 0x31, 0x16, 0xc2, 0x27, 0x60, 0x1e, 0xf9, 0x7e, 0x4a, - 0x38, 0xd7, 0xd4, 0x4d, 0xb5, 0xb5, 0xe8, 0xc0, 0x71, 0x66, 0x2c, 0x9f, 0xa1, 0x28, 0xdc, 0x32, - 0x25, 0x61, 0xba, 0x55, 0x0a, 0x5c, 0x06, 0x33, 0xd4, 0xd7, 0x66, 0x36, 0xd5, 0xd6, 0xac, 0x3b, - 0x43, 0x7d, 0xf8, 0x11, 0x2c, 0xd6, 0x6e, 0xb5, 0xff, 0x8a, 0xfd, 0xce, 0x55, 0x66, 0x28, 0xdf, - 0x33, 0xe3, 0x51, 0x40, 0xc5, 0xf1, 0xa0, 0x6b, 0x61, 0x16, 0x49, 0xc7, 0xf2, 0xd3, 0xe6, 0x7e, - 0xcf, 0x16, 0x67, 0x09, 0xe1, 0xd6, 0x2b, 0x82, 0xc7, 0x99, 0xb1, 0x52, 0x56, 0xab, 0x85, 0x4c, - 0xf7, 0x46, 0x14, 0xde, 0x01, 0x0d, 0xc1, 0x7a, 0x24, 0x7e, 0xaa, 0xcd, 0xe6, 0xf2, 0xae, 0x44, - 0x75, 0xbc, 0xa3, 0xcd, 0x4d, 0xc4, 0x3b, 0xb0, 0x0f, 0x20, 0x1e, 0xa4, 0x29, 0x89, 0x85, 0xc7, - 0xfb, 0xa9, 0xf0, 0x92, 0x94, 0x62, 0xa2, 0x35, 0x0a, 0x6b, 0x2f, 0xa7, 0xb6, 0xb6, 0x5a, 0x5a, - 0xe3, 0x09, 0x93, 0x4a, 0xa6, 0xbb, 0x22, 0xe5, 0xf7, 0xfb, 0xa9, 0xd8, 0xcb, 0x43, 0xf0, 0x18, - 0x2c, 0x55, 0x25, 0x05, 0xc5, 0x3d, 0x6d, 0xbe, 0x28, 0xf6, 0x7a, 0x8a, 0x62, 0xbb, 0xb1, 0x18, - 0x67, 0xc6, 0x5a, 0x59, 0x6c, 0x52, 0xcb, 0x74, 0x9b, 0x12, 0x1e, 0x50, 0xdc, 0x83, 0x5b, 0x60, - 0x29, 0x8f, 0x7a, 0x3c, 0x41, 0x98, 0xc6, 0x81, 0xb6, 0x90, 0x37, 0xc2, 0xb9, 0x7b, 0xb3, 0x77, - 0x92, 0x35, 0xdd, 0x66, 0x0e, 0xf7, 0x4b, 0x04, 0x2f, 0x54, 0x70, 0x3f, 0x49, 0x09, 0xa6, 0x9c, - 0xb2, 0xd8, 0x3b, 0x42, 0x58, 0xb0, 0xd4, 0x43, 0xf2, 0x58, 0x1e, 0x8b, 0x89, 0xb6, 0x58, 0xf8, - 0x7e, 0x3f, 0xb5, 0xef, 0x07, 0x65, 0xed, 0x7f, 0x8a, 0x9b, 0xee, 0x7a, 0xcd, 0xef, 0x14, 0xf4, - 0x76, 0xf9, 0xf7, 0xde, 0xc6, 0x04, 0x1e, 0x82, 0x05, 0xfe, 0x09, 0x25, 0xde, 0x11, 0x21, 0x1a, - 0x28, 0x4c, 0x6c, 0x4f, 0xdd, 0xa9, 0xff, 0x65, 0xa7, 0xa4, 0x8e, 0xe9, 0xce, 0xe7, 0xcb, 0x1d, - 0x42, 0xe0, 0x29, 0xb8, 0x1d, 0x22, 0x2e, 0xbc, 0xfa, 0x4e, 0x79, 0x83, 0xc4, 0x47, 0x82, 0x68, - 0xcd, 0x4d, 0xb5, 0xd5, 0x7c, 0xb6, 0x61, 0x95, 0xb3, 0x62, 0x55, 0xb3, 0x62, 0x1d, 0x54, 0xb3, - 0xe2, 0xb4, 0x72, 0x1b, 0xe3, 0xcc, 0xb8, 0x27, 0x6f, 0xe8, 0x9f, 0x64, 0xcc, 0xf3, 0x1f, 0x86, - 0xea, 0xae, 0xe5, 0xdc, 0x9b, 0x8a, 0x7a, 0x57, 0x30, 0x5b, 0xab, 0x9f, 0x2f, 0x0d, 0xe5, 0xe2, - 0xd2, 0x50, 0xbe, 0x7e, 0x69, 0xcf, 0xe5, 0xd3, 0xb6, 0xeb, 0x1c, 0x5e, 0x0d, 0x75, 0xf5, 0x7a, - 0xa8, 0xab, 0x3f, 0x87, 0xba, 0x7a, 0x3e, 0xd2, 0x95, 0xeb, 0x91, 0xae, 0x7c, 0x1b, 0xe9, 0xca, - 0x07, 0x67, 0xe2, 0xa8, 0xf2, 0x55, 0x68, 0x87, 0xa8, 0xcb, 0x2b, 0x60, 0x9f, 0x74, 0x5e, 0xd8, - 0xa7, 0x7f, 0x7b, 0x53, 0x22, 0xe6, 0x93, 0xb0, 0xdb, 0x28, 0xce, 0xf0, 0xfc, 0x77, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x25, 0x8f, 0x73, 0x4f, 0x82, 0x04, 0x00, 0x00, + // 784 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0x4f, 0x4f, 0xe3, 0x46, + 0x14, 0x8f, 0xf9, 0x17, 0x32, 0x49, 0x13, 0x18, 0x5a, 0x30, 0xa8, 0xc4, 0x91, 0xd5, 0x3f, 0xa9, + 0xd4, 0xd8, 0x0d, 0xad, 0x7a, 0xe0, 0x86, 0x4b, 0x91, 0x22, 0x55, 0x2a, 0x32, 0x50, 0x55, 0x15, + 0x92, 0xeb, 0xd8, 0x93, 0x30, 0x8a, 0xed, 0x71, 0x3c, 0x13, 0x0a, 0xa7, 0x5e, 0x7b, 0xe4, 0xc8, + 0x91, 0x0f, 0xd1, 0x0f, 0x81, 0xaa, 0x1e, 0x38, 0x56, 0x3d, 0x64, 0x57, 0xf0, 0x0d, 0x72, 0xd8, + 0xf3, 0x6a, 0xc6, 0x63, 0x93, 0x45, 0xbb, 0x68, 0x23, 0xed, 0x29, 0x7e, 0xbf, 0xf7, 0xde, 0xef, + 0xfd, 0x66, 0xde, 0x7b, 0x13, 0xf0, 0x15, 0xa1, 0x21, 0xa1, 0x98, 0x9a, 0x1e, 0x89, 0x3c, 0x14, + 0xb1, 0xc4, 0x65, 0xc8, 0x6f, 0x05, 0x78, 0x38, 0xc2, 0x3e, 0x66, 0x97, 0x66, 0x4c, 0x48, 0x60, + 0xc4, 0x09, 0x61, 0x04, 0x7e, 0x2e, 0x43, 0x8d, 0xe9, 0xd0, 0x3c, 0xd2, 0x38, 0x6f, 0x77, 0x11, + 0x73, 0xdb, 0x5b, 0x9b, 0x9e, 0x88, 0x73, 0x44, 0x92, 0x99, 0x1a, 0x29, 0xc3, 0xd6, 0xc7, 0x7d, + 0xd2, 0x27, 0x29, 0xce, 0xbf, 0x24, 0xaa, 0xf5, 0x09, 0xe9, 0x07, 0xc8, 0x14, 0x56, 0x77, 0xd4, + 0x33, 0x19, 0x0e, 0x11, 0x65, 0x6e, 0x18, 0xa7, 0x01, 0xfa, 0xab, 0x22, 0x58, 0x38, 0x24, 0x24, + 0x80, 0x5f, 0x83, 0xa2, 0xeb, 0xfb, 0x09, 0xa2, 0x54, 0x55, 0x1a, 0x4a, 0xb3, 0x64, 0xc1, 0xc9, + 0x58, 0xab, 0x5e, 0xba, 0x61, 0xb0, 0xab, 0x4b, 0x87, 0x6e, 0x67, 0x21, 0xb0, 0x0a, 0xe6, 0xb0, + 0xaf, 0xce, 0x35, 0x94, 0xe6, 0x82, 0x3d, 0x87, 0x7d, 0xf8, 0x3b, 0x28, 0xe5, 0x6a, 0xd5, 0x79, + 0x91, 0x6f, 0xdd, 0x8e, 0xb5, 0xc2, 0xff, 0x63, 0xed, 0x8b, 0x3e, 0x66, 0x67, 0xa3, 0xae, 0xe1, + 0x91, 0x50, 0x2a, 0x96, 0x3f, 0x2d, 0xea, 0x0f, 0x4c, 0x76, 0x19, 0x23, 0x6a, 0xec, 0x23, 0x6f, + 0x32, 0xd6, 0x56, 0xd2, 0x6a, 0x39, 0x91, 0x6e, 0x3f, 0x92, 0xc2, 0x75, 0xb0, 0xc4, 0xc8, 0x00, + 0x45, 0xdf, 0xa8, 0x0b, 0x9c, 0xde, 0x96, 0x56, 0x8e, 0xb7, 0xd5, 0xc5, 0x29, 0xbc, 0x0d, 0x87, + 0x00, 0x7a, 0xa3, 0x24, 0x41, 0x11, 0x73, 0xe8, 0x30, 0x61, 0x4e, 0x9c, 0x60, 0x0f, 0xa9, 0x4b, + 0x42, 0xda, 0x0f, 0x33, 0x4b, 0x5b, 0x4d, 0xa5, 0xd1, 0x98, 0x48, 0x26, 0xdd, 0x5e, 0x91, 0xf4, + 0x47, 0xc3, 0x84, 0x1d, 0x72, 0x08, 0x9e, 0x81, 0x4a, 0x56, 0x92, 0x61, 0x6f, 0xa0, 0x16, 0x45, + 0xb1, 0x1f, 0x67, 0x28, 0xd6, 0x89, 0xd8, 0x64, 0xac, 0xad, 0xa5, 0xc5, 0xa6, 0xb9, 0x74, 0xbb, + 0x2c, 0xcd, 0x63, 0xec, 0x0d, 0xe0, 0x2e, 0xa8, 0x70, 0xd4, 0xa1, 0xb1, 0xeb, 0xe1, 0xa8, 0xaf, + 0x2e, 0xf3, 0x46, 0x58, 0x1b, 0x8f, 0xb9, 0xd3, 0x5e, 0xdd, 0x2e, 0x73, 0xf3, 0x28, 0xb5, 0xe0, + 0xb5, 0x02, 0xb6, 0xe3, 0x04, 0x79, 0x98, 0x62, 0x12, 0x39, 0x3d, 0xd7, 0x63, 0x24, 0x71, 0x5c, + 0x79, 0x2c, 0x87, 0x44, 0x48, 0x2d, 0x09, 0xdd, 0xbf, 0xcc, 0xac, 0xfb, 0xb3, 0xb4, 0xf6, 0xb3, + 0xe4, 0xba, 0xbd, 0x99, 0xfb, 0x0f, 0x84, 0x7b, 0x2f, 0xbd, 0xbd, 0x9f, 0x23, 0x04, 0x4f, 0xc1, + 0x32, 0xfd, 0xc3, 0x8d, 0x9d, 0x1e, 0x42, 0x2a, 0x10, 0x22, 0xf6, 0x66, 0xee, 0x54, 0x4d, 0x76, + 0x4a, 0xf2, 0xe8, 0x76, 0x91, 0x7f, 0x1e, 0x20, 0x04, 0x2f, 0xc0, 0x27, 0x81, 0x4b, 0x99, 0x93, + 0xcf, 0x94, 0x33, 0x8a, 0x7d, 0x97, 0x21, 0xb5, 0xdc, 0x50, 0x9a, 0xe5, 0x9d, 0x2d, 0x23, 0xdd, + 0x15, 0x23, 0xdb, 0x15, 0xe3, 0x38, 0xdb, 0x15, 0xab, 0xc9, 0x65, 0x4c, 0xc6, 0xda, 0xa7, 0x72, + 0x42, 0xdf, 0x46, 0xa3, 0x5f, 0xbd, 0xd0, 0x14, 0x7b, 0x8d, 0xfb, 0x7e, 0xca, 0x5c, 0x27, 0xc2, + 0x03, 0xff, 0x04, 0x35, 0xbe, 0xeb, 0x0e, 0x16, 0xbb, 0x8d, 0xcf, 0x11, 0x55, 0x2b, 0x8d, 0xf9, + 0x66, 0x79, 0xe7, 0x7b, 0xe3, 0xbd, 0xf6, 0xde, 0xe8, 0x64, 0x89, 0x36, 0xf2, 0x48, 0xe2, 0x5b, + 0x75, 0xa9, 0x67, 0x5d, 0xde, 0xf8, 0x9b, 0xe4, 0xba, 0x5d, 0xe5, 0x48, 0x9e, 0x44, 0x77, 0x57, + 0xff, 0xba, 0xd1, 0x0a, 0xd7, 0x37, 0x5a, 0xe1, 0x9f, 0xbf, 0x5b, 0x8b, 0x7c, 0xdd, 0x3b, 0xfa, + 0xbf, 0xf3, 0xa0, 0xf6, 0x84, 0x16, 0x7e, 0x09, 0x6a, 0x39, 0x8b, 0xe3, 0xa3, 0x88, 0x84, 0xe9, + 0x5b, 0x60, 0x57, 0x73, 0x78, 0x9f, 0xa3, 0x90, 0x81, 0x95, 0x04, 0x85, 0x2e, 0x8e, 0x70, 0xd4, + 0x77, 0xdc, 0x90, 0x8c, 0x22, 0x26, 0x1e, 0x83, 0x92, 0xd5, 0x99, 0xb9, 0x61, 0x1b, 0xe9, 0x19, + 0x9e, 0xf2, 0xe9, 0x76, 0x2d, 0x87, 0xf6, 0x04, 0x02, 0x7b, 0xe0, 0x23, 0x14, 0x62, 0x2a, 0x46, + 0x8b, 0x5f, 0x94, 0x7c, 0x68, 0x3e, 0xc0, 0x8c, 0x54, 0x32, 0x5e, 0x9b, 0xb7, 0xeb, 0x57, 0x00, + 0x28, 0x73, 0x13, 0xbe, 0x79, 0x21, 0x12, 0xcf, 0xcd, 0xf3, 0xd3, 0xb1, 0x2d, 0xbb, 0x91, 0x3d, + 0x12, 0x79, 0x6e, 0x3a, 0x12, 0x25, 0x01, 0xf0, 0x70, 0xce, 0x1c, 0xe2, 0xc8, 0x19, 0xc5, 0x82, + 0x79, 0x71, 0x56, 0xe6, 0xc7, 0x5c, 0xc9, 0x1c, 0xe2, 0xe8, 0x44, 0xd8, 0xd6, 0xe9, 0xed, 0x7d, + 0x5d, 0xb9, 0xbb, 0xaf, 0x2b, 0x2f, 0xef, 0xeb, 0xca, 0xd5, 0x43, 0xbd, 0x70, 0xf7, 0x50, 0x2f, + 0xfc, 0xf7, 0x50, 0x2f, 0xfc, 0x66, 0x4d, 0x5d, 0x8b, 0x9c, 0xb6, 0x56, 0xe0, 0x76, 0x69, 0x66, + 0x98, 0xe7, 0xed, 0xef, 0xcc, 0x8b, 0x77, 0xfd, 0x47, 0x85, 0xc4, 0x47, 0x41, 0x77, 0x49, 0x68, + 0xfb, 0xf6, 0x75, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3d, 0x69, 0x2f, 0x6c, 0xd2, 0x06, 0x00, 0x00, } func (m *Pool) Marshal() (dAtA []byte, err error) { @@ -156,6 +240,20 @@ func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.PoolIncentives) > 0 { + for iNdEx := len(m.PoolIncentives) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.PoolIncentives[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPool(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x62 + } + } n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastLiquidityUpdate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastLiquidityUpdate):]) if err1 != nil { return 0, err1 @@ -248,6 +346,72 @@ func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *IncentiveRecord) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IncentiveRecord) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.MinUptime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.MinUptime):]) + if err2 != nil { + return 0, err2 + } + i -= n2 + i = encodeVarintPool(dAtA, i, uint64(n2)) + i-- + dAtA[i] = 0x2a + n3, err3 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + if err3 != nil { + return 0, err3 + } + i -= n3 + i = encodeVarintPool(dAtA, i, uint64(n3)) + i-- + dAtA[i] = 0x22 + { + size := m.EmissionRate.Size() + i -= size + if _, err := m.EmissionRate.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintPool(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size := m.RemainingAmount.Size() + i -= size + if _, err := m.RemainingAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintPool(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.IncentiveDenom) > 0 { + i -= len(m.IncentiveDenom) + copy(dAtA[i:], m.IncentiveDenom) + i = encodeVarintPool(dAtA, i, uint64(len(m.IncentiveDenom))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintPool(dAtA []byte, offset int, v uint64) int { offset -= sovPool(v) base := offset @@ -295,6 +459,33 @@ func (m *Pool) Size() (n int) { n += 1 + l + sovPool(uint64(l)) l = github_com_gogo_protobuf_types.SizeOfStdTime(m.LastLiquidityUpdate) n += 1 + l + sovPool(uint64(l)) + if len(m.PoolIncentives) > 0 { + for _, e := range m.PoolIncentives { + l = e.Size() + n += 1 + l + sovPool(uint64(l)) + } + } + return n +} + +func (m *IncentiveRecord) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.IncentiveDenom) + if l > 0 { + n += 1 + l + sovPool(uint64(l)) + } + l = m.RemainingAmount.Size() + n += 1 + l + sovPool(uint64(l)) + l = m.EmissionRate.Size() + n += 1 + l + sovPool(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) + n += 1 + l + sovPool(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.MinUptime) + n += 1 + l + sovPool(uint64(l)) return n } @@ -670,6 +861,256 @@ func (m *Pool) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolIncentives", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPool + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PoolIncentives = append(m.PoolIncentives, IncentiveRecord{}) + if err := m.PoolIncentives[len(m.PoolIncentives)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPool(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPool + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IncentiveRecord: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IncentiveRecord: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IncentiveDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPool + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IncentiveDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RemainingAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPool + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.RemainingAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EmissionRate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPool + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.EmissionRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPool + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinUptime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPool + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.MinUptime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPool(dAtA[iNdEx:]) From a4b8620ff2fcfc5e55e717d5b8c94fc528816081 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Feb 2023 11:31:16 -0800 Subject: [PATCH 035/136] add comments --- x/concentrated-liquidity/incentives.go | 41 +++++++++++++++++--------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index a1922766e5b..f5494618b99 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -101,23 +101,36 @@ func (k Keeper) getInitialUptimeGrowthOutsidesForTick(ctx sdk.Context, poolId ui return emptyUptimeValues, nil } +// updateUptimeAccumulatorsToNow syncs all uptime accumulators to be up to date. +// Specifically, it gets the time elapsed since the last update and divides it +// by the qualifying liquidity for each uptime. It then adds this value to the +// respective accumulator and updates relevant time trackers accordingly. func (k Keeper) updateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) error { - // pool, err := k.getPoolById(ctx, poolId) - // if err != nil { - // return err - // } - - // lastLiqUpdate := pool.GetLastLiquidityUpdate() - // timeElapsed := sdk.NewDec(int64(time.Since(lastLiqUpdate))) - - // TODO: get liquidity directly from accumulator (total shares) - // Will need to loop through all uptime accums here + /* + pool, err := k.getPoolById(ctx, poolId) + if err != nil { + return err + } - // poolLiquidity := pool.GetLiquidity() - // amountToAdd := timeElapsed.Quo(poolLiquidity) + lastLiqUpdate := pool.GetLastLiquidityUpdate() + timeElapsed := sdk.NewDec(int64(time.Since(lastLiqUpdate))) - // TODO: AddToAccumulator for each uptime accum here using (curTime - lastTime) / frozenLiquidity - // TODO: update LastLiqUpdate time here (using helper w/ new set fn + setPool) + uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) + if err != nil { + return err + } + + for _, uptimeAccum := range uptimeAccums { + qualifyingLiquidity := uptimeAccum.GetTotalShares() + amountToAdd := timeElapsed.Quo(qualifyingLiquidity) + // for each IncentiveRecord where startTime.After(curTime) + // create DecCoins from (denom, emissionRate * amountToAdd) i.e. rewardsPerLiquidity + // TODO: AddToAccumulator for each uptime accum here using (curTime - lastTime) / frozenLiquidity + // Add seconds per liquidity value to accumulator + // TODO: consider passing in incentive distribution rates into position options here + // TODO: update LastLiqUpdate time here (using helper w/ new set fn + setPool) + } + */ return nil } \ No newline at end of file From d79c2265b6f72141f762f9f42c1ef382e98fa519 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Feb 2023 11:32:23 -0800 Subject: [PATCH 036/136] lint --- x/concentrated-liquidity/types/constants.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/types/constants.go b/x/concentrated-liquidity/types/constants.go index baa30347a77..95dc41a2fef 100644 --- a/x/concentrated-liquidity/types/constants.go +++ b/x/concentrated-liquidity/types/constants.go @@ -19,6 +19,6 @@ var ( MaxSpotPrice = sdk.MustNewDecFromStr("100000000000000000000000000000000000000") MinSpotPrice = sdk.MustNewDecFromStr("0.000000000000000001") // Supported uptimes preset to 1 min, 1 hr, 1D, 1W - SupportedUptimes = []time.Duration{time.Minute, time.Hour, time.Hour * 24, time.Hour * 24 * 7} + SupportedUptimes = []time.Duration{time.Minute, time.Hour, time.Hour * 24, time.Hour * 24 * 7} AuthorizedTickSpacing = []uint64{1, 10, 60, 200} ) From e0ae23eeba7fad7a22beba4a42ea439028529703 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Feb 2023 12:56:02 -0800 Subject: [PATCH 037/136] set up wiring for proto --- .../incentive_record.proto | 49 ++ .../osmosis/concentrated-liquidity/pool.proto | 38 +- x/concentrated-liquidity/model/pool.go | 8 + x/concentrated-liquidity/model/pool.pb.go | 475 ++------------- .../types/incentive_record.pb.go | 550 ++++++++++++++++++ x/concentrated-liquidity/types/pool.go | 2 + 6 files changed, 657 insertions(+), 465 deletions(-) create mode 100644 proto/osmosis/concentrated-liquidity/incentive_record.proto create mode 100644 x/concentrated-liquidity/types/incentive_record.pb.go diff --git a/proto/osmosis/concentrated-liquidity/incentive_record.proto b/proto/osmosis/concentrated-liquidity/incentive_record.proto new file mode 100644 index 00000000000..495d8c7e47d --- /dev/null +++ b/proto/osmosis/concentrated-liquidity/incentive_record.proto @@ -0,0 +1,49 @@ +syntax = "proto3"; +// This is a legacy package that requires additional migration logic +// in order to use the correct package. Decision made to use legacy package path +// until clear steps for migration logic and the unknowns for state breaking are +// investigated for changing proto package. +package osmosis.concentratedliquidity.v1beta1; + +import "cosmos_proto/cosmos.proto"; +import "gogoproto/gogo.proto"; +import "google/protobuf/timestamp.proto"; + +option go_package = "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types"; + +// IncentiveRecord represents an active perpetual incentive gauge for a pool +message IncentiveRecord { + // min uptime for incentive record, will loop through and compare against + // supported uptimes + string incentive_denom = 1; + + // remaining_amount is the total amount of incentives to be distributed + string remaining_amount = 2 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.moretags) = "yaml:\"remaining_amount\"", + (gogoproto.nullable) = false + ]; + + // emission_rate is the incentive emission rate per second + string emission_rate = 3 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.moretags) = "yaml:\"swap_fee\"", + (gogoproto.nullable) = false + ]; + + // start_time is the time when the incentive starts distributing + google.protobuf.Timestamp start_time = 4 [ + (gogoproto.nullable) = false, + (gogoproto.stdtime) = true, + (gogoproto.moretags) = "yaml:\"start_time\"" + ]; + + // min_uptime is the minimum uptime required for liquidity to qualify for this + // incentive. It should be always be one of the supported uptimes in + // types.SupportedUptimes + google.protobuf.Timestamp min_uptime = 5 [ + (gogoproto.nullable) = false, + (gogoproto.stdtime) = true, + (gogoproto.moretags) = "yaml:\"min_uptime\"" + ]; +} \ No newline at end of file diff --git a/proto/osmosis/concentrated-liquidity/pool.proto b/proto/osmosis/concentrated-liquidity/pool.proto index e8830404448..009c35cce7f 100644 --- a/proto/osmosis/concentrated-liquidity/pool.proto +++ b/proto/osmosis/concentrated-liquidity/pool.proto @@ -8,6 +8,7 @@ package osmosis.concentratedliquidity.v1beta1; import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; +import "osmosis/concentrated-liquidity/incentive_record.proto"; option go_package = "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model"; @@ -67,41 +68,4 @@ message Pool { (gogoproto.moretags) = "yaml:\"pool_incentives\"", (gogoproto.nullable) = false ]; -} - -// IncentiveRecord represents an active perpetual incentive gauge for a pool -message IncentiveRecord { - // min uptime for incentive record, will loop through and compare against - // supported uptimes - string incentive_denom = 1; - - // remaining_amount is the total amount of incentives to be distributed - string remaining_amount = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.moretags) = "yaml:\"remaining_amount\"", - (gogoproto.nullable) = false - ]; - - // emission_rate is the incentive emission rate per second - string emission_rate = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.moretags) = "yaml:\"swap_fee\"", - (gogoproto.nullable) = false - ]; - - // start_time is the time when the incentive starts distributing - google.protobuf.Timestamp start_time = 4 [ - (gogoproto.nullable) = false, - (gogoproto.stdtime) = true, - (gogoproto.moretags) = "yaml:\"start_time\"" - ]; - - // min_uptime is the minimum uptime required for liquidity to qualify for this - // incentive. It should be always be one of the supported uptimes in - // types.SupportedUptimes - google.protobuf.Timestamp min_uptime = 5 [ - (gogoproto.nullable) = false, - (gogoproto.stdtime) = true, - (gogoproto.moretags) = "yaml:\"min_uptime\"" - ]; } \ No newline at end of file diff --git a/x/concentrated-liquidity/model/pool.go b/x/concentrated-liquidity/model/pool.go index dfeaac47af0..a757f5636ce 100644 --- a/x/concentrated-liquidity/model/pool.go +++ b/x/concentrated-liquidity/model/pool.go @@ -156,6 +156,10 @@ func (p Pool) GetLastLiquidityUpdate() time.Time { return p.LastLiquidityUpdate } +func (p Pool) GetPoolIncentives() []types.IncentiveRecord { +return p.PoolIncentives +} + func (p Pool) GetType() poolmanagertypes.PoolType { return poolmanagertypes.Concentrated } @@ -180,6 +184,10 @@ func (p *Pool) SetLastLiquidityUpdate(newTime time.Time) { p.LastLiquidityUpdate = newTime } +func (p *Pool) SetPoolIncentives(updatedRecords []types.IncentiveRecord) { + p.PoolIncentives = updatedRecords +} + // updateLiquidityIfActivePosition updates the pool's liquidity if the position is active. // Returns true if updated, false otherwise. // TODO: add tests. diff --git a/x/concentrated-liquidity/model/pool.pb.go b/x/concentrated-liquidity/model/pool.pb.go index c2cd20b91d0..ad0d3d48cbc 100644 --- a/x/concentrated-liquidity/model/pool.pb.go +++ b/x/concentrated-liquidity/model/pool.pb.go @@ -16,6 +16,7 @@ import ( proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" + types1 "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" io "io" math "math" math_bits "math/bits" @@ -51,8 +52,8 @@ type Pool struct { SwapFee github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,10,opt,name=swap_fee,json=swapFee,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"swap_fee" yaml:"swap_fee"` // last_liquidity_update is the last time either the pool liquidity or the // active tick changed - LastLiquidityUpdate time.Time `protobuf:"bytes,11,opt,name=last_liquidity_update,json=lastLiquidityUpdate,proto3,stdtime" json:"last_liquidity_update" yaml:"last_liquidity_update"` - PoolIncentives []IncentiveRecord `protobuf:"bytes,12,rep,name=pool_incentives,json=poolIncentives,proto3" json:"pool_incentives" yaml:"pool_incentives"` + LastLiquidityUpdate time.Time `protobuf:"bytes,11,opt,name=last_liquidity_update,json=lastLiquidityUpdate,proto3,stdtime" json:"last_liquidity_update" yaml:"last_liquidity_update"` + PoolIncentives []types1.IncentiveRecord `protobuf:"bytes,12,rep,name=pool_incentives,json=poolIncentives,proto3" json:"pool_incentives" yaml:"pool_incentives"` } func (m *Pool) Reset() { *m = Pool{} } @@ -87,80 +88,8 @@ func (m *Pool) XXX_DiscardUnknown() { var xxx_messageInfo_Pool proto.InternalMessageInfo -// IncentiveRecord represents an active perpetual incentive gauge for a pool -type IncentiveRecord struct { - // min uptime for incentive record, will loop through and compare against - // supported uptimes - IncentiveDenom string `protobuf:"bytes,1,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` - // remaining_amount is the total amount of incentives to be distributed - RemainingAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=remaining_amount,json=remainingAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"remaining_amount" yaml:"remaining_amount"` - // emission_rate is the incentive emission rate per second - EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"swap_fee"` - // start_time is the time when the incentive starts distributing - StartTime time.Time `protobuf:"bytes,4,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` - // min_uptime is the minimum uptime required for liquidity to qualify for this - // incentive. It should be always be one of the supported uptimes in - // types.SupportedUptimes - MinUptime time.Time `protobuf:"bytes,5,opt,name=min_uptime,json=minUptime,proto3,stdtime" json:"min_uptime" yaml:"min_uptime"` -} - -func (m *IncentiveRecord) Reset() { *m = IncentiveRecord{} } -func (m *IncentiveRecord) String() string { return proto.CompactTextString(m) } -func (*IncentiveRecord) ProtoMessage() {} -func (*IncentiveRecord) Descriptor() ([]byte, []int) { - return fileDescriptor_3526ea5373d96c9a, []int{1} -} -func (m *IncentiveRecord) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *IncentiveRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_IncentiveRecord.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *IncentiveRecord) XXX_Merge(src proto.Message) { - xxx_messageInfo_IncentiveRecord.Merge(m, src) -} -func (m *IncentiveRecord) XXX_Size() int { - return m.Size() -} -func (m *IncentiveRecord) XXX_DiscardUnknown() { - xxx_messageInfo_IncentiveRecord.DiscardUnknown(m) -} - -var xxx_messageInfo_IncentiveRecord proto.InternalMessageInfo - -func (m *IncentiveRecord) GetIncentiveDenom() string { - if m != nil { - return m.IncentiveDenom - } - return "" -} - -func (m *IncentiveRecord) GetStartTime() time.Time { - if m != nil { - return m.StartTime - } - return time.Time{} -} - -func (m *IncentiveRecord) GetMinUptime() time.Time { - if m != nil { - return m.MinUptime - } - return time.Time{} -} - func init() { proto.RegisterType((*Pool)(nil), "osmosis.concentratedliquidity.v1beta1.Pool") - proto.RegisterType((*IncentiveRecord)(nil), "osmosis.concentratedliquidity.v1beta1.IncentiveRecord") } func init() { @@ -168,56 +97,49 @@ func init() { } var fileDescriptor_3526ea5373d96c9a = []byte{ - // 784 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0x4f, 0x4f, 0xe3, 0x46, - 0x14, 0x8f, 0xf9, 0x17, 0x32, 0x49, 0x13, 0x18, 0x5a, 0x30, 0xa8, 0xc4, 0x91, 0xd5, 0x3f, 0xa9, - 0xd4, 0xd8, 0x0d, 0xad, 0x7a, 0xe0, 0x86, 0x4b, 0x91, 0x22, 0x55, 0x2a, 0x32, 0x50, 0x55, 0x15, - 0x92, 0xeb, 0xd8, 0x93, 0x30, 0x8a, 0xed, 0x71, 0x3c, 0x13, 0x0a, 0xa7, 0x5e, 0x7b, 0xe4, 0xc8, - 0x91, 0x0f, 0xd1, 0x0f, 0x81, 0xaa, 0x1e, 0x38, 0x56, 0x3d, 0x64, 0x57, 0xf0, 0x0d, 0x72, 0xd8, - 0xf3, 0x6a, 0xc6, 0x63, 0x93, 0x45, 0xbb, 0x68, 0x23, 0xed, 0x29, 0x7e, 0xbf, 0xf7, 0xde, 0xef, - 0xfd, 0x66, 0xde, 0x7b, 0x13, 0xf0, 0x15, 0xa1, 0x21, 0xa1, 0x98, 0x9a, 0x1e, 0x89, 0x3c, 0x14, - 0xb1, 0xc4, 0x65, 0xc8, 0x6f, 0x05, 0x78, 0x38, 0xc2, 0x3e, 0x66, 0x97, 0x66, 0x4c, 0x48, 0x60, - 0xc4, 0x09, 0x61, 0x04, 0x7e, 0x2e, 0x43, 0x8d, 0xe9, 0xd0, 0x3c, 0xd2, 0x38, 0x6f, 0x77, 0x11, - 0x73, 0xdb, 0x5b, 0x9b, 0x9e, 0x88, 0x73, 0x44, 0x92, 0x99, 0x1a, 0x29, 0xc3, 0xd6, 0xc7, 0x7d, - 0xd2, 0x27, 0x29, 0xce, 0xbf, 0x24, 0xaa, 0xf5, 0x09, 0xe9, 0x07, 0xc8, 0x14, 0x56, 0x77, 0xd4, - 0x33, 0x19, 0x0e, 0x11, 0x65, 0x6e, 0x18, 0xa7, 0x01, 0xfa, 0xab, 0x22, 0x58, 0x38, 0x24, 0x24, - 0x80, 0x5f, 0x83, 0xa2, 0xeb, 0xfb, 0x09, 0xa2, 0x54, 0x55, 0x1a, 0x4a, 0xb3, 0x64, 0xc1, 0xc9, - 0x58, 0xab, 0x5e, 0xba, 0x61, 0xb0, 0xab, 0x4b, 0x87, 0x6e, 0x67, 0x21, 0xb0, 0x0a, 0xe6, 0xb0, - 0xaf, 0xce, 0x35, 0x94, 0xe6, 0x82, 0x3d, 0x87, 0x7d, 0xf8, 0x3b, 0x28, 0xe5, 0x6a, 0xd5, 0x79, - 0x91, 0x6f, 0xdd, 0x8e, 0xb5, 0xc2, 0xff, 0x63, 0xed, 0x8b, 0x3e, 0x66, 0x67, 0xa3, 0xae, 0xe1, - 0x91, 0x50, 0x2a, 0x96, 0x3f, 0x2d, 0xea, 0x0f, 0x4c, 0x76, 0x19, 0x23, 0x6a, 0xec, 0x23, 0x6f, - 0x32, 0xd6, 0x56, 0xd2, 0x6a, 0x39, 0x91, 0x6e, 0x3f, 0x92, 0xc2, 0x75, 0xb0, 0xc4, 0xc8, 0x00, - 0x45, 0xdf, 0xa8, 0x0b, 0x9c, 0xde, 0x96, 0x56, 0x8e, 0xb7, 0xd5, 0xc5, 0x29, 0xbc, 0x0d, 0x87, - 0x00, 0x7a, 0xa3, 0x24, 0x41, 0x11, 0x73, 0xe8, 0x30, 0x61, 0x4e, 0x9c, 0x60, 0x0f, 0xa9, 0x4b, - 0x42, 0xda, 0x0f, 0x33, 0x4b, 0x5b, 0x4d, 0xa5, 0xd1, 0x98, 0x48, 0x26, 0xdd, 0x5e, 0x91, 0xf4, - 0x47, 0xc3, 0x84, 0x1d, 0x72, 0x08, 0x9e, 0x81, 0x4a, 0x56, 0x92, 0x61, 0x6f, 0xa0, 0x16, 0x45, - 0xb1, 0x1f, 0x67, 0x28, 0xd6, 0x89, 0xd8, 0x64, 0xac, 0xad, 0xa5, 0xc5, 0xa6, 0xb9, 0x74, 0xbb, - 0x2c, 0xcd, 0x63, 0xec, 0x0d, 0xe0, 0x2e, 0xa8, 0x70, 0xd4, 0xa1, 0xb1, 0xeb, 0xe1, 0xa8, 0xaf, - 0x2e, 0xf3, 0x46, 0x58, 0x1b, 0x8f, 0xb9, 0xd3, 0x5e, 0xdd, 0x2e, 0x73, 0xf3, 0x28, 0xb5, 0xe0, - 0xb5, 0x02, 0xb6, 0xe3, 0x04, 0x79, 0x98, 0x62, 0x12, 0x39, 0x3d, 0xd7, 0x63, 0x24, 0x71, 0x5c, - 0x79, 0x2c, 0x87, 0x44, 0x48, 0x2d, 0x09, 0xdd, 0xbf, 0xcc, 0xac, 0xfb, 0xb3, 0xb4, 0xf6, 0xb3, - 0xe4, 0xba, 0xbd, 0x99, 0xfb, 0x0f, 0x84, 0x7b, 0x2f, 0xbd, 0xbd, 0x9f, 0x23, 0x04, 0x4f, 0xc1, - 0x32, 0xfd, 0xc3, 0x8d, 0x9d, 0x1e, 0x42, 0x2a, 0x10, 0x22, 0xf6, 0x66, 0xee, 0x54, 0x4d, 0x76, - 0x4a, 0xf2, 0xe8, 0x76, 0x91, 0x7f, 0x1e, 0x20, 0x04, 0x2f, 0xc0, 0x27, 0x81, 0x4b, 0x99, 0x93, - 0xcf, 0x94, 0x33, 0x8a, 0x7d, 0x97, 0x21, 0xb5, 0xdc, 0x50, 0x9a, 0xe5, 0x9d, 0x2d, 0x23, 0xdd, - 0x15, 0x23, 0xdb, 0x15, 0xe3, 0x38, 0xdb, 0x15, 0xab, 0xc9, 0x65, 0x4c, 0xc6, 0xda, 0xa7, 0x72, - 0x42, 0xdf, 0x46, 0xa3, 0x5f, 0xbd, 0xd0, 0x14, 0x7b, 0x8d, 0xfb, 0x7e, 0xca, 0x5c, 0x27, 0xc2, - 0x03, 0xff, 0x04, 0x35, 0xbe, 0xeb, 0x0e, 0x16, 0xbb, 0x8d, 0xcf, 0x11, 0x55, 0x2b, 0x8d, 0xf9, - 0x66, 0x79, 0xe7, 0x7b, 0xe3, 0xbd, 0xf6, 0xde, 0xe8, 0x64, 0x89, 0x36, 0xf2, 0x48, 0xe2, 0x5b, - 0x75, 0xa9, 0x67, 0x5d, 0xde, 0xf8, 0x9b, 0xe4, 0xba, 0x5d, 0xe5, 0x48, 0x9e, 0x44, 0x77, 0x57, - 0xff, 0xba, 0xd1, 0x0a, 0xd7, 0x37, 0x5a, 0xe1, 0x9f, 0xbf, 0x5b, 0x8b, 0x7c, 0xdd, 0x3b, 0xfa, - 0xbf, 0xf3, 0xa0, 0xf6, 0x84, 0x16, 0x7e, 0x09, 0x6a, 0x39, 0x8b, 0xe3, 0xa3, 0x88, 0x84, 0xe9, - 0x5b, 0x60, 0x57, 0x73, 0x78, 0x9f, 0xa3, 0x90, 0x81, 0x95, 0x04, 0x85, 0x2e, 0x8e, 0x70, 0xd4, - 0x77, 0xdc, 0x90, 0x8c, 0x22, 0x26, 0x1e, 0x83, 0x92, 0xd5, 0x99, 0xb9, 0x61, 0x1b, 0xe9, 0x19, - 0x9e, 0xf2, 0xe9, 0x76, 0x2d, 0x87, 0xf6, 0x04, 0x02, 0x7b, 0xe0, 0x23, 0x14, 0x62, 0x2a, 0x46, - 0x8b, 0x5f, 0x94, 0x7c, 0x68, 0x3e, 0xc0, 0x8c, 0x54, 0x32, 0x5e, 0x9b, 0xb7, 0xeb, 0x57, 0x00, - 0x28, 0x73, 0x13, 0xbe, 0x79, 0x21, 0x12, 0xcf, 0xcd, 0xf3, 0xd3, 0xb1, 0x2d, 0xbb, 0x91, 0x3d, - 0x12, 0x79, 0x6e, 0x3a, 0x12, 0x25, 0x01, 0xf0, 0x70, 0xce, 0x1c, 0xe2, 0xc8, 0x19, 0xc5, 0x82, - 0x79, 0x71, 0x56, 0xe6, 0xc7, 0x5c, 0xc9, 0x1c, 0xe2, 0xe8, 0x44, 0xd8, 0xd6, 0xe9, 0xed, 0x7d, - 0x5d, 0xb9, 0xbb, 0xaf, 0x2b, 0x2f, 0xef, 0xeb, 0xca, 0xd5, 0x43, 0xbd, 0x70, 0xf7, 0x50, 0x2f, - 0xfc, 0xf7, 0x50, 0x2f, 0xfc, 0x66, 0x4d, 0x5d, 0x8b, 0x9c, 0xb6, 0x56, 0xe0, 0x76, 0x69, 0x66, - 0x98, 0xe7, 0xed, 0xef, 0xcc, 0x8b, 0x77, 0xfd, 0x47, 0x85, 0xc4, 0x47, 0x41, 0x77, 0x49, 0x68, - 0xfb, 0xf6, 0x75, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3d, 0x69, 0x2f, 0x6c, 0xd2, 0x06, 0x00, 0x00, + // 662 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x4b, 0x6f, 0xd3, 0x4c, + 0x14, 0x8d, 0xfb, 0x4a, 0x3b, 0xa9, 0xfa, 0x98, 0x7e, 0x5f, 0x71, 0x2b, 0xb0, 0x23, 0x0b, 0x50, + 0x90, 0x88, 0x4d, 0xca, 0x63, 0xd1, 0x5d, 0x0d, 0x54, 0xaa, 0x84, 0x44, 0xe5, 0x16, 0x16, 0xa8, + 0x92, 0x71, 0xc6, 0xd3, 0x74, 0x14, 0xc7, 0xe3, 0x78, 0x26, 0xa5, 0x5d, 0xb1, 0x65, 0xd9, 0x65, + 0x97, 0xfd, 0x11, 0xfc, 0x88, 0x8a, 0x55, 0x97, 0x88, 0x45, 0x40, 0xed, 0x3f, 0xc8, 0x82, 0x35, + 0x9a, 0xf1, 0xd8, 0x0d, 0x12, 0xaf, 0xac, 0xec, 0x7b, 0xee, 0xbd, 0xe7, 0x1c, 0xdf, 0xf1, 0x1d, + 0x70, 0x8f, 0xb2, 0x0e, 0x65, 0x84, 0x39, 0x88, 0xc6, 0x08, 0xc7, 0x3c, 0x0d, 0x38, 0x0e, 0xeb, + 0x11, 0xe9, 0xf6, 0x48, 0x48, 0xf8, 0xb1, 0x93, 0x50, 0x1a, 0xd9, 0x49, 0x4a, 0x39, 0x85, 0x77, + 0x54, 0xa9, 0x3d, 0x5c, 0x5a, 0x54, 0xda, 0x87, 0x8d, 0x26, 0xe6, 0x41, 0x63, 0x75, 0x05, 0xc9, + 0x3a, 0x5f, 0x36, 0x39, 0x59, 0x90, 0x31, 0xac, 0xfe, 0xd7, 0xa2, 0x2d, 0x9a, 0xe1, 0xe2, 0x4d, + 0xa1, 0x66, 0x8b, 0xd2, 0x56, 0x84, 0x1d, 0x19, 0x35, 0x7b, 0xfb, 0x0e, 0x27, 0x1d, 0xcc, 0x78, + 0xd0, 0x49, 0x54, 0xc1, 0xe3, 0xbf, 0x78, 0x24, 0x12, 0x25, 0x87, 0xd8, 0x4f, 0x31, 0xa2, 0x69, + 0x98, 0xb5, 0x59, 0xdf, 0xcb, 0x60, 0x62, 0x9b, 0xd2, 0x08, 0xde, 0x07, 0xe5, 0x20, 0x0c, 0x53, + 0xcc, 0x98, 0xae, 0x55, 0xb5, 0xda, 0x8c, 0x0b, 0x07, 0x7d, 0x73, 0xee, 0x38, 0xe8, 0x44, 0xeb, + 0x96, 0x4a, 0x58, 0x5e, 0x5e, 0x02, 0xe7, 0xc0, 0x18, 0x09, 0xf5, 0xb1, 0xaa, 0x56, 0x9b, 0xf0, + 0xc6, 0x48, 0x08, 0xdf, 0x82, 0x99, 0x42, 0x4a, 0x1f, 0x97, 0xfd, 0xee, 0x79, 0xdf, 0x2c, 0x7d, + 0xe9, 0x9b, 0x77, 0x5b, 0x84, 0x1f, 0xf4, 0x9a, 0x36, 0xa2, 0x1d, 0xf5, 0xa1, 0xea, 0x51, 0x67, + 0x61, 0xdb, 0xe1, 0xc7, 0x09, 0x66, 0xf6, 0x33, 0x8c, 0x06, 0x7d, 0x73, 0x21, 0x53, 0x2b, 0x88, + 0x2c, 0xef, 0x9a, 0x14, 0x2e, 0x83, 0x29, 0x4e, 0xdb, 0x38, 0x7e, 0xa0, 0x4f, 0x08, 0x7a, 0x4f, + 0x45, 0x05, 0xde, 0xd0, 0x27, 0x87, 0xf0, 0x06, 0xec, 0x02, 0x88, 0x7a, 0x69, 0x8a, 0x63, 0xee, + 0xb3, 0x6e, 0xca, 0xfd, 0x24, 0x25, 0x08, 0xeb, 0x53, 0xd2, 0xda, 0xd3, 0x91, 0xad, 0x2d, 0x66, + 0xd6, 0x58, 0x42, 0x15, 0x93, 0xe5, 0x2d, 0x28, 0xfa, 0x9d, 0x6e, 0xca, 0xb7, 0x05, 0x04, 0x0f, + 0xc0, 0x6c, 0x2e, 0xc9, 0x09, 0x6a, 0xeb, 0x65, 0x29, 0xf6, 0x7c, 0x04, 0xb1, 0xad, 0x98, 0x0f, + 0xfa, 0xe6, 0x52, 0x26, 0x36, 0xcc, 0x65, 0x79, 0x15, 0x15, 0xee, 0x12, 0xd4, 0x86, 0xeb, 0x60, + 0x56, 0xa0, 0x3e, 0x4b, 0x02, 0x44, 0xe2, 0x96, 0x3e, 0x2d, 0x0e, 0xc2, 0xbd, 0x71, 0xdd, 0x3b, + 0x9c, 0xb5, 0xbc, 0x8a, 0x08, 0x77, 0xb2, 0x08, 0x9e, 0x6a, 0xe0, 0x56, 0x92, 0x62, 0x44, 0x18, + 0xa1, 0xb1, 0xbf, 0x1f, 0x20, 0x4e, 0x53, 0x3f, 0x50, 0x9f, 0xe5, 0xd3, 0x18, 0xeb, 0x33, 0xd2, + 0xf7, 0xeb, 0x91, 0x7d, 0xdf, 0xce, 0xb4, 0xff, 0x48, 0x6e, 0x79, 0x2b, 0x45, 0x7e, 0x53, 0xa6, + 0x37, 0xb2, 0xe9, 0xbd, 0x8c, 0x31, 0xdc, 0x03, 0xd3, 0xec, 0x5d, 0x90, 0xf8, 0xfb, 0x18, 0xeb, + 0x40, 0x9a, 0xd8, 0x18, 0xf9, 0xa4, 0xe6, 0xd5, 0x49, 0x29, 0x1e, 0xcb, 0x2b, 0x8b, 0xd7, 0x4d, + 0x8c, 0xe1, 0x11, 0xf8, 0x3f, 0x0a, 0x18, 0xf7, 0x8b, 0x7f, 0xca, 0xef, 0x25, 0x61, 0xc0, 0xb1, + 0x5e, 0xa9, 0x6a, 0xb5, 0xca, 0xda, 0xaa, 0x9d, 0xad, 0x98, 0x9d, 0xaf, 0x98, 0xbd, 0x9b, 0xaf, + 0x98, 0x5b, 0x13, 0x36, 0x06, 0x7d, 0xf3, 0xa6, 0xfa, 0x43, 0x7f, 0x45, 0x63, 0x9d, 0x7c, 0x35, + 0x35, 0x6f, 0x49, 0xe4, 0x5e, 0xe4, 0xa9, 0x57, 0x32, 0x03, 0xdf, 0x83, 0x79, 0x71, 0x45, 0xf8, + 0xc5, 0x0e, 0x32, 0x7d, 0xb6, 0x3a, 0x5e, 0xab, 0xac, 0x3d, 0xb1, 0xff, 0xe9, 0xba, 0xb0, 0xb7, + 0xf2, 0x46, 0x4f, 0xee, 0xae, 0x6b, 0x28, 0x3f, 0xcb, 0x6a, 0xe2, 0x3f, 0x93, 0x5b, 0xde, 0x9c, + 0x40, 0x8a, 0x26, 0xb6, 0xbe, 0xf8, 0xe1, 0xcc, 0x2c, 0x9d, 0x9e, 0x99, 0xa5, 0x4f, 0x1f, 0xeb, + 0x93, 0x62, 0xdd, 0xb7, 0xdc, 0xbd, 0xf3, 0x4b, 0x43, 0xbb, 0xb8, 0x34, 0xb4, 0x6f, 0x97, 0x86, + 0x76, 0x72, 0x65, 0x94, 0x2e, 0xae, 0x8c, 0xd2, 0xe7, 0x2b, 0xa3, 0xf4, 0xc6, 0x1d, 0x9a, 0xb5, + 0xb2, 0x57, 0x8f, 0x82, 0x26, 0xcb, 0x03, 0xe7, 0xb0, 0xf1, 0xc8, 0x39, 0xfa, 0xdd, 0x3d, 0xd3, + 0xa1, 0x21, 0x8e, 0x9a, 0x53, 0x72, 0x88, 0x0f, 0x7f, 0x04, 0x00, 0x00, 0xff, 0xff, 0x5f, 0xdd, + 0x26, 0x5b, 0x3a, 0x05, 0x00, 0x00, } func (m *Pool) Marshal() (dAtA []byte, err error) { @@ -346,72 +268,6 @@ func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *IncentiveRecord) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *IncentiveRecord) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.MinUptime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.MinUptime):]) - if err2 != nil { - return 0, err2 - } - i -= n2 - i = encodeVarintPool(dAtA, i, uint64(n2)) - i-- - dAtA[i] = 0x2a - n3, err3 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) - if err3 != nil { - return 0, err3 - } - i -= n3 - i = encodeVarintPool(dAtA, i, uint64(n3)) - i-- - dAtA[i] = 0x22 - { - size := m.EmissionRate.Size() - i -= size - if _, err := m.EmissionRate.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintPool(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.RemainingAmount.Size() - i -= size - if _, err := m.RemainingAmount.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintPool(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.IncentiveDenom) > 0 { - i -= len(m.IncentiveDenom) - copy(dAtA[i:], m.IncentiveDenom) - i = encodeVarintPool(dAtA, i, uint64(len(m.IncentiveDenom))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func encodeVarintPool(dAtA []byte, offset int, v uint64) int { offset -= sovPool(v) base := offset @@ -468,27 +324,6 @@ func (m *Pool) Size() (n int) { return n } -func (m *IncentiveRecord) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.IncentiveDenom) - if l > 0 { - n += 1 + l + sovPool(uint64(l)) - } - l = m.RemainingAmount.Size() - n += 1 + l + sovPool(uint64(l)) - l = m.EmissionRate.Size() - n += 1 + l + sovPool(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) - n += 1 + l + sovPool(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.MinUptime) - n += 1 + l + sovPool(uint64(l)) - return n -} - func sovPool(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -890,7 +725,7 @@ func (m *Pool) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.PoolIncentives = append(m.PoolIncentives, IncentiveRecord{}) + m.PoolIncentives = append(m.PoolIncentives, types1.IncentiveRecord{}) if err := m.PoolIncentives[len(m.PoolIncentives)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -916,222 +751,6 @@ func (m *Pool) Unmarshal(dAtA []byte) error { } return nil } -func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: IncentiveRecord: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: IncentiveRecord: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IncentiveDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.IncentiveDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RemainingAmount", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.RemainingAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EmissionRate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.EmissionRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinUptime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.MinUptime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipPool(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthPool - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func skipPool(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/concentrated-liquidity/types/incentive_record.pb.go b/x/concentrated-liquidity/types/incentive_record.pb.go new file mode 100644 index 00000000000..d5f33ddc498 --- /dev/null +++ b/x/concentrated-liquidity/types/incentive_record.pb.go @@ -0,0 +1,550 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: osmosis/concentrated-liquidity/incentive_record.proto + +// This is a legacy package that requires additional migration logic +// in order to use the correct package. Decision made to use legacy package path +// until clear steps for migration logic and the unknowns for state breaking are +// investigated for changing proto package. + +package types + +import ( + fmt "fmt" + _ "github.com/cosmos/cosmos-proto" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + _ "github.com/gogo/protobuf/types" + github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" + io "io" + math "math" + math_bits "math/bits" + time "time" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf +var _ = time.Kitchen + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// IncentiveRecord represents an active perpetual incentive gauge for a pool +type IncentiveRecord struct { + // min uptime for incentive record, will loop through and compare against + // supported uptimes + IncentiveDenom string `protobuf:"bytes,1,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` + // remaining_amount is the total amount of incentives to be distributed + RemainingAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=remaining_amount,json=remainingAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"remaining_amount" yaml:"remaining_amount"` + // emission_rate is the incentive emission rate per second + EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"swap_fee"` + // start_time is the time when the incentive starts distributing + StartTime time.Time `protobuf:"bytes,4,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` + // min_uptime is the minimum uptime required for liquidity to qualify for this + // incentive. It should be always be one of the supported uptimes in + // types.SupportedUptimes + MinUptime time.Time `protobuf:"bytes,5,opt,name=min_uptime,json=minUptime,proto3,stdtime" json:"min_uptime" yaml:"min_uptime"` +} + +func (m *IncentiveRecord) Reset() { *m = IncentiveRecord{} } +func (m *IncentiveRecord) String() string { return proto.CompactTextString(m) } +func (*IncentiveRecord) ProtoMessage() {} +func (*IncentiveRecord) Descriptor() ([]byte, []int) { + return fileDescriptor_9d38bf94e42ee434, []int{0} +} +func (m *IncentiveRecord) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IncentiveRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_IncentiveRecord.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *IncentiveRecord) XXX_Merge(src proto.Message) { + xxx_messageInfo_IncentiveRecord.Merge(m, src) +} +func (m *IncentiveRecord) XXX_Size() int { + return m.Size() +} +func (m *IncentiveRecord) XXX_DiscardUnknown() { + xxx_messageInfo_IncentiveRecord.DiscardUnknown(m) +} + +var xxx_messageInfo_IncentiveRecord proto.InternalMessageInfo + +func (m *IncentiveRecord) GetIncentiveDenom() string { + if m != nil { + return m.IncentiveDenom + } + return "" +} + +func (m *IncentiveRecord) GetStartTime() time.Time { + if m != nil { + return m.StartTime + } + return time.Time{} +} + +func (m *IncentiveRecord) GetMinUptime() time.Time { + if m != nil { + return m.MinUptime + } + return time.Time{} +} + +func init() { + proto.RegisterType((*IncentiveRecord)(nil), "osmosis.concentratedliquidity.v1beta1.IncentiveRecord") +} + +func init() { + proto.RegisterFile("osmosis/concentrated-liquidity/incentive_record.proto", fileDescriptor_9d38bf94e42ee434) +} + +var fileDescriptor_9d38bf94e42ee434 = []byte{ + // 422 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0xcd, 0xaa, 0xd3, 0x40, + 0x1c, 0xc5, 0x13, 0xaf, 0x0a, 0x37, 0x7e, 0x44, 0x83, 0x60, 0x2c, 0x98, 0x5c, 0x02, 0xea, 0xdd, + 0x74, 0x86, 0xfa, 0xb1, 0x71, 0xd7, 0xd0, 0x4d, 0xb7, 0x41, 0x41, 0x44, 0x08, 0x93, 0x64, 0x1a, + 0x07, 0x33, 0x33, 0x31, 0x33, 0xa9, 0xf6, 0x2d, 0xfa, 0x58, 0x5d, 0xb8, 0xe8, 0x52, 0x5c, 0x44, + 0x69, 0xdf, 0xa0, 0x4f, 0x20, 0x33, 0xf9, 0x68, 0x11, 0x5c, 0x74, 0x95, 0xfc, 0x0f, 0xff, 0xf3, + 0xfb, 0x1f, 0x0e, 0x63, 0xbd, 0xe1, 0x82, 0x72, 0x41, 0x04, 0x4c, 0x39, 0x4b, 0x31, 0x93, 0x15, + 0x92, 0x38, 0x1b, 0x17, 0xe4, 0x6b, 0x4d, 0x32, 0x22, 0x57, 0x90, 0x68, 0x95, 0x2c, 0x71, 0x5c, + 0xe1, 0x94, 0x57, 0x19, 0x28, 0x2b, 0x2e, 0xb9, 0xf3, 0xac, 0xb3, 0x81, 0x53, 0xdb, 0xe0, 0x02, + 0xcb, 0x49, 0x82, 0x25, 0x9a, 0x8c, 0x9e, 0xa4, 0x7a, 0x2f, 0xd6, 0x26, 0xd8, 0x0e, 0x2d, 0x61, + 0xf4, 0x28, 0xe7, 0x39, 0x6f, 0x75, 0xf5, 0xd7, 0xa9, 0x7e, 0xce, 0x79, 0x5e, 0x60, 0xa8, 0xa7, + 0xa4, 0x5e, 0x40, 0x49, 0x28, 0x16, 0x12, 0xd1, 0xb2, 0x5d, 0x08, 0x7e, 0x5c, 0x58, 0xf6, 0xbc, + 0xcf, 0x14, 0xe9, 0x48, 0xce, 0x0b, 0xcb, 0x3e, 0xc6, 0xcc, 0x30, 0xe3, 0xd4, 0x35, 0xaf, 0xcc, + 0xeb, 0xcb, 0xe8, 0xfe, 0x20, 0xcf, 0x94, 0xea, 0x48, 0xeb, 0x41, 0x85, 0x29, 0x22, 0x8c, 0xb0, + 0x3c, 0x46, 0x94, 0xd7, 0x4c, 0xba, 0x37, 0xd4, 0x66, 0x38, 0xdf, 0x34, 0xbe, 0xf1, 0xab, 0xf1, + 0x9f, 0xe7, 0x44, 0x7e, 0xae, 0x13, 0x90, 0x72, 0xda, 0xc5, 0xed, 0x3e, 0x63, 0x91, 0x7d, 0x81, + 0x72, 0x55, 0x62, 0x01, 0x66, 0x38, 0x3d, 0x34, 0xfe, 0xe3, 0x15, 0xa2, 0xc5, 0xdb, 0xe0, 0x5f, + 0x5e, 0x10, 0xd9, 0x83, 0x34, 0xd5, 0x8a, 0xb3, 0xb0, 0xee, 0x61, 0x4a, 0x84, 0x20, 0x9c, 0xc5, + 0xaa, 0x27, 0xf7, 0x42, 0x9f, 0x9c, 0x9e, 0x7d, 0xd2, 0x6e, 0x4f, 0x8a, 0x6f, 0xa8, 0x8c, 0x17, + 0x18, 0x07, 0xd1, 0xdd, 0x9e, 0x1b, 0x21, 0x89, 0x9d, 0x0f, 0x96, 0x25, 0x24, 0xaa, 0x64, 0xac, + 0x3a, 0x73, 0x6f, 0x5e, 0x99, 0xd7, 0x77, 0x5e, 0x8e, 0x40, 0x5b, 0x28, 0xe8, 0x0b, 0x05, 0xef, + 0xfa, 0x42, 0xc3, 0xa7, 0x2a, 0xc0, 0xa1, 0xf1, 0x1f, 0x76, 0xd8, 0xc1, 0x1b, 0xac, 0x7f, 0xfb, + 0x66, 0x74, 0xa9, 0x05, 0xb5, 0xae, 0xc8, 0x94, 0xb0, 0xb8, 0x2e, 0x35, 0xf9, 0xd6, 0xb9, 0xe4, + 0xa3, 0xb7, 0x23, 0x53, 0xc2, 0xde, 0xeb, 0x39, 0xfc, 0xb4, 0xd9, 0x79, 0xe6, 0x76, 0xe7, 0x99, + 0x7f, 0x76, 0x9e, 0xb9, 0xde, 0x7b, 0xc6, 0x76, 0xef, 0x19, 0x3f, 0xf7, 0x9e, 0xf1, 0x31, 0x3c, + 0xa9, 0xa5, 0x7b, 0x6c, 0xe3, 0x02, 0x25, 0xa2, 0x1f, 0xe0, 0x72, 0xf2, 0x1a, 0x7e, 0xff, 0xdf, + 0xb3, 0xd5, 0xb5, 0x25, 0xb7, 0x75, 0xb6, 0x57, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xae, 0xb8, + 0xd6, 0xc7, 0xe5, 0x02, 0x00, 0x00, +} + +func (m *IncentiveRecord) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IncentiveRecord) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.MinUptime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.MinUptime):]) + if err1 != nil { + return 0, err1 + } + i -= n1 + i = encodeVarintIncentiveRecord(dAtA, i, uint64(n1)) + i-- + dAtA[i] = 0x2a + n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + if err2 != nil { + return 0, err2 + } + i -= n2 + i = encodeVarintIncentiveRecord(dAtA, i, uint64(n2)) + i-- + dAtA[i] = 0x22 + { + size := m.EmissionRate.Size() + i -= size + if _, err := m.EmissionRate.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintIncentiveRecord(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size := m.RemainingAmount.Size() + i -= size + if _, err := m.RemainingAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintIncentiveRecord(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.IncentiveDenom) > 0 { + i -= len(m.IncentiveDenom) + copy(dAtA[i:], m.IncentiveDenom) + i = encodeVarintIncentiveRecord(dAtA, i, uint64(len(m.IncentiveDenom))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintIncentiveRecord(dAtA []byte, offset int, v uint64) int { + offset -= sovIncentiveRecord(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *IncentiveRecord) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.IncentiveDenom) + if l > 0 { + n += 1 + l + sovIncentiveRecord(uint64(l)) + } + l = m.RemainingAmount.Size() + n += 1 + l + sovIncentiveRecord(uint64(l)) + l = m.EmissionRate.Size() + n += 1 + l + sovIncentiveRecord(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) + n += 1 + l + sovIncentiveRecord(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.MinUptime) + n += 1 + l + sovIncentiveRecord(uint64(l)) + return n +} + +func sovIncentiveRecord(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozIncentiveRecord(x uint64) (n int) { + return sovIncentiveRecord(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentiveRecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IncentiveRecord: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IncentiveRecord: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IncentiveDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentiveRecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthIncentiveRecord + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthIncentiveRecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IncentiveDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RemainingAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentiveRecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthIncentiveRecord + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthIncentiveRecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.RemainingAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EmissionRate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentiveRecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthIncentiveRecord + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthIncentiveRecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.EmissionRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentiveRecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthIncentiveRecord + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthIncentiveRecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinUptime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentiveRecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthIncentiveRecord + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthIncentiveRecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.MinUptime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipIncentiveRecord(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthIncentiveRecord + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipIncentiveRecord(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowIncentiveRecord + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowIncentiveRecord + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowIncentiveRecord + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthIncentiveRecord + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupIncentiveRecord + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthIncentiveRecord + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthIncentiveRecord = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowIncentiveRecord = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupIncentiveRecord = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/concentrated-liquidity/types/pool.go b/x/concentrated-liquidity/types/pool.go index d6808514069..1eaa256ac0c 100644 --- a/x/concentrated-liquidity/types/pool.go +++ b/x/concentrated-liquidity/types/pool.go @@ -20,9 +20,11 @@ type ConcentratedPoolExtension interface { GetTickSpacing() uint64 GetLiquidity() sdk.Dec GetLastLiquidityUpdate() time.Time + GetPoolIncentives() []IncentiveRecord SetCurrentSqrtPrice(newSqrtPrice sdk.Dec) SetCurrentTick(newTick sdk.Int) SetLastLiquidityUpdate(newTime time.Time) + SetPoolIncentives(updatedRecords []IncentiveRecord) UpdateLiquidity(newLiquidity sdk.Dec) ApplySwap(newLiquidity sdk.Dec, newCurrentTick sdk.Int, newCurrentSqrtPrice sdk.Dec) error From f9f11b30054733101e1dad41123fca6e66297ec1 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Feb 2023 13:42:44 -0800 Subject: [PATCH 038/136] implement updateUptimeAccumulatorsToNow --- .../incentive_record.proto | 5 +- x/concentrated-liquidity/incentives.go | 56 +++++++++++---- .../types/incentive_record.pb.go | 69 ++++++++++--------- 3 files changed, 81 insertions(+), 49 deletions(-) diff --git a/proto/osmosis/concentrated-liquidity/incentive_record.proto b/proto/osmosis/concentrated-liquidity/incentive_record.proto index 495d8c7e47d..c6e560b0322 100644 --- a/proto/osmosis/concentrated-liquidity/incentive_record.proto +++ b/proto/osmosis/concentrated-liquidity/incentive_record.proto @@ -8,6 +8,7 @@ package osmosis.concentratedliquidity.v1beta1; import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; +import "google/protobuf/duration.proto"; option go_package = "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types"; @@ -41,9 +42,9 @@ message IncentiveRecord { // min_uptime is the minimum uptime required for liquidity to qualify for this // incentive. It should be always be one of the supported uptimes in // types.SupportedUptimes - google.protobuf.Timestamp min_uptime = 5 [ + google.protobuf.Duration min_uptime = 5 [ (gogoproto.nullable) = false, - (gogoproto.stdtime) = true, + (gogoproto.stdduration) = true, (gogoproto.moretags) = "yaml:\"min_uptime\"" ]; } \ No newline at end of file diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index f5494618b99..55a4b3b1ce5 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -3,6 +3,7 @@ package concentrated_liquidity import ( "strconv" "strings" + "time" sdk "github.com/cosmos/cosmos-sdk/types" @@ -106,31 +107,60 @@ func (k Keeper) getInitialUptimeGrowthOutsidesForTick(ctx sdk.Context, poolId ui // by the qualifying liquidity for each uptime. It then adds this value to the // respective accumulator and updates relevant time trackers accordingly. func (k Keeper) updateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) error { - /* pool, err := k.getPoolById(ctx, poolId) if err != nil { return err } - lastLiqUpdate := pool.GetLastLiquidityUpdate() - timeElapsed := sdk.NewDec(int64(time.Since(lastLiqUpdate))) - + // Get relevant pool-level values + poolIncentiveRecords := pool.GetPoolIncentives() + timeElapsed := sdk.NewDec(int64(time.Since(pool.GetLastLiquidityUpdate()))) uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) + if err != nil { return err } - for _, uptimeAccum := range uptimeAccums { + for uptimeIndex, uptimeAccum := range uptimeAccums { + // Get relevant uptime-level values + curUptimeDuration := types.SupportedUptimes[uptimeIndex] + + // Qualifying liquidity is the amount of liquidity that satisfies uptime requirements qualifyingLiquidity := uptimeAccum.GetTotalShares() - amountToAdd := timeElapsed.Quo(qualifyingLiquidity) - // for each IncentiveRecord where startTime.After(curTime) - // create DecCoins from (denom, emissionRate * amountToAdd) i.e. rewardsPerLiquidity - // TODO: AddToAccumulator for each uptime accum here using (curTime - lastTime) / frozenLiquidity - // Add seconds per liquidity value to accumulator - // TODO: consider passing in incentive distribution rates into position options here - // TODO: update LastLiqUpdate time here (using helper w/ new set fn + setPool) + + rewardsToAddToCurAccum := sdk.NewDecCoins() + for incentiveIndex, incentiveRecord := range poolIncentiveRecords { + // We consider all incentives matching the current uptime that began emitting before the current blocktime + if incentiveRecord.StartTime.Before(ctx.BlockTime()) && incentiveRecord.MinUptime == curUptimeDuration { + // Total amount emitted = time elapsed * emission + totalEmittedAmount := timeElapsed.Mul(incentiveRecord.EmissionRate) + + // Incentives to emit per unit of qualifying liquidity = total emitted / qualifying liquidity + // Note that we truncate to ensure we do not overdistribute incentives + incentivesPerLiquidity := totalEmittedAmount.Quo(qualifyingLiquidity) + emittedIncentivesPerLiquidity := sdk.NewDecCoinFromDec(incentiveRecord.IncentiveDenom, incentivesPerLiquidity) + + // Ensure that we only emit if there are enough incentives remaining to be emitted + remainingRewards := poolIncentiveRecords[incentiveIndex].RemainingAmount + if totalEmittedAmount.LTE(remainingRewards) { + // Add incentives to accumulator + rewardsToAddToCurAccum = rewardsToAddToCurAccum.Add(emittedIncentivesPerLiquidity) + + // Update incentive record to reflect the incentives that were emitted + remainingRewards = remainingRewards.Sub(totalEmittedAmount) + + // Each incentive record should only be modified once + poolIncentiveRecords[incentiveIndex].RemainingAmount = remainingRewards + } + } + // Emit incentives to current uptime accumulator + uptimeAccum.AddToAccumulator(rewardsToAddToCurAccum) + } + + // Update pool incentive records and LastLiquidityUpdate time in state to reflect emitted incentives + pool.SetPoolIncentives(poolIncentiveRecords) + pool.SetLastLiquidityUpdate(ctx.BlockTime()) } - */ return nil } \ No newline at end of file diff --git a/x/concentrated-liquidity/types/incentive_record.pb.go b/x/concentrated-liquidity/types/incentive_record.pb.go index d5f33ddc498..89cbea579d0 100644 --- a/x/concentrated-liquidity/types/incentive_record.pb.go +++ b/x/concentrated-liquidity/types/incentive_record.pb.go @@ -48,7 +48,7 @@ type IncentiveRecord struct { // min_uptime is the minimum uptime required for liquidity to qualify for this // incentive. It should be always be one of the supported uptimes in // types.SupportedUptimes - MinUptime time.Time `protobuf:"bytes,5,opt,name=min_uptime,json=minUptime,proto3,stdtime" json:"min_uptime" yaml:"min_uptime"` + MinUptime time.Duration `protobuf:"bytes,5,opt,name=min_uptime,json=minUptime,proto3,stdduration" json:"min_uptime" yaml:"min_uptime"` } func (m *IncentiveRecord) Reset() { *m = IncentiveRecord{} } @@ -98,11 +98,11 @@ func (m *IncentiveRecord) GetStartTime() time.Time { return time.Time{} } -func (m *IncentiveRecord) GetMinUptime() time.Time { +func (m *IncentiveRecord) GetMinUptime() time.Duration { if m != nil { return m.MinUptime } - return time.Time{} + return 0 } func init() { @@ -114,34 +114,35 @@ func init() { } var fileDescriptor_9d38bf94e42ee434 = []byte{ - // 422 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0xcd, 0xaa, 0xd3, 0x40, - 0x1c, 0xc5, 0x13, 0xaf, 0x0a, 0x37, 0x7e, 0x44, 0x83, 0x60, 0x2c, 0x98, 0x5c, 0x02, 0xea, 0xdd, - 0x74, 0x86, 0xfa, 0xb1, 0x71, 0xd7, 0xd0, 0x4d, 0xb7, 0x41, 0x41, 0x44, 0x08, 0x93, 0x64, 0x1a, - 0x07, 0x33, 0x33, 0x31, 0x33, 0xa9, 0xf6, 0x2d, 0xfa, 0x58, 0x5d, 0xb8, 0xe8, 0x52, 0x5c, 0x44, - 0x69, 0xdf, 0xa0, 0x4f, 0x20, 0x33, 0xf9, 0x68, 0x11, 0x5c, 0x74, 0x95, 0xfc, 0x0f, 0xff, 0xf3, - 0xfb, 0x1f, 0x0e, 0x63, 0xbd, 0xe1, 0x82, 0x72, 0x41, 0x04, 0x4c, 0x39, 0x4b, 0x31, 0x93, 0x15, - 0x92, 0x38, 0x1b, 0x17, 0xe4, 0x6b, 0x4d, 0x32, 0x22, 0x57, 0x90, 0x68, 0x95, 0x2c, 0x71, 0x5c, - 0xe1, 0x94, 0x57, 0x19, 0x28, 0x2b, 0x2e, 0xb9, 0xf3, 0xac, 0xb3, 0x81, 0x53, 0xdb, 0xe0, 0x02, - 0xcb, 0x49, 0x82, 0x25, 0x9a, 0x8c, 0x9e, 0xa4, 0x7a, 0x2f, 0xd6, 0x26, 0xd8, 0x0e, 0x2d, 0x61, - 0xf4, 0x28, 0xe7, 0x39, 0x6f, 0x75, 0xf5, 0xd7, 0xa9, 0x7e, 0xce, 0x79, 0x5e, 0x60, 0xa8, 0xa7, - 0xa4, 0x5e, 0x40, 0x49, 0x28, 0x16, 0x12, 0xd1, 0xb2, 0x5d, 0x08, 0x7e, 0x5c, 0x58, 0xf6, 0xbc, - 0xcf, 0x14, 0xe9, 0x48, 0xce, 0x0b, 0xcb, 0x3e, 0xc6, 0xcc, 0x30, 0xe3, 0xd4, 0x35, 0xaf, 0xcc, - 0xeb, 0xcb, 0xe8, 0xfe, 0x20, 0xcf, 0x94, 0xea, 0x48, 0xeb, 0x41, 0x85, 0x29, 0x22, 0x8c, 0xb0, - 0x3c, 0x46, 0x94, 0xd7, 0x4c, 0xba, 0x37, 0xd4, 0x66, 0x38, 0xdf, 0x34, 0xbe, 0xf1, 0xab, 0xf1, - 0x9f, 0xe7, 0x44, 0x7e, 0xae, 0x13, 0x90, 0x72, 0xda, 0xc5, 0xed, 0x3e, 0x63, 0x91, 0x7d, 0x81, - 0x72, 0x55, 0x62, 0x01, 0x66, 0x38, 0x3d, 0x34, 0xfe, 0xe3, 0x15, 0xa2, 0xc5, 0xdb, 0xe0, 0x5f, - 0x5e, 0x10, 0xd9, 0x83, 0x34, 0xd5, 0x8a, 0xb3, 0xb0, 0xee, 0x61, 0x4a, 0x84, 0x20, 0x9c, 0xc5, - 0xaa, 0x27, 0xf7, 0x42, 0x9f, 0x9c, 0x9e, 0x7d, 0xd2, 0x6e, 0x4f, 0x8a, 0x6f, 0xa8, 0x8c, 0x17, - 0x18, 0x07, 0xd1, 0xdd, 0x9e, 0x1b, 0x21, 0x89, 0x9d, 0x0f, 0x96, 0x25, 0x24, 0xaa, 0x64, 0xac, - 0x3a, 0x73, 0x6f, 0x5e, 0x99, 0xd7, 0x77, 0x5e, 0x8e, 0x40, 0x5b, 0x28, 0xe8, 0x0b, 0x05, 0xef, - 0xfa, 0x42, 0xc3, 0xa7, 0x2a, 0xc0, 0xa1, 0xf1, 0x1f, 0x76, 0xd8, 0xc1, 0x1b, 0xac, 0x7f, 0xfb, - 0x66, 0x74, 0xa9, 0x05, 0xb5, 0xae, 0xc8, 0x94, 0xb0, 0xb8, 0x2e, 0x35, 0xf9, 0xd6, 0xb9, 0xe4, - 0xa3, 0xb7, 0x23, 0x53, 0xc2, 0xde, 0xeb, 0x39, 0xfc, 0xb4, 0xd9, 0x79, 0xe6, 0x76, 0xe7, 0x99, - 0x7f, 0x76, 0x9e, 0xb9, 0xde, 0x7b, 0xc6, 0x76, 0xef, 0x19, 0x3f, 0xf7, 0x9e, 0xf1, 0x31, 0x3c, - 0xa9, 0xa5, 0x7b, 0x6c, 0xe3, 0x02, 0x25, 0xa2, 0x1f, 0xe0, 0x72, 0xf2, 0x1a, 0x7e, 0xff, 0xdf, - 0xb3, 0xd5, 0xb5, 0x25, 0xb7, 0x75, 0xb6, 0x57, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xae, 0xb8, - 0xd6, 0xc7, 0xe5, 0x02, 0x00, 0x00, + // 447 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0x4f, 0x8f, 0x94, 0x30, + 0x18, 0xc6, 0xc1, 0x55, 0x93, 0xad, 0x7f, 0x50, 0x62, 0x22, 0x3b, 0x89, 0xb0, 0x21, 0x51, 0xf7, + 0x32, 0x6d, 0xc6, 0x3f, 0x17, 0x6f, 0x4b, 0xe6, 0xb2, 0x57, 0xa2, 0xd1, 0x18, 0x13, 0x52, 0xa0, + 0x83, 0x8d, 0xb4, 0x45, 0x5a, 0x46, 0xe7, 0x5b, 0xec, 0xd1, 0x8f, 0xb4, 0x89, 0x97, 0x3d, 0x1a, + 0x0f, 0x68, 0x66, 0xbe, 0xc1, 0x7e, 0x02, 0x43, 0x29, 0xcc, 0x64, 0x8c, 0x07, 0x4f, 0xf0, 0x3e, + 0xbc, 0xcf, 0xef, 0x7d, 0xfb, 0x50, 0xf0, 0x52, 0x48, 0x26, 0x24, 0x95, 0x28, 0x13, 0x3c, 0x23, + 0x5c, 0xd5, 0x58, 0x91, 0x7c, 0x5a, 0xd2, 0xcf, 0x0d, 0xcd, 0xa9, 0x5a, 0x21, 0xaa, 0x55, 0xba, + 0x24, 0x49, 0x4d, 0x32, 0x51, 0xe7, 0xb0, 0xaa, 0x85, 0x12, 0xee, 0x63, 0x63, 0x83, 0xbb, 0xb6, + 0xd1, 0x05, 0x97, 0xb3, 0x94, 0x28, 0x3c, 0x9b, 0x1c, 0x65, 0xba, 0x2f, 0xd1, 0x26, 0xd4, 0x17, + 0x3d, 0x61, 0xf2, 0xa0, 0x10, 0x85, 0xe8, 0xf5, 0xee, 0xcd, 0xa8, 0x41, 0x21, 0x44, 0x51, 0x12, + 0xa4, 0xab, 0xb4, 0x59, 0x20, 0x45, 0x19, 0x91, 0x0a, 0xb3, 0xca, 0x34, 0xf8, 0xfb, 0x0d, 0x79, + 0x53, 0x63, 0x45, 0x05, 0xef, 0xbf, 0x87, 0xdf, 0x0f, 0x80, 0x73, 0x36, 0xec, 0x1c, 0xeb, 0x95, + 0xdd, 0xa7, 0xc0, 0xd9, 0x1e, 0x23, 0x27, 0x5c, 0x30, 0xcf, 0x3e, 0xb6, 0x4f, 0x0e, 0xe3, 0xbb, + 0xa3, 0x3c, 0xef, 0x54, 0x57, 0x81, 0x7b, 0x35, 0x61, 0x98, 0x72, 0xca, 0x8b, 0x04, 0x33, 0xd1, + 0x70, 0xe5, 0x5d, 0xeb, 0x3a, 0xa3, 0xb3, 0x8b, 0x36, 0xb0, 0x7e, 0xb6, 0xc1, 0x93, 0x82, 0xaa, + 0x8f, 0x4d, 0x0a, 0x33, 0xc1, 0xcc, 0x71, 0xcc, 0x63, 0x2a, 0xf3, 0x4f, 0x48, 0xad, 0x2a, 0x22, + 0xe1, 0x9c, 0x64, 0x57, 0x6d, 0xf0, 0x70, 0x85, 0x59, 0xf9, 0x2a, 0xdc, 0xe7, 0x85, 0xb1, 0x33, + 0x4a, 0xa7, 0x5a, 0x71, 0x17, 0xe0, 0x0e, 0x61, 0x54, 0x4a, 0x2a, 0x78, 0xd2, 0xe5, 0xe8, 0x1d, + 0xe8, 0x91, 0xa7, 0xff, 0x3d, 0xd2, 0xe9, 0x47, 0xca, 0x2f, 0xb8, 0x4a, 0x16, 0x84, 0x84, 0xf1, + 0xed, 0x81, 0x1b, 0x63, 0x45, 0xdc, 0x77, 0x00, 0x48, 0x85, 0x6b, 0x95, 0x74, 0x99, 0x7a, 0xd7, + 0x8f, 0xed, 0x93, 0x5b, 0xcf, 0x26, 0xb0, 0xcf, 0x13, 0x0e, 0x79, 0xc2, 0xd7, 0x43, 0xe0, 0xd1, + 0xa3, 0x6e, 0x81, 0xab, 0x36, 0xb8, 0x6f, 0xb0, 0xa3, 0x37, 0x3c, 0xff, 0x15, 0xd8, 0xf1, 0xa1, + 0x16, 0xba, 0x76, 0xf7, 0x2d, 0x00, 0x8c, 0xf2, 0xa4, 0xa9, 0x34, 0xf9, 0x86, 0x26, 0x1f, 0xfd, + 0x45, 0x9e, 0x9b, 0x3f, 0xb5, 0x0f, 0xde, 0x5a, 0xc3, 0x6f, 0x1a, 0xcc, 0x28, 0x7f, 0xa3, 0xeb, + 0xe8, 0xc3, 0xc5, 0xda, 0xb7, 0x2f, 0xd7, 0xbe, 0xfd, 0x7b, 0xed, 0xdb, 0xe7, 0x1b, 0xdf, 0xba, + 0xdc, 0xf8, 0xd6, 0x8f, 0x8d, 0x6f, 0xbd, 0x8f, 0x76, 0x52, 0x31, 0x77, 0x71, 0x5a, 0xe2, 0x54, + 0x0e, 0x05, 0x5a, 0xce, 0x5e, 0xa0, 0xaf, 0xff, 0xba, 0xd5, 0x3a, 0xb5, 0xf4, 0xa6, 0x5e, 0xed, + 0xf9, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4f, 0x18, 0x98, 0xbc, 0x04, 0x03, 0x00, 0x00, } func (m *IncentiveRecord) Marshal() (dAtA []byte, err error) { @@ -164,7 +165,7 @@ func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.MinUptime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.MinUptime):]) + n1, err1 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MinUptime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime):]) if err1 != nil { return 0, err1 } @@ -237,7 +238,7 @@ func (m *IncentiveRecord) Size() (n int) { n += 1 + l + sovIncentiveRecord(uint64(l)) l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) n += 1 + l + sovIncentiveRecord(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.MinUptime) + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime) n += 1 + l + sovIncentiveRecord(uint64(l)) return n } @@ -439,7 +440,7 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.MinUptime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.MinUptime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex From 2c29631b241c33d518fad8f1c527bf548d14af4c Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Feb 2023 17:03:21 -0800 Subject: [PATCH 039/136] implement and test calcAccruedIncentivesForAccum --- x/concentrated-liquidity/export_test.go | 3 + x/concentrated-liquidity/incentives.go | 86 +++++++---- x/concentrated-liquidity/incentives_test.go | 163 +++++++++++++++++++- 3 files changed, 221 insertions(+), 31 deletions(-) diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index 02527d38235..568cec393c9 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -158,3 +158,6 @@ func GetUptimeAccumulatorName(poolId, uptimeIndex uint64) string { func (k Keeper) GetUptimeAccumulatorValues(ctx sdk.Context, poolId uint64) ([]sdk.DecCoins, error) { return k.getUptimeAccumulatorValues(ctx, poolId) } +func CalcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, qualifyingLiquidity sdk.Dec, timeElapsed sdk.Dec, poolIncentiveRecords []types.IncentiveRecord,) (sdk.DecCoins, []types.IncentiveRecord, error) { + return calcAccruedIncentivesForAccum(ctx, accumUptime, qualifyingLiquidity, timeElapsed, poolIncentiveRecords) +} diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 55a4b3b1ce5..90441d8bdcf 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -1,6 +1,7 @@ package concentrated_liquidity import ( + "fmt" "strconv" "strings" "time" @@ -102,6 +103,7 @@ func (k Keeper) getInitialUptimeGrowthOutsidesForTick(ctx sdk.Context, poolId ui return emptyUptimeValues, nil } +// nolint: unused // updateUptimeAccumulatorsToNow syncs all uptime accumulators to be up to date. // Specifically, it gets the time elapsed since the last update and divides it // by the qualifying liquidity for each uptime. It then adds this value to the @@ -128,39 +130,63 @@ func (k Keeper) updateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) er // Qualifying liquidity is the amount of liquidity that satisfies uptime requirements qualifyingLiquidity := uptimeAccum.GetTotalShares() - rewardsToAddToCurAccum := sdk.NewDecCoins() - for incentiveIndex, incentiveRecord := range poolIncentiveRecords { - // We consider all incentives matching the current uptime that began emitting before the current blocktime - if incentiveRecord.StartTime.Before(ctx.BlockTime()) && incentiveRecord.MinUptime == curUptimeDuration { - // Total amount emitted = time elapsed * emission - totalEmittedAmount := timeElapsed.Mul(incentiveRecord.EmissionRate) - - // Incentives to emit per unit of qualifying liquidity = total emitted / qualifying liquidity - // Note that we truncate to ensure we do not overdistribute incentives - incentivesPerLiquidity := totalEmittedAmount.Quo(qualifyingLiquidity) - emittedIncentivesPerLiquidity := sdk.NewDecCoinFromDec(incentiveRecord.IncentiveDenom, incentivesPerLiquidity) - - // Ensure that we only emit if there are enough incentives remaining to be emitted - remainingRewards := poolIncentiveRecords[incentiveIndex].RemainingAmount - if totalEmittedAmount.LTE(remainingRewards) { - // Add incentives to accumulator - rewardsToAddToCurAccum = rewardsToAddToCurAccum.Add(emittedIncentivesPerLiquidity) - - // Update incentive record to reflect the incentives that were emitted - remainingRewards = remainingRewards.Sub(totalEmittedAmount) - - // Each incentive record should only be modified once - poolIncentiveRecords[incentiveIndex].RemainingAmount = remainingRewards - } - } - // Emit incentives to current uptime accumulator - uptimeAccum.AddToAccumulator(rewardsToAddToCurAccum) + // If there is no qualifying liquidity for the current uptime accumulator, we leave it unchanged + if qualifyingLiquidity.LT(sdk.OneDec()) { + continue + } + + incentivesToAddToCurAccum := sdk.NewDecCoins() + incentivesToAddToCurAccum, poolIncentiveRecords, err = calcAccruedIncentivesForAccum(ctx, curUptimeDuration, qualifyingLiquidity, timeElapsed, poolIncentiveRecords) + if err != nil { + return err } - // Update pool incentive records and LastLiquidityUpdate time in state to reflect emitted incentives - pool.SetPoolIncentives(poolIncentiveRecords) - pool.SetLastLiquidityUpdate(ctx.BlockTime()) + // Emit incentives to current uptime accumulator + uptimeAccum.AddToAccumulator(incentivesToAddToCurAccum) } + // Update pool incentive records and LastLiquidityUpdate time in state to reflect emitted incentives + pool.SetPoolIncentives(poolIncentiveRecords) + pool.SetLastLiquidityUpdate(ctx.BlockTime()) + return nil +} + +// calcAccruedIncentivesForAccum calculates IncentivesPerLiquidity to be added to an accum +// Returns the IncentivesPerLiquidity value and an updated list of IncentiveRecords that +// reflect emitted incentives +// Returns error if the qualifying liquidity/time elapsed are zero. +func calcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, qualifyingLiquidity sdk.Dec, timeElapsed sdk.Dec, poolIncentiveRecords []types.IncentiveRecord) (sdk.DecCoins, []types.IncentiveRecord, error) { + if !qualifyingLiquidity.IsPositive() || !timeElapsed.IsPositive() { + return sdk.DecCoins{}, []types.IncentiveRecord{}, fmt.Errorf("Qualifying liquidity and time elapsed must both be positive.") + } + + incentivesToAddToCurAccum := sdk.NewDecCoins() + for incentiveIndex, incentiveRecord := range poolIncentiveRecords { + // We consider all incentives matching the current uptime that began emitting before the current blocktime + if incentiveRecord.StartTime.Before(ctx.BlockTime()) && incentiveRecord.MinUptime == accumUptime { + // Total amount emitted = time elapsed * emission + totalEmittedAmount := timeElapsed.Mul(incentiveRecord.EmissionRate) + + // Incentives to emit per unit of qualifying liquidity = total emitted / qualifying liquidity + // Note that we truncate to ensure we do not overdistribute incentives + incentivesPerLiquidity := totalEmittedAmount.Quo(qualifyingLiquidity) + emittedIncentivesPerLiquidity := sdk.NewDecCoinFromDec(incentiveRecord.IncentiveDenom, incentivesPerLiquidity) + + // Ensure that we only emit if there are enough incentives remaining to be emitted + remainingRewards := poolIncentiveRecords[incentiveIndex].RemainingAmount + if totalEmittedAmount.LTE(remainingRewards) { + // Add incentives to accumulator + incentivesToAddToCurAccum = incentivesToAddToCurAccum.Add(emittedIncentivesPerLiquidity) + + // Update incentive record to reflect the incentives that were emitted + remainingRewards = remainingRewards.Sub(totalEmittedAmount) + + // Each incentive record should only be modified once + poolIncentiveRecords[incentiveIndex].RemainingAmount = remainingRewards + } + } + } + + return incentivesToAddToCurAccum, poolIncentiveRecords, nil } \ No newline at end of file diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index ad6e42c5484..e7cbb287487 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -1,6 +1,8 @@ package concentrated_liquidity_test import ( + "time" + sdk "github.com/cosmos/cosmos-sdk/types" cl "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity" @@ -8,7 +10,60 @@ import ( "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" ) -var defaultPoolId = uint64(1) +var ( + defaultPoolId = uint64(1) + defaultLowerTick = -100 + defaultUpperTick = 100 + + testAddressOne = sdk.AccAddress([]byte("addr1_______________")) + testAddressTwo = sdk.AccAddress([]byte("addr2_______________")) + + testAccumOne = "testAccumOne" + + testDenomOne = "denomOne" + testDenomTwo = "denomTwo" + testDenomThree = "denomThree" + + testAmountOne = sdk.NewDec(2 << 60) + testAmountTwo = sdk.NewDec(2 << 60) + testAmountThree = sdk.NewDec(2 << 60) + + testEmissionOne = sdk.MustNewDecFromStr("0.000001") + testEmissionTwo = sdk.MustNewDecFromStr("0.0783") + testEmissionThree = sdk.MustNewDecFromStr("165.4") + + defaultBlockTime = time.Now() + defaultTimeBuffer = time.Hour + defaultStartTime = defaultBlockTime.Add(defaultTimeBuffer) + + testUptimeOne = types.SupportedUptimes[0] + testUptimeTwo = types.SupportedUptimes[1] + testUptimeThree = types.SupportedUptimes[2] + + incentiveRecordOne = types.IncentiveRecord{ + IncentiveDenom: testDenomOne, + RemainingAmount: testAmountOne, + EmissionRate: testEmissionOne, + StartTime: defaultStartTime, + MinUptime: testUptimeOne, + } + + incentiveRecordTwo = types.IncentiveRecord{ + IncentiveDenom: testDenomTwo, + RemainingAmount: testAmountTwo, + EmissionRate: testEmissionTwo, + StartTime: defaultStartTime, + MinUptime: testUptimeTwo, + } + + incentiveRecordThree = types.IncentiveRecord{ + IncentiveDenom: testDenomThree, + RemainingAmount: testAmountThree, + EmissionRate: testEmissionThree, + StartTime: defaultStartTime, + MinUptime: testUptimeThree, + } +) type ExpectedUptimes struct { emptyExpectedAccumValues []sdk.DecCoins @@ -53,6 +108,19 @@ func wrapUptimeTrackers(accumValues []sdk.DecCoins) []model.UptimeTracker { return wrappedUptimeTrackers } +func expectedIncentives(denom string, rate sdk.Dec, timeElapsed time.Duration, qualifyingLiquidity sdk.Dec) sdk.DecCoin { + amount := rate.Mul(sdk.NewDec(int64(timeElapsed))).Quo(qualifyingLiquidity) + + return sdk.NewDecCoinFromDec(denom, amount) +} + +func chargeIncentive(incentiveRecord types.IncentiveRecord, timeElapsed time.Duration) types.IncentiveRecord { + incentivesEmitted := incentiveRecord.EmissionRate.Mul(sdk.NewDec(int64(timeElapsed))) + incentiveRecord.RemainingAmount = incentiveRecord.RemainingAmount.Sub(incentivesEmitted) + + return incentiveRecord +} + func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { // We expect there to be len(types.SupportedUptimes) number of initialized accumulators // for a successful pool creation. We calculate this upfront to ensure test compatibility @@ -275,3 +343,96 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulatorValues() { }) } } + +func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { + type calcAccruedIncentivesTest struct { + poolId uint64 + accumUptime time.Duration + qualifyingLiquidity sdk.Dec + timeElapsed time.Duration + poolIncentiveRecords []types.IncentiveRecord + + expectedResult sdk.DecCoins + expectedIncentiveRecords []types.IncentiveRecord + expectedPass bool + } + tests := map[string]calcAccruedIncentivesTest{ + "one incentive record, one qualifying for incentives": { + poolId: defaultPoolId, + accumUptime: types.SupportedUptimes[0], + qualifyingLiquidity: sdk.NewDec(100), + timeElapsed: time.Hour, + poolIncentiveRecords: []types.IncentiveRecord{incentiveRecordOne}, + + expectedResult: sdk.DecCoins{ + expectedIncentives(incentiveRecordOne.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), + }, + expectedIncentiveRecords: []types.IncentiveRecord{chargeIncentive(incentiveRecordOne, time.Hour)}, + expectedPass: true, + }, + "two incentive records, one qualifying for incentives": { + poolId: defaultPoolId, + accumUptime: types.SupportedUptimes[0], + qualifyingLiquidity: sdk.NewDec(100), + timeElapsed: time.Hour, + poolIncentiveRecords: []types.IncentiveRecord{incentiveRecordOne, incentiveRecordTwo}, + + expectedResult: sdk.DecCoins{ + // We only expect the first incentive record to qualify + expectedIncentives(incentiveRecordOne.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), + }, + expectedIncentiveRecords: []types.IncentiveRecord{ + // We only charge the first incentive record since the second wasn't affected + chargeIncentive(incentiveRecordOne, time.Hour), + incentiveRecordTwo, + }, + expectedPass: true, + }, + + // error catching + "zero qualifying liquidity": { + poolId: defaultPoolId, + accumUptime: types.SupportedUptimes[0], + qualifyingLiquidity: sdk.NewDec(0), + timeElapsed: time.Hour, + poolIncentiveRecords: []types.IncentiveRecord{incentiveRecordOne}, + + expectedResult: sdk.DecCoins{}, + expectedIncentiveRecords: []types.IncentiveRecord{}, + expectedPass: false, + }, + "zero time elapsed": { + poolId: defaultPoolId, + accumUptime: types.SupportedUptimes[0], + qualifyingLiquidity: sdk.NewDec(100), + timeElapsed: time.Duration(0), + poolIncentiveRecords: []types.IncentiveRecord{incentiveRecordOne}, + + expectedResult: sdk.DecCoins{}, + expectedIncentiveRecords: []types.IncentiveRecord{}, + expectedPass: false, + }, + } + + for name, tc := range tests { + tc := tc + s.Run(name, func() { + s.SetupTest() + s.Ctx = s.Ctx.WithBlockTime(defaultStartTime.Add(tc.timeElapsed)) + + s.PrepareConcentratedPool() + + // system under test + actualResult, updatedPoolRecords, err := cl.CalcAccruedIncentivesForAccum(s.Ctx, tc.accumUptime, tc.qualifyingLiquidity, sdk.NewDec(int64(tc.timeElapsed)), tc.poolIncentiveRecords) + + if tc.expectedPass { + s.Require().NoError(err) + + s.Require().Equal(tc.expectedResult, actualResult) + s.Require().Equal(tc.expectedIncentiveRecords, updatedPoolRecords) + } else { + s.Require().Error(err) + } + }) + } +} From 798b66ed6e52378b233579d22428eea84e983c4c Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Feb 2023 20:56:20 -0800 Subject: [PATCH 040/136] add tests for new helpers --- osmoutils/accum/accum.go | 5 +- x/concentrated-liquidity/export_test.go | 15 +- x/concentrated-liquidity/incentives.go | 38 +- x/concentrated-liquidity/incentives_test.go | 406 ++++++++++++++------ 4 files changed, 328 insertions(+), 136 deletions(-) diff --git a/osmoutils/accum/accum.go b/osmoutils/accum/accum.go index 37c9dac5541..e991c2c61b5 100644 --- a/osmoutils/accum/accum.go +++ b/osmoutils/accum/accum.go @@ -351,6 +351,7 @@ func (accum AccumulatorObject) ClaimRewards(positionName string) (sdk.Coins, err } // GetTotalShares returns the total number of shares in the accumulator -func (accum AccumulatorObject) GetTotalShares() sdk.Dec { - return accum.totalShares +func (accum AccumulatorObject) GetTotalShares() (sdk.Dec, error) { + accum, err := GetAccumulator(accum.store, accum.name) + return accum.totalShares, err } diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index 568cec393c9..3a095fdfd69 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -12,9 +12,11 @@ import ( poolmanagertypes "github.com/osmosis-labs/osmosis/v14/x/poolmanager/types" ) -var EmptyCoins = emptyCoins -var HundredFooCoins = sdk.NewDecCoin("foo", sdk.NewInt(100)) -var HundredBarCoins = sdk.NewDecCoin("bar", sdk.NewInt(100)) +var ( + EmptyCoins = emptyCoins + HundredFooCoins = sdk.NewDecCoin("foo", sdk.NewInt(100)) + HundredBarCoins = sdk.NewDecCoin("bar", sdk.NewInt(100)) +) // OrderInitialPoolDenoms sets the pool denoms of a cl pool func OrderInitialPoolDenoms(denom0, denom1 string) (string, string, error) { @@ -158,6 +160,11 @@ func GetUptimeAccumulatorName(poolId, uptimeIndex uint64) string { func (k Keeper) GetUptimeAccumulatorValues(ctx sdk.Context, poolId uint64) ([]sdk.DecCoins, error) { return k.getUptimeAccumulatorValues(ctx, poolId) } -func CalcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, qualifyingLiquidity sdk.Dec, timeElapsed sdk.Dec, poolIncentiveRecords []types.IncentiveRecord,) (sdk.DecCoins, []types.IncentiveRecord, error) { + +func CalcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, qualifyingLiquidity sdk.Dec, timeElapsed sdk.Dec, poolIncentiveRecords []types.IncentiveRecord) (sdk.DecCoins, []types.IncentiveRecord, error) { return calcAccruedIncentivesForAccum(ctx, accumUptime, qualifyingLiquidity, timeElapsed, poolIncentiveRecords) } + +func (k Keeper) UpdateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) error { + return k.updateUptimeAccumulatorsToNow(ctx, poolId) +} diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 90441d8bdcf..2603079a588 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -116,55 +116,73 @@ func (k Keeper) updateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) er // Get relevant pool-level values poolIncentiveRecords := pool.GetPoolIncentives() - timeElapsed := sdk.NewDec(int64(time.Since(pool.GetLastLiquidityUpdate()))) uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) - if err != nil { return err } - + + // Since our base unit of time is nanoseconds, we divide with truncation by 10^9 (10e8) to get + // time elapsed in seconds + timeElapsedNanoSec := sdk.NewDec(int64(ctx.BlockTime().Sub(pool.GetLastLiquidityUpdate()))) + timeElapsedSec := timeElapsedNanoSec.Quo(sdk.NewDec(10e8)) + + // If no time has elapsed, this function is a no-op + if timeElapsedSec.LTE(sdk.ZeroDec()) { + return nil + } + for uptimeIndex, uptimeAccum := range uptimeAccums { // Get relevant uptime-level values curUptimeDuration := types.SupportedUptimes[uptimeIndex] // Qualifying liquidity is the amount of liquidity that satisfies uptime requirements - qualifyingLiquidity := uptimeAccum.GetTotalShares() + qualifyingLiquidity, err := uptimeAccum.GetTotalShares() + if err != nil { + return err + } // If there is no qualifying liquidity for the current uptime accumulator, we leave it unchanged if qualifyingLiquidity.LT(sdk.OneDec()) { continue } - incentivesToAddToCurAccum := sdk.NewDecCoins() - incentivesToAddToCurAccum, poolIncentiveRecords, err = calcAccruedIncentivesForAccum(ctx, curUptimeDuration, qualifyingLiquidity, timeElapsed, poolIncentiveRecords) + incentivesToAddToCurAccum, updatedPoolRecords, err := calcAccruedIncentivesForAccum(ctx, curUptimeDuration, qualifyingLiquidity, timeElapsedSec, poolIncentiveRecords) if err != nil { return err } // Emit incentives to current uptime accumulator uptimeAccum.AddToAccumulator(incentivesToAddToCurAccum) + + // Update pool records (stored in state after loop) + poolIncentiveRecords = updatedPoolRecords } // Update pool incentive records and LastLiquidityUpdate time in state to reflect emitted incentives pool.SetPoolIncentives(poolIncentiveRecords) pool.SetLastLiquidityUpdate(ctx.BlockTime()) + err = k.setPool(ctx, pool) + if err != nil { + return err + } return nil } +// nolint: unused // calcAccruedIncentivesForAccum calculates IncentivesPerLiquidity to be added to an accum -// Returns the IncentivesPerLiquidity value and an updated list of IncentiveRecords that +// Returns the IncentivesPerLiquidity value and an updated list of IncentiveRecords that // reflect emitted incentives // Returns error if the qualifying liquidity/time elapsed are zero. func calcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, qualifyingLiquidity sdk.Dec, timeElapsed sdk.Dec, poolIncentiveRecords []types.IncentiveRecord) (sdk.DecCoins, []types.IncentiveRecord, error) { if !qualifyingLiquidity.IsPositive() || !timeElapsed.IsPositive() { return sdk.DecCoins{}, []types.IncentiveRecord{}, fmt.Errorf("Qualifying liquidity and time elapsed must both be positive.") } - + incentivesToAddToCurAccum := sdk.NewDecCoins() for incentiveIndex, incentiveRecord := range poolIncentiveRecords { // We consider all incentives matching the current uptime that began emitting before the current blocktime - if incentiveRecord.StartTime.Before(ctx.BlockTime()) && incentiveRecord.MinUptime == accumUptime { + if incentiveRecord.StartTime.UTC().Before(ctx.BlockTime().UTC()) && incentiveRecord.MinUptime == accumUptime { // Total amount emitted = time elapsed * emission totalEmittedAmount := timeElapsed.Mul(incentiveRecord.EmissionRate) @@ -189,4 +207,4 @@ func calcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, q } return incentivesToAddToCurAccum, poolIncentiveRecords, nil -} \ No newline at end of file +} diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index e7cbb287487..eec6b21845c 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -12,66 +12,78 @@ import ( var ( defaultPoolId = uint64(1) - defaultLowerTick = -100 - defaultUpperTick = 100 testAddressOne = sdk.AccAddress([]byte("addr1_______________")) testAddressTwo = sdk.AccAddress([]byte("addr2_______________")) + testAddressThree = sdk.AccAddress([]byte("addr3_______________")) testAccumOne = "testAccumOne" - testDenomOne = "denomOne" - testDenomTwo = "denomTwo" + testDenomOne = "denomOne" + testDenomTwo = "denomTwo" testDenomThree = "denomThree" + testDenomFour = "denomFour" - testAmountOne = sdk.NewDec(2 << 60) - testAmountTwo = sdk.NewDec(2 << 60) - testAmountThree = sdk.NewDec(2 << 60) + defaultIncentiveAmount = sdk.NewDec(2 << 60) - testEmissionOne = sdk.MustNewDecFromStr("0.000001") - testEmissionTwo = sdk.MustNewDecFromStr("0.0783") + testEmissionOne = sdk.MustNewDecFromStr("0.000001") + testEmissionTwo = sdk.MustNewDecFromStr("0.0783") testEmissionThree = sdk.MustNewDecFromStr("165.4") + testEmissionFour = sdk.MustNewDecFromStr("57.93") - defaultBlockTime = time.Now() + defaultBlockTime = time.Unix(0, 0).UTC() defaultTimeBuffer = time.Hour - defaultStartTime = defaultBlockTime.Add(defaultTimeBuffer) + defaultStartTime = defaultBlockTime.Add(defaultTimeBuffer) - testUptimeOne = types.SupportedUptimes[0] - testUptimeTwo = types.SupportedUptimes[1] + testUptimeOne = types.SupportedUptimes[0] + testUptimeTwo = types.SupportedUptimes[1] testUptimeThree = types.SupportedUptimes[2] + testUptimeFour = types.SupportedUptimes[3] incentiveRecordOne = types.IncentiveRecord{ - IncentiveDenom: testDenomOne, - RemainingAmount: testAmountOne, - EmissionRate: testEmissionOne, - StartTime: defaultStartTime, - MinUptime: testUptimeOne, + IncentiveDenom: testDenomOne, + RemainingAmount: defaultIncentiveAmount, + EmissionRate: testEmissionOne, + StartTime: defaultStartTime, + MinUptime: testUptimeOne, } incentiveRecordTwo = types.IncentiveRecord{ - IncentiveDenom: testDenomTwo, - RemainingAmount: testAmountTwo, - EmissionRate: testEmissionTwo, - StartTime: defaultStartTime, - MinUptime: testUptimeTwo, + IncentiveDenom: testDenomTwo, + RemainingAmount: defaultIncentiveAmount, + EmissionRate: testEmissionTwo, + StartTime: defaultStartTime, + MinUptime: testUptimeTwo, } incentiveRecordThree = types.IncentiveRecord{ - IncentiveDenom: testDenomThree, - RemainingAmount: testAmountThree, - EmissionRate: testEmissionThree, - StartTime: defaultStartTime, - MinUptime: testUptimeThree, + IncentiveDenom: testDenomThree, + RemainingAmount: defaultIncentiveAmount, + EmissionRate: testEmissionThree, + StartTime: defaultStartTime, + MinUptime: testUptimeThree, } + + incentiveRecordFour = types.IncentiveRecord{ + IncentiveDenom: testDenomFour, + RemainingAmount: defaultIncentiveAmount, + EmissionRate: testEmissionFour, + StartTime: defaultStartTime, + MinUptime: testUptimeFour, + } + + testQualifyingDepositsOne = sdk.NewInt(50) + testQualifyingDepositsTwo = sdk.NewInt(100) + testQualifyingDepositsThree = sdk.NewInt(399) ) type ExpectedUptimes struct { - emptyExpectedAccumValues []sdk.DecCoins - hundredTokensSingleDenom []sdk.DecCoins - hundredTokensMultiDenom []sdk.DecCoins + emptyExpectedAccumValues []sdk.DecCoins + hundredTokensSingleDenom []sdk.DecCoins + hundredTokensMultiDenom []sdk.DecCoins twoHundredTokensMultiDenom []sdk.DecCoins - varyingTokensSingleDenom []sdk.DecCoins - varyingTokensMultiDenom []sdk.DecCoins + varyingTokensSingleDenom []sdk.DecCoins + varyingTokensMultiDenom []sdk.DecCoins } // getExpectedUptimes returns a base set of expected values for testing based on the number @@ -79,12 +91,12 @@ type ExpectedUptimes struct { // of incentives-related tests if the supported uptimes are ever changed. func getExpectedUptimes() ExpectedUptimes { expUptimes := ExpectedUptimes{ - emptyExpectedAccumValues: []sdk.DecCoins{}, - hundredTokensSingleDenom: []sdk.DecCoins{}, - hundredTokensMultiDenom: []sdk.DecCoins{}, + emptyExpectedAccumValues: []sdk.DecCoins{}, + hundredTokensSingleDenom: []sdk.DecCoins{}, + hundredTokensMultiDenom: []sdk.DecCoins{}, twoHundredTokensMultiDenom: []sdk.DecCoins{}, - varyingTokensSingleDenom: []sdk.DecCoins{}, - varyingTokensMultiDenom: []sdk.DecCoins{}, + varyingTokensSingleDenom: []sdk.DecCoins{}, + varyingTokensMultiDenom: []sdk.DecCoins{}, } for i := range types.SupportedUptimes { expUptimes.emptyExpectedAccumValues = append(expUptimes.emptyExpectedAccumValues, cl.EmptyCoins) @@ -92,7 +104,7 @@ func getExpectedUptimes() ExpectedUptimes { expUptimes.hundredTokensMultiDenom = append(expUptimes.hundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins, cl.HundredBarCoins)) expUptimes.twoHundredTokensMultiDenom = append(expUptimes.twoHundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(cl.HundredFooCoins), cl.HundredBarCoins.Add(cl.HundredBarCoins))) expUptimes.varyingTokensSingleDenom = append(expUptimes.varyingTokensSingleDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(sdk.NewDecCoin("foo", sdk.NewInt(int64(i)))))) - expUptimes.varyingTokensMultiDenom = append(expUptimes.varyingTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(sdk.NewDecCoin("foo", sdk.NewInt(int64(i)))), cl.HundredBarCoins.Add(sdk.NewDecCoin("bar", sdk.NewInt(int64(i * 3)))))) + expUptimes.varyingTokensMultiDenom = append(expUptimes.varyingTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(sdk.NewDecCoin("foo", sdk.NewInt(int64(i)))), cl.HundredBarCoins.Add(sdk.NewDecCoin("bar", sdk.NewInt(int64(i*3)))))) } return expUptimes @@ -109,13 +121,14 @@ func wrapUptimeTrackers(accumValues []sdk.DecCoins) []model.UptimeTracker { } func expectedIncentives(denom string, rate sdk.Dec, timeElapsed time.Duration, qualifyingLiquidity sdk.Dec) sdk.DecCoin { - amount := rate.Mul(sdk.NewDec(int64(timeElapsed))).Quo(qualifyingLiquidity) + timeInSec := sdk.NewDec(int64(timeElapsed)).Quo(sdk.MustNewDecFromStr("1000000000")) + amount := rate.Mul(timeInSec).Quo(qualifyingLiquidity) return sdk.NewDecCoinFromDec(denom, amount) } func chargeIncentive(incentiveRecord types.IncentiveRecord, timeElapsed time.Duration) types.IncentiveRecord { - incentivesEmitted := incentiveRecord.EmissionRate.Mul(sdk.NewDec(int64(timeElapsed))) + incentivesEmitted := incentiveRecord.EmissionRate.Mul(sdk.NewDec(int64(timeElapsed)).Quo(sdk.MustNewDecFromStr("1000000000"))) incentiveRecord.RemainingAmount = incentiveRecord.RemainingAmount.Sub(incentivesEmitted) return incentiveRecord @@ -228,76 +241,76 @@ func (s *KeeperTestSuite) TestGetUptimeAccumulatorName() { func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulatorValues() { // We expect there to be len(types.SupportedUptimes) number of initialized accumulators - // for a successful pool creation. - // We re-calculate these values each time to ensure test compatibility if the uptimes + // for a successful pool creation. + // We re-calculate these values each time to ensure test compatibility if the uptimes // we support ever change. expectedUptimes := getExpectedUptimes() type initUptimeAccumTest struct { - poolId uint64 - initializePoolAccums bool - addedAccumValues []sdk.DecCoins - numTimesAdded int - expectedAccumValues []sdk.DecCoins + poolId uint64 + initializePoolAccums bool + addedAccumValues []sdk.DecCoins + numTimesAdded int + expectedAccumValues []sdk.DecCoins expectedPass bool } tests := map[string]initUptimeAccumTest{ "hundred of a single denom in each accumulator added once": { - poolId: defaultPoolId, - initializePoolAccums: true, - addedAccumValues: expectedUptimes.hundredTokensSingleDenom, - numTimesAdded: 1, - expectedAccumValues: expectedUptimes.hundredTokensSingleDenom, - expectedPass: true, + poolId: defaultPoolId, + initializePoolAccums: true, + addedAccumValues: expectedUptimes.hundredTokensSingleDenom, + numTimesAdded: 1, + expectedAccumValues: expectedUptimes.hundredTokensSingleDenom, + expectedPass: true, }, "hundred of multiple denom in each accumulator added once": { - poolId: defaultPoolId, - initializePoolAccums: true, - addedAccumValues: expectedUptimes.hundredTokensMultiDenom, - numTimesAdded: 1, - expectedAccumValues: expectedUptimes.hundredTokensMultiDenom, - expectedPass: true, + poolId: defaultPoolId, + initializePoolAccums: true, + addedAccumValues: expectedUptimes.hundredTokensMultiDenom, + numTimesAdded: 1, + expectedAccumValues: expectedUptimes.hundredTokensMultiDenom, + expectedPass: true, }, "varying amounts of single denom in each accumulator added once": { - poolId: defaultPoolId, - initializePoolAccums: true, - addedAccumValues: expectedUptimes.varyingTokensSingleDenom, - numTimesAdded: 1, - expectedAccumValues: expectedUptimes.varyingTokensSingleDenom, - expectedPass: true, + poolId: defaultPoolId, + initializePoolAccums: true, + addedAccumValues: expectedUptimes.varyingTokensSingleDenom, + numTimesAdded: 1, + expectedAccumValues: expectedUptimes.varyingTokensSingleDenom, + expectedPass: true, }, "varying of multiple denoms in each accumulator added once": { - poolId: defaultPoolId, - initializePoolAccums: true, - addedAccumValues: expectedUptimes.varyingTokensMultiDenom, - numTimesAdded: 1, - expectedAccumValues: expectedUptimes.varyingTokensMultiDenom, - expectedPass: true, + poolId: defaultPoolId, + initializePoolAccums: true, + addedAccumValues: expectedUptimes.varyingTokensMultiDenom, + numTimesAdded: 1, + expectedAccumValues: expectedUptimes.varyingTokensMultiDenom, + expectedPass: true, }, "hundred of multiple denom in each accumulator added twice": { - poolId: defaultPoolId, - initializePoolAccums: true, - addedAccumValues: expectedUptimes.hundredTokensMultiDenom, - numTimesAdded: 2, - expectedAccumValues: expectedUptimes.twoHundredTokensMultiDenom, - expectedPass: true, + poolId: defaultPoolId, + initializePoolAccums: true, + addedAccumValues: expectedUptimes.hundredTokensMultiDenom, + numTimesAdded: 2, + expectedAccumValues: expectedUptimes.twoHundredTokensMultiDenom, + expectedPass: true, }, "setup with different poolId": { - poolId: defaultPoolId + 1, - initializePoolAccums: true, - addedAccumValues: expectedUptimes.hundredTokensSingleDenom, - numTimesAdded: 1, - expectedAccumValues: expectedUptimes.hundredTokensSingleDenom, - expectedPass: true, + poolId: defaultPoolId + 1, + initializePoolAccums: true, + addedAccumValues: expectedUptimes.hundredTokensSingleDenom, + numTimesAdded: 1, + expectedAccumValues: expectedUptimes.hundredTokensSingleDenom, + expectedPass: true, }, "pool not initialized": { - initializePoolAccums: false, - poolId: defaultPoolId, - addedAccumValues: expectedUptimes.hundredTokensSingleDenom, - numTimesAdded: 1, - expectedAccumValues: []sdk.DecCoins{}, - expectedPass: false, + initializePoolAccums: false, + poolId: defaultPoolId, + addedAccumValues: expectedUptimes.hundredTokensSingleDenom, + numTimesAdded: 1, + expectedAccumValues: []sdk.DecCoins{}, + expectedPass: false, }, } @@ -315,7 +328,7 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulatorValues() { poolUptimeAccumulators, err := clKeeper.GetUptimeAccumulators(s.Ctx, tc.poolId) s.Require().NoError(err) - + for i := 0; i < tc.numTimesAdded; i++ { for uptimeId, uptimeAccum := range poolUptimeAccumulators { uptimeAccum.AddToAccumulator(tc.addedAccumValues[uptimeId]) @@ -346,35 +359,35 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulatorValues() { func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { type calcAccruedIncentivesTest struct { - poolId uint64 - accumUptime time.Duration - qualifyingLiquidity sdk.Dec - timeElapsed time.Duration + poolId uint64 + accumUptime time.Duration + qualifyingLiquidity sdk.Dec + timeElapsed time.Duration poolIncentiveRecords []types.IncentiveRecord - expectedResult sdk.DecCoins + expectedResult sdk.DecCoins expectedIncentiveRecords []types.IncentiveRecord - expectedPass bool + expectedPass bool } tests := map[string]calcAccruedIncentivesTest{ "one incentive record, one qualifying for incentives": { - poolId: defaultPoolId, - accumUptime: types.SupportedUptimes[0], - qualifyingLiquidity: sdk.NewDec(100), - timeElapsed: time.Hour, + poolId: defaultPoolId, + accumUptime: types.SupportedUptimes[0], + qualifyingLiquidity: sdk.NewDec(100), + timeElapsed: time.Hour, poolIncentiveRecords: []types.IncentiveRecord{incentiveRecordOne}, expectedResult: sdk.DecCoins{ expectedIncentives(incentiveRecordOne.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), }, expectedIncentiveRecords: []types.IncentiveRecord{chargeIncentive(incentiveRecordOne, time.Hour)}, - expectedPass: true, + expectedPass: true, }, "two incentive records, one qualifying for incentives": { - poolId: defaultPoolId, - accumUptime: types.SupportedUptimes[0], - qualifyingLiquidity: sdk.NewDec(100), - timeElapsed: time.Hour, + poolId: defaultPoolId, + accumUptime: types.SupportedUptimes[0], + qualifyingLiquidity: sdk.NewDec(100), + timeElapsed: time.Hour, poolIncentiveRecords: []types.IncentiveRecord{incentiveRecordOne, incentiveRecordTwo}, expectedResult: sdk.DecCoins{ @@ -386,31 +399,31 @@ func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { chargeIncentive(incentiveRecordOne, time.Hour), incentiveRecordTwo, }, - expectedPass: true, + expectedPass: true, }, // error catching "zero qualifying liquidity": { - poolId: defaultPoolId, - accumUptime: types.SupportedUptimes[0], - qualifyingLiquidity: sdk.NewDec(0), - timeElapsed: time.Hour, + poolId: defaultPoolId, + accumUptime: types.SupportedUptimes[0], + qualifyingLiquidity: sdk.NewDec(0), + timeElapsed: time.Hour, poolIncentiveRecords: []types.IncentiveRecord{incentiveRecordOne}, - expectedResult: sdk.DecCoins{}, + expectedResult: sdk.DecCoins{}, expectedIncentiveRecords: []types.IncentiveRecord{}, - expectedPass: false, + expectedPass: false, }, "zero time elapsed": { - poolId: defaultPoolId, - accumUptime: types.SupportedUptimes[0], - qualifyingLiquidity: sdk.NewDec(100), - timeElapsed: time.Duration(0), + poolId: defaultPoolId, + accumUptime: types.SupportedUptimes[0], + qualifyingLiquidity: sdk.NewDec(100), + timeElapsed: time.Duration(0), poolIncentiveRecords: []types.IncentiveRecord{incentiveRecordOne}, - expectedResult: sdk.DecCoins{}, + expectedResult: sdk.DecCoins{}, expectedIncentiveRecords: []types.IncentiveRecord{}, - expectedPass: false, + expectedPass: false, }, } @@ -423,7 +436,7 @@ func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { s.PrepareConcentratedPool() // system under test - actualResult, updatedPoolRecords, err := cl.CalcAccruedIncentivesForAccum(s.Ctx, tc.accumUptime, tc.qualifyingLiquidity, sdk.NewDec(int64(tc.timeElapsed)), tc.poolIncentiveRecords) + actualResult, updatedPoolRecords, err := cl.CalcAccruedIncentivesForAccum(s.Ctx, tc.accumUptime, tc.qualifyingLiquidity, sdk.NewDec(int64(tc.timeElapsed)).Quo(sdk.MustNewDecFromStr("1000000000")), tc.poolIncentiveRecords) if tc.expectedPass { s.Require().NoError(err) @@ -436,3 +449,156 @@ func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { }) } } + +func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { + supportedUptimes := types.SupportedUptimes + + type updateAccumToNow struct { + poolId uint64 + accumUptime time.Duration + qualifyingLiquidity sdk.Dec + timeElapsed time.Duration + poolIncentiveRecords []types.IncentiveRecord + + expectedResult sdk.DecCoins + expectedUptimeDeltas []sdk.DecCoins + expectedIncentiveRecords []types.IncentiveRecord + expectedPass bool + } + tests := map[string]updateAccumToNow{ + "one incentive record": { + poolId: defaultPoolId, + timeElapsed: time.Hour, + poolIncentiveRecords: []types.IncentiveRecord{incentiveRecordOne}, + + expectedIncentiveRecords: []types.IncentiveRecord{ + // We deduct incentives from the record for the period it emitted incentives + chargeIncentive(incentiveRecordOne, time.Hour), + }, + expectedPass: true, + }, + "two incentive records, each with qualifying liquidity": { + poolId: defaultPoolId, + timeElapsed: time.Hour, + poolIncentiveRecords: []types.IncentiveRecord{incentiveRecordOne, incentiveRecordTwo}, + + expectedIncentiveRecords: []types.IncentiveRecord{ + // We deduct incentives from both records since there are positions for each + chargeIncentive(incentiveRecordOne, time.Hour), + chargeIncentive(incentiveRecordTwo, time.Hour), + }, + expectedPass: true, + }, + "three incentive records, each with qualifying liquidity": { + poolId: defaultPoolId, + timeElapsed: time.Hour, + poolIncentiveRecords: []types.IncentiveRecord{incentiveRecordOne, incentiveRecordTwo, incentiveRecordThree}, + + expectedIncentiveRecords: []types.IncentiveRecord{ + // We deduct incentives from each record since there are positions for all three + chargeIncentive(incentiveRecordOne, time.Hour), + chargeIncentive(incentiveRecordTwo, time.Hour), + chargeIncentive(incentiveRecordThree, time.Hour), + }, + expectedPass: true, + }, + "two incentive records, only one with qualifying liquidity": { + poolId: defaultPoolId, + timeElapsed: time.Hour, + poolIncentiveRecords: []types.IncentiveRecord{incentiveRecordOne, incentiveRecordTwo, incentiveRecordThree, incentiveRecordFour}, + + expectedIncentiveRecords: []types.IncentiveRecord{ + // We only deduct from the first three incentive records since the last doesn't emit anything + chargeIncentive(incentiveRecordOne, time.Hour), + chargeIncentive(incentiveRecordTwo, time.Hour), + chargeIncentive(incentiveRecordThree, time.Hour), + incentiveRecordFour, + }, + expectedPass: true, + }, + } + + for name, tc := range tests { + tc := tc + s.Run(name, func() { + s.SetupTest() + clKeeper := s.App.ConcentratedLiquidityKeeper + s.Ctx = s.Ctx.WithBlockTime(defaultStartTime) + + // Set up test pool + clPool := s.PrepareConcentratedPool() + + // Initialize test incentives on the pool + clPool.SetPoolIncentives(tc.poolIncentiveRecords) + clKeeper.SetPool(s.Ctx, clPool) + + // Get initial uptime accum values for comparison + initUptimeAccumValues, err := clKeeper.GetUptimeAccumulatorValues(s.Ctx, tc.poolId) + s.Require().NoError(err) + + // Add qualifying and non-qualifying liquidity to the pool + s.FundAcc(testAddressOne, sdk.NewCoins(sdk.NewCoin(clPool.GetToken0(), testQualifyingDepositsOne), sdk.NewCoin(clPool.GetToken1(), testQualifyingDepositsOne))) + s.FundAcc(testAddressTwo, sdk.NewCoins(sdk.NewCoin(clPool.GetToken0(), testQualifyingDepositsTwo), sdk.NewCoin(clPool.GetToken1(), testQualifyingDepositsTwo))) + s.FundAcc(testAddressThree, sdk.NewCoins(sdk.NewCoin(clPool.GetToken0(), testQualifyingDepositsThree), sdk.NewCoin(clPool.GetToken1(), testQualifyingDepositsThree))) + + _, _, qualifyingLiquidityUptimeOne, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, testAddressOne, testQualifyingDepositsOne, testQualifyingDepositsOne, sdk.ZeroInt(), sdk.ZeroInt(), clPool.GetCurrentTick().Int64()-1, clPool.GetCurrentTick().Int64()+1, defaultStartTime.Add(supportedUptimes[0])) + s.Require().NoError(err) + + _, _, qualifyingLiquidityUptimeTwo, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, testAddressTwo, testQualifyingDepositsTwo, testQualifyingDepositsTwo, sdk.ZeroInt(), sdk.ZeroInt(), clPool.GetCurrentTick().Int64()-1, clPool.GetCurrentTick().Int64()+1, defaultStartTime.Add(supportedUptimes[1])) + s.Require().NoError(err) + + _, _, qualifyingLiquidityUptimeThree, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, testAddressThree, testQualifyingDepositsThree, testQualifyingDepositsThree, sdk.ZeroInt(), sdk.ZeroInt(), clPool.GetCurrentTick().Int64()-1, clPool.GetCurrentTick().Int64()+1, defaultStartTime.Add(supportedUptimes[2])) + s.Require().NoError(err) + + // Note that the third position (1D freeze) qualifies for all three uptimes, the second position qualifies for the first two, + // and the first position only qualifies for the first. None of the positions qualify for any later uptimes (e.g. 1W) + qualifyingLiquidities := []sdk.Dec{ + qualifyingLiquidityUptimeOne.Add(qualifyingLiquidityUptimeTwo).Add(qualifyingLiquidityUptimeThree), + qualifyingLiquidityUptimeTwo.Add(qualifyingLiquidityUptimeThree), + qualifyingLiquidityUptimeThree, + } + + // Let `timeElapsed` time pass + s.Ctx = s.Ctx.WithBlockTime(defaultStartTime.Add(tc.timeElapsed)) + + // system under test + err = clKeeper.UpdateUptimeAccumulatorsToNow(s.Ctx, tc.poolId) + + if tc.expectedPass { + s.Require().NoError(err) + + // Get updated pool for testing purposes + clPool, err := clKeeper.GetPoolById(s.Ctx, tc.poolId) + s.Require().NoError(err) + + // Get new uptime accum values for comparison + newUptimeAccumValues, err := clKeeper.GetUptimeAccumulatorValues(s.Ctx, tc.poolId) + s.Require().NoError(err) + + // Calculate expected uptime deltas using qualifying liquidity deltas (eh can only test one incentive?) + expectedUptimeDeltas := []sdk.DecCoins{} + for uptimeIndex := range newUptimeAccumValues { + if uptimeIndex < len(tc.poolIncentiveRecords) && uptimeIndex < len(qualifyingLiquidities) { + expectedUptimeDeltas = append(expectedUptimeDeltas, sdk.NewDecCoins(expectedIncentives(tc.poolIncentiveRecords[uptimeIndex].IncentiveDenom, tc.poolIncentiveRecords[uptimeIndex].EmissionRate, time.Hour, qualifyingLiquidities[uptimeIndex]))) + } else { + expectedUptimeDeltas = append(expectedUptimeDeltas, cl.EmptyCoins) + } + } + + // Ensure that each accumulator value changes by the correct amount + for uptimeIndex := range newUptimeAccumValues { + uptimeDelta := newUptimeAccumValues[uptimeIndex].Sub(initUptimeAccumValues[uptimeIndex]) + s.Require().Equal(expectedUptimeDeltas[uptimeIndex], uptimeDelta) + } + + // Ensure that LastLiquidityUpdate field is updated for pool + s.Require().Equal(s.Ctx.BlockTime(), clPool.GetLastLiquidityUpdate()) + + // Ensure that pool's IncentiveRecords are updated to reflect emitted incentives + s.Require().Equal(tc.expectedIncentiveRecords, clPool.GetPoolIncentives()) + } else { + s.Require().Error(err) + } + }) + } +} From fcc5c8c2775365b3068d0d953c537160bb2277e0 Mon Sep 17 00:00:00 2001 From: alpo <62043214+AlpinYukseloglu@users.noreply.github.com> Date: Thu, 2 Feb 2023 21:03:38 -0800 Subject: [PATCH 041/136] minor comment updates Co-authored-by: Roman --- x/concentrated-liquidity/position.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 588eb850d7b..9c764fdf91d 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -73,9 +73,9 @@ func (k Keeper) initOrUpdatePosition( for uptimeIndex, uptime := range types.SupportedUptimes { // We assume every position update requires the position to be frozen for the - // min uptime again. Thus, if the difference between the position's `FrozenUntil` - // and the blocktime when the update happens should be greater than the required - // uptime. + // min uptime again. Thus, the difference between the position's `FrozenUntil` + // and the blocktime when the update happens should be greater than or equal + // to the required uptime. if position.FrozenUntil.Sub(ctx.BlockTime()) >= uptime { curUptimeAccum := uptimeAccumulators[uptimeIndex] From 9287d3c618cf5dc2f001bfe5a9e1afe9ba85e372 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Feb 2023 21:23:15 -0800 Subject: [PATCH 042/136] accum test updates --- osmoutils/accum/accum_test.go | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/osmoutils/accum/accum_test.go b/osmoutils/accum/accum_test.go index 8b59d510476..a01e80d7e61 100644 --- a/osmoutils/accum/accum_test.go +++ b/osmoutils/accum/accum_test.go @@ -1483,8 +1483,12 @@ func (suite *AccumTestSuite) TestGetTotalShares() { suite.Require().NoError(err) // Ensure that both accums start at zero shares - suite.Require().Equal(sdk.ZeroDec(), accumOne.GetTotalShares()) - suite.Require().Equal(sdk.ZeroDec(), accumTwo.GetTotalShares()) + accumOneShares, err := accumOne.GetTotalShares() + suite.Require().NoError(err) + accumTwoShares, err := accumTwo.GetTotalShares() + suite.Require().NoError(err) + suite.Require().Equal(sdk.ZeroDec(), accumOneShares) + suite.Require().Equal(sdk.ZeroDec(), accumTwoShares) // Create position on first accum and pull new accum objects from state err = accumOne.NewPosition(testAddressOne, sdk.OneDec(), nil) @@ -1495,8 +1499,12 @@ func (suite *AccumTestSuite) TestGetTotalShares() { suite.Require().NoError(err) // Check that total shares for accum one has updated properly and accum two shares are unchanged - suite.Require().Equal(sdk.OneDec(), accumOne.GetTotalShares()) - suite.Require().Equal(sdk.ZeroDec(), accumTwo.GetTotalShares()) + accumOneShares, err = accumOne.GetTotalShares() + suite.Require().NoError(err) + accumTwoShares, err = accumTwo.GetTotalShares() + suite.Require().NoError(err) + suite.Require().Equal(sdk.OneDec(), accumOneShares) + suite.Require().Equal(sdk.ZeroDec(), accumTwoShares) // Run a number of NewPosition, AddToPosition, and RemoveFromPosition operations on each accum testAddresses := []string{testAddressOne, testAddressTwo, testAddressThree} @@ -1554,6 +1562,10 @@ func (suite *AccumTestSuite) TestGetTotalShares() { suite.Require().NoError(err) // Ensure that total shares in each accum matches our expected number of shares - suite.Require().Equal(expectedShares[0], accumOne.GetTotalShares()) - suite.Require().Equal(expectedShares[1], accumTwo.GetTotalShares()) + accumOneShares, err = accumOne.GetTotalShares() + suite.Require().NoError(err) + accumTwoShares, err = accumTwo.GetTotalShares() + suite.Require().NoError(err) + suite.Require().Equal(expectedShares[0], accumOneShares) + suite.Require().Equal(expectedShares[1], accumTwoShares) } \ No newline at end of file From 37aa74ffe264f08ab359dc2f057562ec6b735ebc Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Feb 2023 21:35:26 -0800 Subject: [PATCH 043/136] lint --- x/concentrated-liquidity/model/pool.go | 2 +- x/concentrated-liquidity/position.go | 2 +- x/concentrated-liquidity/types/pool.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x/concentrated-liquidity/model/pool.go b/x/concentrated-liquidity/model/pool.go index a757f5636ce..b58b6fcc6ae 100644 --- a/x/concentrated-liquidity/model/pool.go +++ b/x/concentrated-liquidity/model/pool.go @@ -157,7 +157,7 @@ func (p Pool) GetLastLiquidityUpdate() time.Time { } func (p Pool) GetPoolIncentives() []types.IncentiveRecord { -return p.PoolIncentives + return p.PoolIncentives } func (p Pool) GetType() poolmanagertypes.PoolType { diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 5c62ccbb481..b7180c885ee 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -87,7 +87,7 @@ func (k Keeper) initOrUpdatePosition( return err } - // TODO: move these into helper functions that move up position's accum value by + // TODO: move these into helper functions that move up position's accum value by // "incentives earned outside tick range" to not overpay if !recordExists { err = curUptimeAccum.NewPosition(positionName, position.Liquidity, emptyOptions) diff --git a/x/concentrated-liquidity/types/pool.go b/x/concentrated-liquidity/types/pool.go index 1eaa256ac0c..6829b4d5f58 100644 --- a/x/concentrated-liquidity/types/pool.go +++ b/x/concentrated-liquidity/types/pool.go @@ -20,7 +20,7 @@ type ConcentratedPoolExtension interface { GetTickSpacing() uint64 GetLiquidity() sdk.Dec GetLastLiquidityUpdate() time.Time - GetPoolIncentives() []IncentiveRecord + GetPoolIncentives() []IncentiveRecord SetCurrentSqrtPrice(newSqrtPrice sdk.Dec) SetCurrentTick(newTick sdk.Int) SetLastLiquidityUpdate(newTime time.Time) From 7a7c52d79ec789eb6e8c01aaeff0bf4664aedc5f Mon Sep 17 00:00:00 2001 From: alpo Date: Sun, 5 Feb 2023 13:29:16 -0800 Subject: [PATCH 044/136] clean up diff --- x/concentrated-liquidity/pool.go | 2 -- x/concentrated-liquidity/pool_test.go | 5 ----- x/concentrated-liquidity/position.go | 11 ++-------- x/concentrated-liquidity/tick.go | 29 +++------------------------ x/concentrated-liquidity/tick_test.go | 16 ++++++--------- 5 files changed, 11 insertions(+), 52 deletions(-) diff --git a/x/concentrated-liquidity/pool.go b/x/concentrated-liquidity/pool.go index fafa16844c6..ff2a5dd3894 100644 --- a/x/concentrated-liquidity/pool.go +++ b/x/concentrated-liquidity/pool.go @@ -29,8 +29,6 @@ func (k Keeper) InitializePool(ctx sdk.Context, poolI poolmanagertypes.PoolI, cr concentratedPool.SetLastLiquidityUpdate(ctx.BlockTime()) - // TODO: add validateLastLiquidityUpdate check - tickSpacing := concentratedPool.GetTickSpacing() if !k.validateTickSpacing(ctx, tickSpacing) { diff --git a/x/concentrated-liquidity/pool_test.go b/x/concentrated-liquidity/pool_test.go index 6ae67970b8a..50c39c64c4c 100644 --- a/x/concentrated-liquidity/pool_test.go +++ b/x/concentrated-liquidity/pool_test.go @@ -92,11 +92,6 @@ func (s *KeeperTestSuite) TestInitializePool() { for _, uptimeAccumulator := range uptimeAccumulators { s.Require().Equal(cl.EmptyCoins, uptimeAccumulator.GetValue()) } - - // Ensure that pool's LastLiquidityUpdate was properly updated to current blocktime - pool, err := s.App.ConcentratedLiquidityKeeper.GetPoolById(s.Ctx, test.poolI.GetId()) - s.Require().NoError(err) - s.Require().Equal(s.Ctx.BlockTime(), pool.GetLastLiquidityUpdate()) } else { // Ensure specified error is returned s.Require().Error(err) diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 1eb335fc760..9c764fdf91d 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -63,6 +63,8 @@ func (k Keeper) initOrUpdatePosition( position.FrozenUntil = frozenUntil + // TODO: consider deleting position if liquidity becomes zero + // Create records for relevant uptime accumulators here. uptimeAccumulators, err := k.getUptimeAccumulators(ctx, poolId) if err != nil { @@ -79,16 +81,12 @@ func (k Keeper) initOrUpdatePosition( // If a record does not exist for this uptime accumulator, create a new position. // Otherwise, add to existing record. - // Note that adding to a record resets its checkpointed accumulator value and sets - // aside any earned rewards to be claimed later. positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil)) recordExists, err := curUptimeAccum.HasPosition(positionName) if err != nil { return err } - // TODO: move these into helper functions that move up position's accum value by - // "incentives earned outside tick range" to not overpay if !recordExists { err = curUptimeAccum.NewPosition(positionName, position.Liquidity, emptyOptions) } else if !liquidityDelta.IsNegative() { @@ -103,9 +101,6 @@ func (k Keeper) initOrUpdatePosition( } k.setPosition(ctx, poolId, owner, lowerTick, upperTick, position, frozenUntil) - // TODO: AddToAccumulator for each uptime accum here using (curTime - lastTime) / getPoolById().GetLiquidity() - // TODO: update LastLiqUpdate time here (using helper w/ new set fn + setPool) - // TODO: move the logic from the previous two TODOs into a single helper in incentives.go return nil } @@ -165,8 +160,6 @@ func (k Keeper) deletePosition(ctx sdk.Context, return types.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick, FrozenUntil: frozenUntil} } - // TODO: remove uptime records - store.Delete(key) return nil } diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index 33aed46b37b..dac70143ad4 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -62,25 +62,13 @@ func (k Keeper) crossTick(ctx sdk.Context, poolId uint64, tickIndex int64) (liqu return sdk.Dec{}, err } - feeAccum, err := k.getFeeAccumulator(ctx, poolId) + accum, err := k.getFeeAccumulator(ctx, poolId) if err != nil { return sdk.Dec{}, err } // subtract tick's fee growth outside from current fee accumulator - tickInfo.FeeGrowthOutside = feeAccum.GetValue().Sub(tickInfo.FeeGrowthOutside) - - uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) - if err != nil { - return sdk.Dec{}, err - } - - // for each supported uptime, subtract tick's uptime growth outside from the respective uptime accumulator - for uptimeId, uptimeAccum := range uptimeAccums { - curUptimeTracker := tickInfo.UptimeTrackers[uptimeId] - curUptimeTracker.UptimeGrowthOutside = uptimeAccum.GetValue().Sub(curUptimeTracker.UptimeGrowthOutside) - } - + tickInfo.FeeGrowthOutside = accum.GetValue().Sub(tickInfo.FeeGrowthOutside) k.SetTickInfo(ctx, poolId, tickIndex, tickInfo) return tickInfo.LiquidityNet, nil @@ -105,18 +93,7 @@ func (k Keeper) getTickInfo(ctx sdk.Context, poolId uint64, tickIndex int64) (ti return tickStruct, err } - // We also initialize the uptime trackers for the new tick - initialUptimeGrowthOutsideValues, err := k.getInitialUptimeGrowthOutsidesForTick(ctx, poolId, tickIndex) - if err != nil { - return tickStruct, err - } - - initialUptimeTrackers := []model.UptimeTracker{} - for _, uptimeValue := range initialUptimeGrowthOutsideValues { - initialUptimeTrackers = append(initialUptimeTrackers, model.UptimeTracker{UptimeGrowthOutside: uptimeValue}) - } - - return model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: initialFeeGrowthOutside, UptimeTrackers: initialUptimeTrackers}, nil + return model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: initialFeeGrowthOutside}, nil } if err != nil { return tickStruct, err diff --git a/x/concentrated-liquidity/tick_test.go b/x/concentrated-liquidity/tick_test.go index 2f17e79f95f..fed272dccf6 100644 --- a/x/concentrated-liquidity/tick_test.go +++ b/x/concentrated-liquidity/tick_test.go @@ -282,8 +282,6 @@ func (s *KeeperTestSuite) TestInitOrUpdateTick() { func (s *KeeperTestSuite) TestGetTickInfo() { var ( preInitializedTickIndex = DefaultCurrTick.Int64() + 2 - expectedUptimes = getExpectedUptimes() - emptyUptimeTrackers = wrapUptimeTrackers(expectedUptimes.emptyExpectedAccumValues) ) tests := []struct { @@ -297,22 +295,22 @@ func (s *KeeperTestSuite) TestGetTickInfo() { name: "Get tick info on existing pool and existing tick", poolToGet: validPoolId, tickToGet: preInitializedTickIndex, - // Note that FeeGrowthOutside and UptimeGrowthOutside(s) is (are) not updated. - expectedTickInfo: model.TickInfo{LiquidityGross: DefaultLiquidityAmt, LiquidityNet: DefaultLiquidityAmt.Neg(), UptimeTrackers: emptyUptimeTrackers}, + // Note that FeeGrowthOutside is not updated. + expectedTickInfo: model.TickInfo{LiquidityGross: DefaultLiquidityAmt, LiquidityNet: DefaultLiquidityAmt.Neg()}, }, { name: "Get tick info on existing pool with no existing tick (cur pool tick > tick)", poolToGet: validPoolId, tickToGet: DefaultCurrTick.Int64() + 1, - // Note that FeeGrowthOutside and UptimeGrowthOutside(s) is (are) not initialized. - expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), UptimeTrackers: emptyUptimeTrackers}, + // Note that FeeGrowthOutside is not initialized. + expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec()}, }, { name: "Get tick info on existing pool with no existing tick (cur pool tick == tick), initialized fee growth outside", poolToGet: validPoolId, tickToGet: DefaultCurrTick.Int64(), - // Note that FeeGrowthOutside and UptimeGrowthOutside(s) is (are) initialized. - expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: sdk.NewDecCoins(oneEth), UptimeTrackers: emptyUptimeTrackers}, + // Note that FeeGrowthOutside is initialized. + expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: sdk.NewDecCoins(oneEth)}, }, { name: "Get tick info on a non-existing pool with no existing tick", @@ -342,8 +340,6 @@ func (s *KeeperTestSuite) TestGetTickInfo() { err = s.App.ConcentratedLiquidityKeeper.ChargeFee(s.Ctx, validPoolId, oneEth) s.Require().NoError(err) - // TODO: change global uptime accumulators to test that ticks are properly updated/initialized - // System under test tickInfo, err := s.App.ConcentratedLiquidityKeeper.GetTickInfo(s.Ctx, test.poolToGet, test.tickToGet) if test.expectedErr != nil { From 2961572f877a035eade48d6c9358e54b25e8d989 Mon Sep 17 00:00:00 2001 From: alpo Date: Sun, 5 Feb 2023 13:54:50 -0800 Subject: [PATCH 045/136] lint --- x/concentrated-liquidity/incentives.go | 1 + 1 file changed, 1 insertion(+) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 2603079a588..c965d4cdce2 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -69,6 +69,7 @@ func (k Keeper) getUptimeAccumulatorValues(ctx sdk.Context, poolId uint64) ([]sd return uptimeValues, nil } +// nolint: unused // getInitialUptimeGrowthOutsidesForTick returns an array of the initial values of uptime growth outside // for each supported uptime for a given tick. This value depends on the tick's location relative to the current tick. // From 19ef297a421abe251d6efe87276d4545c6e97f3d Mon Sep 17 00:00:00 2001 From: alpo Date: Sun, 5 Feb 2023 14:54:47 -0800 Subject: [PATCH 046/136] update go.mod for e2e --- go.mod | 2 +- go.sum | 4 ++-- go.work.sum | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8aa66cf6e11..fe92d53df39 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/ory/dockertest/v3 v3.9.1 github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 - github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230130075237-62557eac2673 + github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 diff --git a/go.sum b/go.sum index f4436b4dba0..84f0d472624 100644 --- a/go.sum +++ b/go.sum @@ -859,8 +859,8 @@ github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 h1:Ylmch github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3/go.mod h1:lV6KnqXYD/ayTe7310MHtM3I2q8Z6bBfMAi+bhwPYtI= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 h1:+EbINXzHQyDtHje2CND357A22H2zUpceTtwJClC9IAM= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260/go.mod h1:KrzYoNtnWUH75rj1XAsSR4nymlHFU7jeVOx7/1KMe0k= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230130075237-62557eac2673 h1:xfKQ4Lr4xwwItCS5+BehnCOs1nVJNlhLg+J4M9lG9MI= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230130075237-62557eac2673/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a h1:iak0C103qoiYVVxzvMTo+bOD8tLC/jZ2RPhbKMS5t9Q= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 h1:Ov+gyEBpU2hJkLIFAHCcQZwehCSCXFNYzqQY1zJqSXk= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8/go.mod h1:Kh2V4fLvLM4/EagRX53CYDJnILAz9NzCCETKXoH/sno= github.com/osmosis-labs/wasmd v0.29.2-0.20221222131554-7c8ea36a6e30 h1:6uMi7HhPSwvKKU7j5NqljseFTEz4I7qHr+IPnnn42Ck= diff --git a/go.work.sum b/go.work.sum index c2fdd5a606a..22c9950d4f0 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1119,6 +1119,7 @@ github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTm github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= From 3d8a86eceb6c649f43d4d08be765e264702f9ffe Mon Sep 17 00:00:00 2001 From: alpo Date: Tue, 7 Feb 2023 10:14:55 -0800 Subject: [PATCH 047/136] clean up proto and add error message --- go.mod | 2 +- .../incentive_record.proto | 8 +-- .../concentrated-liquidity/tickInfo.proto | 2 +- x/concentrated-liquidity/incentives.go | 6 +- x/concentrated-liquidity/model/tickInfo.pb.go | 61 +++++++++---------- .../types/incentive_record.pb.go | 9 +-- 6 files changed, 41 insertions(+), 47 deletions(-) diff --git a/go.mod b/go.mod index fe92d53df39..a1efec99dcc 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/CosmWasm/wasmd v0.30.0 github.com/cosmos/cosmos-proto v1.0.0-alpha8 - github.com/cosmos/cosmos-sdk v0.46.8 + github.com/cosmos/cosmos-sdk v0.46.9 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/ibc-go/v4 v4.3.0 github.com/gogo/protobuf v1.3.3 diff --git a/proto/osmosis/concentrated-liquidity/incentive_record.proto b/proto/osmosis/concentrated-liquidity/incentive_record.proto index c6e560b0322..d4c77d45e4f 100644 --- a/proto/osmosis/concentrated-liquidity/incentive_record.proto +++ b/proto/osmosis/concentrated-liquidity/incentive_record.proto @@ -1,8 +1,4 @@ syntax = "proto3"; -// This is a legacy package that requires additional migration logic -// in order to use the correct package. Decision made to use legacy package path -// until clear steps for migration logic and the unknowns for state breaking are -// investigated for changing proto package. package osmosis.concentratedliquidity.v1beta1; import "cosmos_proto/cosmos.proto"; @@ -14,8 +10,8 @@ option go_package = "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidit // IncentiveRecord represents an active perpetual incentive gauge for a pool message IncentiveRecord { - // min uptime for incentive record, will loop through and compare against - // supported uptimes + // incentive_denom is the denom of the token being distributed as part of this + // incentive record string incentive_denom = 1; // remaining_amount is the total amount of incentives to be distributed diff --git a/proto/osmosis/concentrated-liquidity/tickInfo.proto b/proto/osmosis/concentrated-liquidity/tickInfo.proto index e8d8606e66b..c538d9b12b4 100644 --- a/proto/osmosis/concentrated-liquidity/tickInfo.proto +++ b/proto/osmosis/concentrated-liquidity/tickInfo.proto @@ -27,7 +27,7 @@ message TickInfo { (gogoproto.nullable) = false ]; repeated UptimeTracker uptime_trackers = 4 [ - (gogoproto.moretags) = "yaml:\"uptime_growth_outside\"", + (gogoproto.moretags) = "yaml:\"uptime_trackers\"", (gogoproto.nullable) = false ]; } diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index c965d4cdce2..2bb8af94337 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -128,9 +128,13 @@ func (k Keeper) updateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) er timeElapsedSec := timeElapsedNanoSec.Quo(sdk.NewDec(10e8)) // If no time has elapsed, this function is a no-op - if timeElapsedSec.LTE(sdk.ZeroDec()) { + if timeElapsedSec.Equal(sdk.ZeroDec()) { return nil } + + if timeElapsedSec.LT(sdk.ZeroDec()) { + return fmt.Errorf("Time elapsed cannot be negative.") + } for uptimeIndex, uptimeAccum := range uptimeAccums { // Get relevant uptime-level values diff --git a/x/concentrated-liquidity/model/tickInfo.pb.go b/x/concentrated-liquidity/model/tickInfo.pb.go index 57d98d2c6e6..e6ef6c5accf 100644 --- a/x/concentrated-liquidity/model/tickInfo.pb.go +++ b/x/concentrated-liquidity/model/tickInfo.pb.go @@ -35,7 +35,7 @@ type TickInfo struct { LiquidityGross github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=liquidity_gross,json=liquidityGross,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"liquidity_gross" yaml:"liquidity_gross"` LiquidityNet github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=liquidity_net,json=liquidityNet,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"liquidity_net" yaml:"liquidity_net"` FeeGrowthOutside github_com_cosmos_cosmos_sdk_types.DecCoins `protobuf:"bytes,3,rep,name=fee_growth_outside,json=feeGrowthOutside,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"fee_growth_outside"` - UptimeTrackers []UptimeTracker `protobuf:"bytes,4,rep,name=uptime_trackers,json=uptimeTrackers,proto3" json:"uptime_trackers" yaml:"uptime_growth_outside"` + UptimeTrackers []UptimeTracker `protobuf:"bytes,4,rep,name=uptime_trackers,json=uptimeTrackers,proto3" json:"uptime_trackers" yaml:"uptime_trackers"` } func (m *TickInfo) Reset() { *m = TickInfo{} } @@ -139,36 +139,35 @@ func init() { } var fileDescriptor_1ccb7e45032b943a = []byte{ - // 453 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x53, 0xcf, 0x6a, 0xd4, 0x40, - 0x18, 0xdf, 0x71, 0x45, 0x74, 0xb4, 0xad, 0xc4, 0x2a, 0xb1, 0x94, 0xa4, 0x04, 0x95, 0x82, 0xec, - 0x0c, 0x6b, 0x7b, 0xf2, 0x18, 0xc5, 0xea, 0x45, 0x61, 0xa9, 0x17, 0x11, 0x96, 0x64, 0xf2, 0xed, - 0x76, 0xd8, 0x24, 0xb3, 0xcd, 0x4c, 0xaa, 0x7b, 0xf2, 0x20, 0xde, 0xbd, 0xf9, 0x0e, 0x3e, 0x49, - 0x8f, 0x3d, 0x8a, 0x87, 0x28, 0xbb, 0x4f, 0x60, 0x9f, 0x40, 0x26, 0x33, 0x8d, 0xbb, 0x45, 0x61, - 0x3d, 0xf4, 0x94, 0x7c, 0x5f, 0x7e, 0xff, 0xe6, 0xc7, 0x04, 0x77, 0x84, 0xcc, 0x84, 0xe4, 0x92, - 0x32, 0x91, 0x33, 0xc8, 0x55, 0x11, 0x29, 0x48, 0x3a, 0x29, 0x3f, 0x2c, 0x79, 0xc2, 0xd5, 0x84, - 0x2a, 0xce, 0x46, 0x2f, 0xf2, 0x81, 0x20, 0xe3, 0x42, 0x28, 0xe1, 0xdc, 0xb7, 0x70, 0x32, 0x0f, - 0x6f, 0xd0, 0xe4, 0xa8, 0x1b, 0x83, 0x8a, 0xba, 0x1b, 0x77, 0x59, 0x8d, 0xeb, 0xd7, 0x24, 0x6a, - 0x06, 0xa3, 0xb0, 0xb1, 0x3e, 0x14, 0x43, 0x61, 0xf6, 0xfa, 0xcd, 0x6e, 0x3d, 0x83, 0xa1, 0x71, - 0x24, 0x81, 0x5a, 0x15, 0xca, 0x04, 0xcf, 0xcd, 0xf7, 0xe0, 0x57, 0x1b, 0x5f, 0xdd, 0xb7, 0x51, - 0x9c, 0x43, 0xbc, 0xd6, 0x58, 0xf6, 0x87, 0x85, 0x90, 0xd2, 0x45, 0x5b, 0x68, 0xfb, 0x5a, 0xf8, - 0xfc, 0xb8, 0xf2, 0x5b, 0xdf, 0x2b, 0xff, 0xc1, 0x90, 0xab, 0x83, 0x32, 0x26, 0x4c, 0x64, 0xd6, - 0xdc, 0x3e, 0x3a, 0x32, 0x19, 0x51, 0x35, 0x19, 0x83, 0x24, 0x4f, 0x81, 0x9d, 0x56, 0xfe, 0x9d, - 0x49, 0x94, 0xa5, 0x8f, 0x83, 0x73, 0x72, 0x41, 0x6f, 0xb5, 0xd9, 0xec, 0xe9, 0x85, 0x33, 0xc2, - 0x2b, 0x7f, 0x30, 0x39, 0x28, 0xf7, 0x52, 0x6d, 0xf8, 0xec, 0xbf, 0x0d, 0xd7, 0xcf, 0x1b, 0xe6, - 0xa0, 0x82, 0xde, 0x8d, 0x66, 0x7e, 0x09, 0xca, 0xf9, 0x80, 0x9d, 0x01, 0x80, 0x8e, 0xf2, 0x4e, - 0x1d, 0xf4, 0x45, 0xa9, 0x24, 0x4f, 0xc0, 0x6d, 0x6f, 0xb5, 0xb7, 0xaf, 0x3f, 0xda, 0x24, 0xb6, - 0x4d, 0xdd, 0xd4, 0x59, 0xdf, 0x5a, 0xfb, 0x89, 0xe0, 0x79, 0xb8, 0xa3, 0xf3, 0x7c, 0xfd, 0xe1, - 0x3f, 0x5c, 0x2e, 0x8f, 0xe6, 0xc8, 0xde, 0xcd, 0x01, 0xc0, 0x5e, 0xed, 0xf5, 0xca, 0x58, 0x39, - 0x1f, 0x11, 0x5e, 0x2b, 0xc7, 0x8a, 0x67, 0xd0, 0x57, 0x45, 0xc4, 0x46, 0x50, 0x48, 0xf7, 0x72, - 0x6d, 0xbf, 0x4b, 0x96, 0xba, 0x00, 0xe4, 0x75, 0xcd, 0xde, 0x37, 0xe4, 0xf0, 0x9e, 0x8e, 0x75, - 0x5a, 0xf9, 0x9b, 0xe6, 0xf0, 0x56, 0x7a, 0xf1, 0x7c, 0x41, 0x6f, 0xb5, 0x9c, 0x27, 0xc9, 0xe0, - 0x0b, 0xc2, 0x2b, 0x0b, 0x3a, 0xce, 0x27, 0x84, 0x6f, 0xff, 0x95, 0xec, 0xa2, 0x8b, 0x2a, 0xe7, - 0x96, 0xf1, 0x5b, 0xe8, 0x27, 0x7c, 0x7b, 0x3c, 0xf5, 0xd0, 0xc9, 0xd4, 0x43, 0x3f, 0xa7, 0x1e, - 0xfa, 0x3c, 0xf3, 0x5a, 0x27, 0x33, 0xaf, 0xf5, 0x6d, 0xe6, 0xb5, 0xde, 0x84, 0x73, 0xda, 0xb6, - 0xa9, 0x4e, 0x1a, 0xc5, 0xf2, 0x6c, 0xa0, 0x47, 0xdd, 0x5d, 0xfa, 0xfe, 0x5f, 0x3f, 0x5b, 0x26, - 0x12, 0x48, 0xe3, 0x2b, 0xf5, 0x95, 0xdf, 0xf9, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xf2, 0x8b, 0x67, - 0x7b, 0x9b, 0x03, 0x00, 0x00, + // 447 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x53, 0x4d, 0x6b, 0x13, 0x41, + 0x18, 0xce, 0x18, 0x11, 0x1d, 0x6d, 0x2b, 0x6b, 0x95, 0x58, 0x64, 0x52, 0x16, 0x94, 0x82, 0x64, + 0x86, 0xd8, 0x9e, 0x3c, 0xae, 0x62, 0xf5, 0xa2, 0x10, 0xea, 0x45, 0x84, 0xb0, 0x3b, 0xfb, 0x26, + 0x1d, 0xf6, 0x63, 0xd2, 0x9d, 0xd9, 0x6a, 0x0e, 0xe2, 0xc9, 0xbb, 0x37, 0xff, 0x83, 0xbf, 0xa4, + 0xc7, 0x1e, 0xc5, 0x43, 0x94, 0xe4, 0xe6, 0xd1, 0x5f, 0x20, 0xb3, 0x33, 0xdd, 0xa6, 0x0b, 0x42, + 0x3c, 0x78, 0xda, 0x7d, 0xdf, 0x7d, 0xbe, 0x78, 0x76, 0x06, 0xf7, 0xa4, 0xca, 0xa4, 0x12, 0x8a, + 0x71, 0x99, 0x73, 0xc8, 0x75, 0x11, 0x6a, 0x88, 0x7b, 0xa9, 0x38, 0x2a, 0x45, 0x2c, 0xf4, 0x94, + 0x69, 0xc1, 0x93, 0x17, 0xf9, 0x48, 0xd2, 0x49, 0x21, 0xb5, 0xf4, 0xee, 0x3b, 0x38, 0x5d, 0x86, + 0xd7, 0x68, 0x7a, 0xdc, 0x8f, 0x40, 0x87, 0xfd, 0xad, 0xbb, 0xbc, 0xc2, 0x0d, 0x2b, 0x12, 0xb3, + 0x83, 0x55, 0xd8, 0xda, 0x1c, 0xcb, 0xb1, 0xb4, 0x7b, 0xf3, 0xe6, 0xb6, 0xc4, 0x62, 0x58, 0x14, + 0x2a, 0x60, 0x4e, 0x85, 0x71, 0x29, 0x72, 0xfb, 0xdd, 0xff, 0xd5, 0xc6, 0x57, 0x0f, 0x5c, 0x14, + 0xef, 0x08, 0x6f, 0xd4, 0x96, 0xc3, 0x71, 0x21, 0x95, 0xea, 0xa0, 0x6d, 0xb4, 0x73, 0x2d, 0x78, + 0x7e, 0x32, 0xeb, 0xb6, 0xbe, 0xcf, 0xba, 0x0f, 0xc6, 0x42, 0x1f, 0x96, 0x11, 0xe5, 0x32, 0x73, + 0xe6, 0xee, 0xd1, 0x53, 0x71, 0xc2, 0xf4, 0x74, 0x02, 0x8a, 0x3e, 0x05, 0xfe, 0x7b, 0xd6, 0xbd, + 0x33, 0x0d, 0xb3, 0xf4, 0xb1, 0xdf, 0x90, 0xf3, 0x07, 0xeb, 0xf5, 0x66, 0xdf, 0x2c, 0xbc, 0x04, + 0xaf, 0x9d, 0x63, 0x72, 0xd0, 0x9d, 0x4b, 0x95, 0xe1, 0xb3, 0x7f, 0x36, 0xdc, 0x6c, 0x1a, 0xe6, + 0xa0, 0xfd, 0xc1, 0x8d, 0x7a, 0x7e, 0x09, 0xda, 0xfb, 0x88, 0xbd, 0x11, 0x80, 0x89, 0xf2, 0x4e, + 0x1f, 0x0e, 0x65, 0xa9, 0x95, 0x88, 0xa1, 0xd3, 0xde, 0x6e, 0xef, 0x5c, 0x7f, 0x74, 0x8f, 0xba, + 0x36, 0x4d, 0x53, 0x67, 0x7d, 0x1b, 0xed, 0x27, 0x52, 0xe4, 0xc1, 0xae, 0xc9, 0xf3, 0xf5, 0x47, + 0xf7, 0xe1, 0x6a, 0x79, 0x0c, 0x47, 0x0d, 0x6e, 0x8e, 0x00, 0xf6, 0x2b, 0xaf, 0x57, 0xd6, 0xca, + 0xfb, 0x80, 0x37, 0xca, 0x89, 0x16, 0x19, 0x0c, 0x75, 0x11, 0xf2, 0x04, 0x0a, 0xd5, 0xb9, 0x5c, + 0xb9, 0xef, 0xd1, 0x95, 0xfe, 0x3f, 0x7d, 0x5d, 0xb1, 0x0f, 0x2c, 0x39, 0x20, 0x26, 0xd5, 0x79, + 0xd9, 0x0d, 0x69, 0x7f, 0xb0, 0x5e, 0x2e, 0xc3, 0x95, 0xff, 0x05, 0xe1, 0xb5, 0x0b, 0x0a, 0xde, + 0x27, 0x84, 0x6f, 0x3b, 0x5a, 0xa3, 0x15, 0xf4, 0xbf, 0x5a, 0xb9, 0x65, 0xfd, 0x2e, 0x14, 0x13, + 0xbc, 0x3d, 0x99, 0x13, 0x74, 0x3a, 0x27, 0xe8, 0xe7, 0x9c, 0xa0, 0xcf, 0x0b, 0xd2, 0x3a, 0x5d, + 0x90, 0xd6, 0xb7, 0x05, 0x69, 0xbd, 0x09, 0x96, 0xb4, 0x5d, 0x47, 0xbd, 0x34, 0x8c, 0xd4, 0xd9, + 0xc0, 0x8e, 0xfb, 0x7b, 0xec, 0xfd, 0xdf, 0x6e, 0x59, 0x26, 0x63, 0x48, 0xa3, 0x2b, 0xd5, 0x59, + 0xdf, 0xfd, 0x13, 0x00, 0x00, 0xff, 0xff, 0x93, 0xd8, 0x0c, 0x71, 0x94, 0x03, 0x00, 0x00, } func (m *TickInfo) Marshal() (dAtA []byte, err error) { diff --git a/x/concentrated-liquidity/types/incentive_record.pb.go b/x/concentrated-liquidity/types/incentive_record.pb.go index 89cbea579d0..f87edef6fc0 100644 --- a/x/concentrated-liquidity/types/incentive_record.pb.go +++ b/x/concentrated-liquidity/types/incentive_record.pb.go @@ -1,11 +1,6 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. // source: osmosis/concentrated-liquidity/incentive_record.proto -// This is a legacy package that requires additional migration logic -// in order to use the correct package. Decision made to use legacy package path -// until clear steps for migration logic and the unknowns for state breaking are -// investigated for changing proto package. - package types import ( @@ -36,8 +31,8 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // IncentiveRecord represents an active perpetual incentive gauge for a pool type IncentiveRecord struct { - // min uptime for incentive record, will loop through and compare against - // supported uptimes + // incentive_denom is the denom of the token being distributed as part of this + // incentive record IncentiveDenom string `protobuf:"bytes,1,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` // remaining_amount is the total amount of incentives to be distributed RemainingAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=remaining_amount,json=remainingAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"remaining_amount" yaml:"remaining_amount"` From 2f93b76d2a8150124fd2713045cc0b3332cec706 Mon Sep 17 00:00:00 2001 From: alpo Date: Tue, 7 Feb 2023 10:18:24 -0800 Subject: [PATCH 048/136] lint --- x/concentrated-liquidity/incentives.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 2bb8af94337..cb31d798e59 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -131,7 +131,7 @@ func (k Keeper) updateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) er if timeElapsedSec.Equal(sdk.ZeroDec()) { return nil } - + if timeElapsedSec.LT(sdk.ZeroDec()) { return fmt.Errorf("Time elapsed cannot be negative.") } From bec7d7964767b424f849c9943b8b27d1a488fef5 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 9 Feb 2023 00:13:20 -0800 Subject: [PATCH 049/136] sketch out testing approach --- x/concentrated-liquidity/incentives.go | 6 ++ x/concentrated-liquidity/lp.go | 3 + x/concentrated-liquidity/position.go | 7 ++ x/concentrated-liquidity/position_test.go | 97 ++++++++++++++++++++++- x/concentrated-liquidity/tick.go | 25 +++++- x/concentrated-liquidity/types/keys.go | 5 ++ 6 files changed, 139 insertions(+), 4 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index cb31d798e59..ebef577768e 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -166,6 +166,7 @@ func (k Keeper) updateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) er // Update pool incentive records and LastLiquidityUpdate time in state to reflect emitted incentives pool.SetPoolIncentives(poolIncentiveRecords) pool.SetLastLiquidityUpdate(ctx.BlockTime()) + fmt.Println("Set time to: ", ctx.BlockTime()) err = k.setPool(ctx, pool) if err != nil { return err @@ -213,3 +214,8 @@ func calcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, q return incentivesToAddToCurAccum, poolIncentiveRecords, nil } + +// setIncentiveRecords sets the passed in incentive records in state +func setIncentiveRecords(ctx sdk.Context, incentiveRecords []types.IncentiveRecord) { + // Need to set the pool's incentiveRecord field as well +} diff --git a/x/concentrated-liquidity/lp.go b/x/concentrated-liquidity/lp.go index 3a9765d961e..135752e7171 100644 --- a/x/concentrated-liquidity/lp.go +++ b/x/concentrated-liquidity/lp.go @@ -158,6 +158,9 @@ func (k Keeper) WithdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAd if _, err := k.collectFees(ctx, poolId, owner, lowerTick, upperTick); err != nil { return sdk.Int{}, sdk.Int{}, err } + + // TODO: claim incentives (when implemented) to clear accum record from state + if err := k.deletePosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil); err != nil { return sdk.Int{}, sdk.Int{}, err } diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 9c764fdf91d..383f17eaea7 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -65,6 +65,13 @@ func (k Keeper) initOrUpdatePosition( // TODO: consider deleting position if liquidity becomes zero + // We update accumulators _prior_ to any position-related updates to ensure + // past rewards aren't distributed to new liquidity + // TODO: AddToAccumulator for each uptime accum here using (curTime - lastTime) / getPoolById().GetLiquidity() + // TODO: update LastLiqUpdate time here (using helper w/ new set fn + setPool) + // TODO: test + k.updateUptimeAccumulatorsToNow(ctx, poolId) + // Create records for relevant uptime accumulators here. uptimeAccumulators, err := k.getUptimeAccumulators(ctx, poolId) if err != nil { diff --git a/x/concentrated-liquidity/position_test.go b/x/concentrated-liquidity/position_test.go index aa2662ac49a..4bb4b0f3e7b 100644 --- a/x/concentrated-liquidity/position_test.go +++ b/x/concentrated-liquidity/position_test.go @@ -11,7 +11,7 @@ import ( func (s *KeeperTestSuite) TestInitOrUpdatePosition() { const validPoolId = 1 - defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + // defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) type param struct { poolId uint64 lowerTick int64 @@ -25,6 +25,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { name string param param positionExists bool + timeElapsedSinceInit time.Duration expectedLiquidity sdk.Dec expectedErr error }{ @@ -36,6 +37,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { upperTick: 50, liquidityDelta: DefaultLiquidityAmt, }, + timeElapsedSinceInit: time.Hour, positionExists: false, expectedLiquidity: DefaultLiquidityAmt, }, @@ -50,6 +52,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { positionExists: true, expectedLiquidity: DefaultLiquidityAmt.Add(DefaultLiquidityAmt), }, + /* { name: "Update position from -50 to 50 that already contains DefaultLiquidityAmt liquidity with DefaultLiquidityAmt more liquidity with an hour freeze duration", param: param{ @@ -73,6 +76,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { positionExists: false, expectedErr: types.PoolNotFoundError{PoolId: 2}, }, + */ { name: "Init position from -50 to 50 with negative DefaultLiquidityAmt liquidity", param: param{ @@ -91,17 +95,48 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { // Init suite for each test. s.Setup() + // Set blocktime to fixed UTC value for consistency + s.Ctx = s.Ctx.WithBlockTime(time.Unix(0, 0).UTC()) + // Create a default CL pool - s.PrepareConcentratedPool() + clPool := s.PrepareConcentratedPool() + + // We get initial uptime accum values for comparison later + initUptimeAccumValues, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulatorValues(s.Ctx, test.param.poolId) + s.Require().NoError(err) + + // Ensure initial uptime accums are empty + s.Require().Equal(getExpectedUptimes().emptyExpectedAccumValues, initUptimeAccumValues) + + // TODO: implement setIncentiveRecord(takes in array of IncentiveRecords) & set to test.poolIncentiveRecords // If positionExists set, initialize the specified position with defaultLiquidityAmt preexistingLiquidity := sdk.ZeroDec() if test.positionExists { + // We let some fixed amount of time to elapse so we can ensure LastLiquidityUpdate time is + // tracked properly even with no liquidity. + s.Ctx = s.Ctx.WithBlockTime(s.Ctx.BlockTime().Add(time.Minute * 5)) + err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, test.param.poolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.liquidityDelta, test.param.frozenUntil) s.Require().NoError(err) preexistingLiquidity = DefaultLiquidityAmt + + // Since this is the pool's initial liquidity, uptime accums should not have increased in value + newUptimeAccumValues, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulatorValues(s.Ctx, test.param.poolId) + s.Require().NoError(err) + s.Require().Equal(initUptimeAccumValues, newUptimeAccumValues) + + // LastLiquidityUpdate time should be moved up nonetheless + clPool, err = s.App.ConcentratedLiquidityKeeper.GetPoolById(s.Ctx, clPool.GetId()) + s.Require().NoError(err) + s.Require().Equal(s.Ctx.BlockTime(), clPool.GetLastLiquidityUpdate()) } + // Move up blocktime by time we want to elapse + // We keep track of init blocktime to test error cases + initBlockTime := s.Ctx.BlockTime() + s.Ctx = s.Ctx.WithBlockTime(s.Ctx.BlockTime().Add(test.timeElapsedSinceInit)) + // Get the position info for poolId 1 positionInfo, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, validPoolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.frozenUntil) if test.positionExists { @@ -119,6 +154,16 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { if test.expectedErr != nil { s.Require().Error(err) s.Require().ErrorContains(err, test.expectedErr.Error()) + + // Uptime accumulators should not be updated upon error + newUptimeAccumValues, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulatorValues(s.Ctx, test.param.poolId) + s.Require().NoError(err) + s.Require().Equal(initUptimeAccumValues, newUptimeAccumValues) + + // LastLiquidityUpdate should not have moved up since init upon error + clPool, err = s.App.ConcentratedLiquidityKeeper.GetPoolById(s.Ctx, clPool.GetId()) + s.Require().NoError(err) + s.Require().Equal(initBlockTime, clPool.GetLastLiquidityUpdate()) return } s.Require().NoError(err) @@ -144,6 +189,54 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { } else { s.Require().False(recordExists) } + + // TODO: ensure record's init value is accum's current value (requires public GetPosition or GetPositionValue) + // TODO: ensureLastLiquidityUpdate time is moved up to now + + // TODO: consider abstracting this whole thing below into a test helper + // Ensure uptime accumulator has been moved up by the correct amount and related incentive record has been deducted + newUptimeAccumValues, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulatorValues(s.Ctx, test.param.poolId) + if test.positionExists { + // if positionExists: timeElapsed / test.param.liquidityDelta (or defaultLiquidityAmt if we make that change) + // TODO: + // - incentive records are set (will very likely need to replace old get/set fns since they don't touch state) + // - implemented uptimeGrowthToValueGrowth helper (returns DECCOINS, see use below) + // - implemented getQualifyingUptimes(frozenUntil) which tells us which of these to populate + + /* uncomment when above TODOs are completed + + // Uptime growth should be the same for all qualifying uptimes since there is only one position + uptimeGrowthForQualifying := test.param.liquidityDelta.QuoInt64(int64(test.timeElapsedSinceInit)) + + // Uptime accumulators only grow in proportion to the incentives being distributed + uptimeAccumValueGrowth := uptimeGrowthToValueGrowth(uptimeGrowth sdk.Dec, incentiveRecords []types.IncentiveRecord) + + // Might even be good to have a "populateDecCoins" helper that takes in one value and indices to add it to, but do that later + qualifyingUptimes := getQualifyingUptimes(test.param.frozenUntil) + + // If there are no incentive records, we expect this to be unchanged/empty + expectedUptimeGrowthValues := initUpinitUptimeAccumValues + if len(incentiveRecords) > 0 { + for i, _ := range initUpinitUptimeAccumValues { + if strings.Contains(qualifyingUptimes.String(), i.String()) { + expectedUptimeGrowthValues[i] = expectedUptimeGrowthValues[i].Add(uptimeAccumValueGrowth) + } + // Otherwise it remains unchanged + } + } + */ + + // Check here that incentive records have been charged (using chargeIncentive to set expected vals) + } else { + // if no position init, should be empty + s.Require().NoError(err) + s.Require().Equal(initUptimeAccumValues, newUptimeAccumValues) + } + + // Future test cases: + // - init liq qualifying for diff uptimes + // - init liq across multiple positions + // - multiple positions back to back (updateUptimeAccumsToNow does check this though) } }) } diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index dac70143ad4..d917ff99f1e 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -62,13 +62,34 @@ func (k Keeper) crossTick(ctx sdk.Context, poolId uint64, tickIndex int64) (liqu return sdk.Dec{}, err } - accum, err := k.getFeeAccumulator(ctx, poolId) + feeAccum, err := k.getFeeAccumulator(ctx, poolId) if err != nil { return sdk.Dec{}, err } // subtract tick's fee growth outside from current fee accumulator - tickInfo.FeeGrowthOutside = accum.GetValue().Sub(tickInfo.FeeGrowthOutside) + tickInfo.FeeGrowthOutside = feeAccum.GetValue().Sub(tickInfo.FeeGrowthOutside) + + /* Uncomment when TODOs below are implemented + uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) + if err != nil { + return sdk.Dec{}, err + } + */ + + // TODO: update global accums to now before uptime outside changes + // k.updateUptimeAccumulatorsToNow(ctx, poolId) + // TODO: test + + // TODO: initialize tick-level uptime trackers when initTick + // for each supported uptime, subtract tick's uptime growth outside from the respective uptime accumulator + /* + for uptimeId, uptimeAccum := range uptimeAccums { + curUptimeTracker := tickInfo.UptimeTrackers[uptimeId] + curUptimeTracker.UptimeGrowthOutside = uptimeAccum.GetValue().Sub(curUptimeTracker.UptimeGrowthOutside) + } + */ + k.SetTickInfo(ctx, poolId, tickIndex, tickInfo) return tickInfo.LiquidityNet, nil diff --git a/x/concentrated-liquidity/types/keys.go b/x/concentrated-liquidity/types/keys.go index d07d654761b..81eb5c27773 100644 --- a/x/concentrated-liquidity/types/keys.go +++ b/x/concentrated-liquidity/types/keys.go @@ -23,6 +23,7 @@ var ( TickPrefix = []byte{0x01} PositionPrefix = []byte{0x02} PoolPrefix = []byte{0x03} + IncentivePrefix = []byte{0x04} ) // TickIndexToBytes converts a tick index to a byte slice. Negative tick indexes @@ -87,3 +88,7 @@ func KeyUserPositions(addr sdk.AccAddress) []byte { func KeyPool(poolId uint64) []byte { return []byte(fmt.Sprintf("%s%d", PoolPrefix, poolId)) } + +func KeyIncentiveRecord(poolId uint64, denom string, minUptime time.Duration) []byte { + return []byte(fmt.Sprintf("%s%d%s%d", IncentivePrefix, poolId, denom, uint64(minUptime))) +} From a208eb2e8a9a01c159491120f459c398b9a51c62 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 9 Feb 2023 00:35:23 -0800 Subject: [PATCH 050/136] set up keys --- x/concentrated-liquidity/incentives.go | 5 +++++ x/concentrated-liquidity/types/keys.go | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index cb31d798e59..b463efdea01 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -213,3 +213,8 @@ func calcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, q return incentivesToAddToCurAccum, poolIncentiveRecords, nil } + +// setIncentiveRecords sets the passed in incentive records in state +func setIncentiveRecords(ctx sdk.Context, incentiveRecords []types.IncentiveRecord) { + // Need to set the pool's incentiveRecord field as well +} \ No newline at end of file diff --git a/x/concentrated-liquidity/types/keys.go b/x/concentrated-liquidity/types/keys.go index d07d654761b..4b42d8b25bf 100644 --- a/x/concentrated-liquidity/types/keys.go +++ b/x/concentrated-liquidity/types/keys.go @@ -23,6 +23,7 @@ var ( TickPrefix = []byte{0x01} PositionPrefix = []byte{0x02} PoolPrefix = []byte{0x03} + IncentivePrefix = []byte{0x04} ) // TickIndexToBytes converts a tick index to a byte slice. Negative tick indexes @@ -87,3 +88,7 @@ func KeyUserPositions(addr sdk.AccAddress) []byte { func KeyPool(poolId uint64) []byte { return []byte(fmt.Sprintf("%s%d", PoolPrefix, poolId)) } + +func KeyIncentiveRecord(poolId uint64, denom string, minUptime time.Duration) []byte { + return []byte(fmt.Sprintf("%s%d%s%d", IncentivePrefix, poolId, denom, uint64(minUptime))) +} \ No newline at end of file From 6ba992764a3d17d9ecd16bce32d3941463b25eac Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 9 Feb 2023 00:36:54 -0800 Subject: [PATCH 051/136] clean up diff --- x/concentrated-liquidity/incentives.go | 5 ----- x/concentrated-liquidity/types/keys.go | 6 +----- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index ebef577768e..31da784a972 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -214,8 +214,3 @@ func calcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, q return incentivesToAddToCurAccum, poolIncentiveRecords, nil } - -// setIncentiveRecords sets the passed in incentive records in state -func setIncentiveRecords(ctx sdk.Context, incentiveRecords []types.IncentiveRecord) { - // Need to set the pool's incentiveRecord field as well -} diff --git a/x/concentrated-liquidity/types/keys.go b/x/concentrated-liquidity/types/keys.go index 81eb5c27773..1285499ce9b 100644 --- a/x/concentrated-liquidity/types/keys.go +++ b/x/concentrated-liquidity/types/keys.go @@ -87,8 +87,4 @@ func KeyUserPositions(addr sdk.AccAddress) []byte { func KeyPool(poolId uint64) []byte { return []byte(fmt.Sprintf("%s%d", PoolPrefix, poolId)) -} - -func KeyIncentiveRecord(poolId uint64, denom string, minUptime time.Duration) []byte { - return []byte(fmt.Sprintf("%s%d%s%d", IncentivePrefix, poolId, denom, uint64(minUptime))) -} +} \ No newline at end of file From 940f0b78214a1abbb39ce9d391cfead49ab19ea5 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 9 Feb 2023 00:38:04 -0800 Subject: [PATCH 052/136] clean up comments --- x/concentrated-liquidity/incentives.go | 1 - x/concentrated-liquidity/types/keys.go | 1 - 2 files changed, 2 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 31da784a972..cb31d798e59 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -166,7 +166,6 @@ func (k Keeper) updateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) er // Update pool incentive records and LastLiquidityUpdate time in state to reflect emitted incentives pool.SetPoolIncentives(poolIncentiveRecords) pool.SetLastLiquidityUpdate(ctx.BlockTime()) - fmt.Println("Set time to: ", ctx.BlockTime()) err = k.setPool(ctx, pool) if err != nil { return err diff --git a/x/concentrated-liquidity/types/keys.go b/x/concentrated-liquidity/types/keys.go index 1285499ce9b..b45c919af90 100644 --- a/x/concentrated-liquidity/types/keys.go +++ b/x/concentrated-liquidity/types/keys.go @@ -23,7 +23,6 @@ var ( TickPrefix = []byte{0x01} PositionPrefix = []byte{0x02} PoolPrefix = []byte{0x03} - IncentivePrefix = []byte{0x04} ) // TickIndexToBytes converts a tick index to a byte slice. Negative tick indexes From e35280ea37e097b25bccc5e4e36e57a008aa49d8 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 9 Feb 2023 00:39:18 -0800 Subject: [PATCH 053/136] lint --- x/concentrated-liquidity/types/keys.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/types/keys.go b/x/concentrated-liquidity/types/keys.go index b45c919af90..d07d654761b 100644 --- a/x/concentrated-liquidity/types/keys.go +++ b/x/concentrated-liquidity/types/keys.go @@ -86,4 +86,4 @@ func KeyUserPositions(addr sdk.AccAddress) []byte { func KeyPool(poolId uint64) []byte { return []byte(fmt.Sprintf("%s%d", PoolPrefix, poolId)) -} \ No newline at end of file +} From b777ee1d9f0bc48adb0c4213a37a044b3d4758ff Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 9 Feb 2023 18:00:34 -0800 Subject: [PATCH 054/136] implement set and get for incentive records --- .../incentive_record.proto | 12 +- .../osmosis/concentrated-liquidity/pool.proto | 5 - x/concentrated-liquidity/export_test.go | 8 + x/concentrated-liquidity/incentives.go | 51 ++++++- x/concentrated-liquidity/incentives_test.go | 82 +++++++++- x/concentrated-liquidity/model/pool.go | 8 - x/concentrated-liquidity/model/pool.pb.go | 142 ++++++------------ x/concentrated-liquidity/store.go | 69 +++++++++ x/concentrated-liquidity/types/errors.go | 10 ++ .../types/incentive_record.pb.go | 122 +++++++++------ x/concentrated-liquidity/types/keys.go | 14 +- x/concentrated-liquidity/types/pool.go | 2 - 12 files changed, 345 insertions(+), 180 deletions(-) diff --git a/proto/osmosis/concentrated-liquidity/incentive_record.proto b/proto/osmosis/concentrated-liquidity/incentive_record.proto index d4c77d45e4f..b1b9674c18a 100644 --- a/proto/osmosis/concentrated-liquidity/incentive_record.proto +++ b/proto/osmosis/concentrated-liquidity/incentive_record.proto @@ -10,26 +10,28 @@ option go_package = "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidit // IncentiveRecord represents an active perpetual incentive gauge for a pool message IncentiveRecord { + uint64 poolId = 1; + // incentive_denom is the denom of the token being distributed as part of this // incentive record - string incentive_denom = 1; + string incentive_denom = 2; // remaining_amount is the total amount of incentives to be distributed - string remaining_amount = 2 [ + string remaining_amount = 3 [ (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.moretags) = "yaml:\"remaining_amount\"", (gogoproto.nullable) = false ]; // emission_rate is the incentive emission rate per second - string emission_rate = 3 [ + string emission_rate = 4 [ (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.moretags) = "yaml:\"swap_fee\"", (gogoproto.nullable) = false ]; // start_time is the time when the incentive starts distributing - google.protobuf.Timestamp start_time = 4 [ + google.protobuf.Timestamp start_time = 5 [ (gogoproto.nullable) = false, (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"start_time\"" @@ -38,7 +40,7 @@ message IncentiveRecord { // min_uptime is the minimum uptime required for liquidity to qualify for this // incentive. It should be always be one of the supported uptimes in // types.SupportedUptimes - google.protobuf.Duration min_uptime = 5 [ + google.protobuf.Duration min_uptime = 6 [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true, (gogoproto.moretags) = "yaml:\"min_uptime\"" diff --git a/proto/osmosis/concentrated-liquidity/pool.proto b/proto/osmosis/concentrated-liquidity/pool.proto index 009c35cce7f..3d6e1c24e82 100644 --- a/proto/osmosis/concentrated-liquidity/pool.proto +++ b/proto/osmosis/concentrated-liquidity/pool.proto @@ -63,9 +63,4 @@ message Pool { (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"last_liquidity_update\"" ]; - - repeated IncentiveRecord pool_incentives = 12 [ - (gogoproto.moretags) = "yaml:\"pool_incentives\"", - (gogoproto.nullable) = false - ]; } \ No newline at end of file diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index 3a095fdfd69..cac6198357e 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -168,3 +168,11 @@ func CalcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, q func (k Keeper) UpdateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) error { return k.updateUptimeAccumulatorsToNow(ctx, poolId) } + +func (k Keeper) SetIncentiveRecord(ctx sdk.Context, incentiveRecord types.IncentiveRecord) { + k.setIncentiveRecord(ctx, incentiveRecord) +} + +func (k Keeper) SetMultipleIncentiveRecords(ctx sdk.Context, incentiveRecords []types.IncentiveRecord) { + k.setMultipleIncentiveRecords(ctx, incentiveRecords) +} diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index b463efdea01..c4ab333bd7b 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -8,6 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/osmosis-labs/osmosis/osmoutils" "github.com/osmosis-labs/osmosis/osmoutils/accum" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" ) @@ -116,7 +117,11 @@ func (k Keeper) updateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) er } // Get relevant pool-level values - poolIncentiveRecords := pool.GetPoolIncentives() + poolIncentiveRecords, err := k.GetAllIncentiveRecordsForPool(ctx, poolId) + if err != nil { + return err + } + uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) if err != nil { return err @@ -164,7 +169,7 @@ func (k Keeper) updateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) er } // Update pool incentive records and LastLiquidityUpdate time in state to reflect emitted incentives - pool.SetPoolIncentives(poolIncentiveRecords) + k.setMultipleIncentiveRecords(ctx, poolIncentiveRecords) pool.SetLastLiquidityUpdate(ctx.BlockTime()) err = k.setPool(ctx, pool) if err != nil { @@ -214,7 +219,43 @@ func calcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, q return incentivesToAddToCurAccum, poolIncentiveRecords, nil } +// nolint: unused // setIncentiveRecords sets the passed in incentive records in state -func setIncentiveRecords(ctx sdk.Context, incentiveRecords []types.IncentiveRecord) { - // Need to set the pool's incentiveRecord field as well -} \ No newline at end of file +func (k Keeper) setIncentiveRecord(ctx sdk.Context, incentiveRecord types.IncentiveRecord) { + // Potentially need to set the pool's incentiveRecord field as well + store := ctx.KVStore(k.storeKey) + key := types.KeyIncentiveRecord(incentiveRecord.PoolId, incentiveRecord.IncentiveDenom, incentiveRecord.MinUptime) + osmoutils.MustSet(store, key, &incentiveRecord) +} + +// nolint: unused +// setIncentiveRecords sets the passed in incentive records in state +func (k Keeper) setMultipleIncentiveRecords(ctx sdk.Context, incentiveRecords []types.IncentiveRecord) { + for _, incentiveRecord := range incentiveRecords { + k.setIncentiveRecord(ctx, incentiveRecord) + } +} + +// GetIncentiveRecord gets the incentive record corresponding to the passed in values from store +func (k Keeper) GetIncentiveRecord(ctx sdk.Context, poolId uint64, denom string, minUptime time.Duration) (types.IncentiveRecord, error) { + store := ctx.KVStore(k.storeKey) + incentiveStruct := types.IncentiveRecord{} + key := types.KeyIncentiveRecord(poolId, denom, minUptime) + + found, err := osmoutils.Get(store, key, &incentiveStruct) + if err != nil { + return types.IncentiveRecord{}, err + } + + if !found { + return types.IncentiveRecord{}, types.IncentiveRecordNotFoundError{PoolId: poolId, IncentiveDenom: denom, MinUptime: minUptime} + } + + return incentiveStruct, nil +} + +// GetAllIncentiveRecordsForPool gets all the incentive records for poolId +// Returns error if it is unable to retrieve +func (k Keeper) GetAllIncentiveRecordsForPool(ctx sdk.Context, poolId uint64) ([]types.IncentiveRecord, error) { + return osmoutils.GatherValuesFromStorePrefixWithKeyParser(ctx.KVStore(k.storeKey), types.KeyPoolIncentiveRecords(poolId), ParseFullIncentiveRecordFromBz) +} diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index eec6b21845c..53c1a8a8ff8 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -19,6 +19,7 @@ var ( testAccumOne = "testAccumOne" + // Note: lexicographic order is denomFour, denomOne, denomThree, denomTwo testDenomOne = "denomOne" testDenomTwo = "denomTwo" testDenomThree = "denomThree" @@ -41,6 +42,7 @@ var ( testUptimeFour = types.SupportedUptimes[3] incentiveRecordOne = types.IncentiveRecord{ + PoolId: validPoolId, IncentiveDenom: testDenomOne, RemainingAmount: defaultIncentiveAmount, EmissionRate: testEmissionOne, @@ -49,6 +51,7 @@ var ( } incentiveRecordTwo = types.IncentiveRecord{ + PoolId: validPoolId, IncentiveDenom: testDenomTwo, RemainingAmount: defaultIncentiveAmount, EmissionRate: testEmissionTwo, @@ -57,6 +60,7 @@ var ( } incentiveRecordThree = types.IncentiveRecord{ + PoolId: validPoolId, IncentiveDenom: testDenomThree, RemainingAmount: defaultIncentiveAmount, EmissionRate: testEmissionThree, @@ -65,6 +69,7 @@ var ( } incentiveRecordFour = types.IncentiveRecord{ + PoolId: validPoolId, IncentiveDenom: testDenomFour, RemainingAmount: defaultIncentiveAmount, EmissionRate: testEmissionFour, @@ -496,9 +501,10 @@ func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { expectedIncentiveRecords: []types.IncentiveRecord{ // We deduct incentives from each record since there are positions for all three + // Note that records are ordered lexicographically by denom in state chargeIncentive(incentiveRecordOne, time.Hour), - chargeIncentive(incentiveRecordTwo, time.Hour), chargeIncentive(incentiveRecordThree, time.Hour), + chargeIncentive(incentiveRecordTwo, time.Hour), }, expectedPass: true, }, @@ -509,10 +515,11 @@ func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { expectedIncentiveRecords: []types.IncentiveRecord{ // We only deduct from the first three incentive records since the last doesn't emit anything + // Note that records are ordered lexicographically by denom in state + incentiveRecordFour, chargeIncentive(incentiveRecordOne, time.Hour), - chargeIncentive(incentiveRecordTwo, time.Hour), chargeIncentive(incentiveRecordThree, time.Hour), - incentiveRecordFour, + chargeIncentive(incentiveRecordTwo, time.Hour), }, expectedPass: true, }, @@ -529,8 +536,7 @@ func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { clPool := s.PrepareConcentratedPool() // Initialize test incentives on the pool - clPool.SetPoolIncentives(tc.poolIncentiveRecords) - clKeeper.SetPool(s.Ctx, clPool) + clKeeper.SetMultipleIncentiveRecords(s.Ctx, tc.poolIncentiveRecords) // Get initial uptime accum values for comparison initUptimeAccumValues, err := clKeeper.GetUptimeAccumulatorValues(s.Ctx, tc.poolId) @@ -593,12 +599,74 @@ func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { // Ensure that LastLiquidityUpdate field is updated for pool s.Require().Equal(s.Ctx.BlockTime(), clPool.GetLastLiquidityUpdate()) - // Ensure that pool's IncentiveRecords are updated to reflect emitted incentives - s.Require().Equal(tc.expectedIncentiveRecords, clPool.GetPoolIncentives()) + updatedIncentiveRecords, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, tc.poolId) + s.Require().NoError(err) + s.Require().Equal(tc.expectedIncentiveRecords, updatedIncentiveRecords) } else { s.Require().Error(err) } }) } } + +// Note: we test that incentive records are properly deducted by emissions in the `TestUpdateUptimeAccumulatorsToNow` above +func (s *KeeperTestSuite) TestIncentiveRecordsSetAndGet() { + s.SetupTest() + clKeeper := s.App.ConcentratedLiquidityKeeper + s.Ctx = s.Ctx.WithBlockTime(defaultStartTime) + emptyIncentiveRecords := []types.IncentiveRecord{} + + // Set up test pool + clPoolOne := s.PrepareConcentratedPool() + + // Set up second pool for reference + clPoolTwo := s.PrepareConcentratedPool() + + // Ensure both pools start with no incentive records + poolOneRecords, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolOne.GetId()) + s.Require().NoError(err) + s.Require().Equal(emptyIncentiveRecords, poolOneRecords) + + poolTwoRecords, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolTwo.GetId()) + s.Require().NoError(err) + s.Require().Equal(emptyIncentiveRecords, poolTwoRecords) + + // Ensure setting and getting a single record works with single Get and GetAll + clKeeper.SetIncentiveRecord(s.Ctx, incentiveRecordOne) + poolOneRecord, err := clKeeper.GetIncentiveRecord(s.Ctx, clPoolOne.GetId(), incentiveRecordOne.IncentiveDenom, incentiveRecordOne.MinUptime) + s.Require().NoError(err) + s.Require().Equal(incentiveRecordOne, poolOneRecord) + allRecordsPoolOne, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolOne.GetId()) + s.Require().NoError(err) + s.Require().Equal([]types.IncentiveRecord{incentiveRecordOne}, allRecordsPoolOne) + + // Ensure records for other pool remain unchanged + _, err = clKeeper.GetIncentiveRecord(s.Ctx, clPoolTwo.GetId(), incentiveRecordOne.IncentiveDenom, incentiveRecordOne.MinUptime) + s.Require().Error(err) + allRecordsPoolTwo, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolTwo.GetId()) + s.Require().NoError(err) + s.Require().Equal(emptyIncentiveRecords, allRecordsPoolTwo) + + // Ensure directly setting additional records don't overwrite previous ones + clKeeper.SetIncentiveRecord(s.Ctx, incentiveRecordTwo) + poolOneRecord, err = clKeeper.GetIncentiveRecord(s.Ctx, clPoolOne.GetId(), incentiveRecordTwo.IncentiveDenom, incentiveRecordTwo.MinUptime) + s.Require().NoError(err) + s.Require().Equal(incentiveRecordTwo, poolOneRecord) + allRecordsPoolOne, err = clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolOne.GetId()) + s.Require().NoError(err) + s.Require().Equal([]types.IncentiveRecord{incentiveRecordOne, incentiveRecordTwo}, allRecordsPoolOne) + + // Ensure setting multiple records through helper functions as expected + clKeeper.SetMultipleIncentiveRecords(s.Ctx, []types.IncentiveRecord{incentiveRecordThree, incentiveRecordFour}) + + // Note: we expect the records to be retrieved in lexicographic order by denom + allRecordsPoolOne, err = clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolOne.GetId()) + s.Require().NoError(err) + s.Require().Equal([]types.IncentiveRecord{incentiveRecordFour, incentiveRecordOne, incentiveRecordThree, incentiveRecordTwo}, allRecordsPoolOne) + + // Finally, we ensure the second pool remains unaffected + allRecordsPoolTwo, err = clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolTwo.GetId()) + s.Require().NoError(err) + s.Require().Equal(emptyIncentiveRecords, allRecordsPoolTwo) +} diff --git a/x/concentrated-liquidity/model/pool.go b/x/concentrated-liquidity/model/pool.go index b58b6fcc6ae..dfeaac47af0 100644 --- a/x/concentrated-liquidity/model/pool.go +++ b/x/concentrated-liquidity/model/pool.go @@ -156,10 +156,6 @@ func (p Pool) GetLastLiquidityUpdate() time.Time { return p.LastLiquidityUpdate } -func (p Pool) GetPoolIncentives() []types.IncentiveRecord { - return p.PoolIncentives -} - func (p Pool) GetType() poolmanagertypes.PoolType { return poolmanagertypes.Concentrated } @@ -184,10 +180,6 @@ func (p *Pool) SetLastLiquidityUpdate(newTime time.Time) { p.LastLiquidityUpdate = newTime } -func (p *Pool) SetPoolIncentives(updatedRecords []types.IncentiveRecord) { - p.PoolIncentives = updatedRecords -} - // updateLiquidityIfActivePosition updates the pool's liquidity if the position is active. // Returns true if updated, false otherwise. // TODO: add tests. diff --git a/x/concentrated-liquidity/model/pool.pb.go b/x/concentrated-liquidity/model/pool.pb.go index ad0d3d48cbc..abdc73e85e6 100644 --- a/x/concentrated-liquidity/model/pool.pb.go +++ b/x/concentrated-liquidity/model/pool.pb.go @@ -16,7 +16,7 @@ import ( proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - types1 "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" + _ "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" io "io" math "math" math_bits "math/bits" @@ -52,8 +52,7 @@ type Pool struct { SwapFee github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,10,opt,name=swap_fee,json=swapFee,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"swap_fee" yaml:"swap_fee"` // last_liquidity_update is the last time either the pool liquidity or the // active tick changed - LastLiquidityUpdate time.Time `protobuf:"bytes,11,opt,name=last_liquidity_update,json=lastLiquidityUpdate,proto3,stdtime" json:"last_liquidity_update" yaml:"last_liquidity_update"` - PoolIncentives []types1.IncentiveRecord `protobuf:"bytes,12,rep,name=pool_incentives,json=poolIncentives,proto3" json:"pool_incentives" yaml:"pool_incentives"` + LastLiquidityUpdate time.Time `protobuf:"bytes,11,opt,name=last_liquidity_update,json=lastLiquidityUpdate,proto3,stdtime" json:"last_liquidity_update" yaml:"last_liquidity_update"` } func (m *Pool) Reset() { *m = Pool{} } @@ -97,49 +96,46 @@ func init() { } var fileDescriptor_3526ea5373d96c9a = []byte{ - // 662 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x4b, 0x6f, 0xd3, 0x4c, - 0x14, 0x8d, 0xfb, 0x4a, 0x3b, 0xa9, 0xfa, 0x98, 0x7e, 0x5f, 0x71, 0x2b, 0xb0, 0x23, 0x0b, 0x50, - 0x90, 0x88, 0x4d, 0xca, 0x63, 0xd1, 0x5d, 0x0d, 0x54, 0xaa, 0x84, 0x44, 0xe5, 0x16, 0x16, 0xa8, - 0x92, 0x71, 0xc6, 0xd3, 0x74, 0x14, 0xc7, 0xe3, 0x78, 0x26, 0xa5, 0x5d, 0xb1, 0x65, 0xd9, 0x65, - 0x97, 0xfd, 0x11, 0xfc, 0x88, 0x8a, 0x55, 0x97, 0x88, 0x45, 0x40, 0xed, 0x3f, 0xc8, 0x82, 0x35, - 0x9a, 0xf1, 0xd8, 0x0d, 0x12, 0xaf, 0xac, 0xec, 0x7b, 0xee, 0xbd, 0xe7, 0x1c, 0xdf, 0xf1, 0x1d, - 0x70, 0x8f, 0xb2, 0x0e, 0x65, 0x84, 0x39, 0x88, 0xc6, 0x08, 0xc7, 0x3c, 0x0d, 0x38, 0x0e, 0xeb, - 0x11, 0xe9, 0xf6, 0x48, 0x48, 0xf8, 0xb1, 0x93, 0x50, 0x1a, 0xd9, 0x49, 0x4a, 0x39, 0x85, 0x77, - 0x54, 0xa9, 0x3d, 0x5c, 0x5a, 0x54, 0xda, 0x87, 0x8d, 0x26, 0xe6, 0x41, 0x63, 0x75, 0x05, 0xc9, - 0x3a, 0x5f, 0x36, 0x39, 0x59, 0x90, 0x31, 0xac, 0xfe, 0xd7, 0xa2, 0x2d, 0x9a, 0xe1, 0xe2, 0x4d, - 0xa1, 0x66, 0x8b, 0xd2, 0x56, 0x84, 0x1d, 0x19, 0x35, 0x7b, 0xfb, 0x0e, 0x27, 0x1d, 0xcc, 0x78, - 0xd0, 0x49, 0x54, 0xc1, 0xe3, 0xbf, 0x78, 0x24, 0x12, 0x25, 0x87, 0xd8, 0x4f, 0x31, 0xa2, 0x69, - 0x98, 0xb5, 0x59, 0xdf, 0xcb, 0x60, 0x62, 0x9b, 0xd2, 0x08, 0xde, 0x07, 0xe5, 0x20, 0x0c, 0x53, - 0xcc, 0x98, 0xae, 0x55, 0xb5, 0xda, 0x8c, 0x0b, 0x07, 0x7d, 0x73, 0xee, 0x38, 0xe8, 0x44, 0xeb, - 0x96, 0x4a, 0x58, 0x5e, 0x5e, 0x02, 0xe7, 0xc0, 0x18, 0x09, 0xf5, 0xb1, 0xaa, 0x56, 0x9b, 0xf0, - 0xc6, 0x48, 0x08, 0xdf, 0x82, 0x99, 0x42, 0x4a, 0x1f, 0x97, 0xfd, 0xee, 0x79, 0xdf, 0x2c, 0x7d, - 0xe9, 0x9b, 0x77, 0x5b, 0x84, 0x1f, 0xf4, 0x9a, 0x36, 0xa2, 0x1d, 0xf5, 0xa1, 0xea, 0x51, 0x67, - 0x61, 0xdb, 0xe1, 0xc7, 0x09, 0x66, 0xf6, 0x33, 0x8c, 0x06, 0x7d, 0x73, 0x21, 0x53, 0x2b, 0x88, - 0x2c, 0xef, 0x9a, 0x14, 0x2e, 0x83, 0x29, 0x4e, 0xdb, 0x38, 0x7e, 0xa0, 0x4f, 0x08, 0x7a, 0x4f, - 0x45, 0x05, 0xde, 0xd0, 0x27, 0x87, 0xf0, 0x06, 0xec, 0x02, 0x88, 0x7a, 0x69, 0x8a, 0x63, 0xee, - 0xb3, 0x6e, 0xca, 0xfd, 0x24, 0x25, 0x08, 0xeb, 0x53, 0xd2, 0xda, 0xd3, 0x91, 0xad, 0x2d, 0x66, - 0xd6, 0x58, 0x42, 0x15, 0x93, 0xe5, 0x2d, 0x28, 0xfa, 0x9d, 0x6e, 0xca, 0xb7, 0x05, 0x04, 0x0f, - 0xc0, 0x6c, 0x2e, 0xc9, 0x09, 0x6a, 0xeb, 0x65, 0x29, 0xf6, 0x7c, 0x04, 0xb1, 0xad, 0x98, 0x0f, - 0xfa, 0xe6, 0x52, 0x26, 0x36, 0xcc, 0x65, 0x79, 0x15, 0x15, 0xee, 0x12, 0xd4, 0x86, 0xeb, 0x60, - 0x56, 0xa0, 0x3e, 0x4b, 0x02, 0x44, 0xe2, 0x96, 0x3e, 0x2d, 0x0e, 0xc2, 0xbd, 0x71, 0xdd, 0x3b, - 0x9c, 0xb5, 0xbc, 0x8a, 0x08, 0x77, 0xb2, 0x08, 0x9e, 0x6a, 0xe0, 0x56, 0x92, 0x62, 0x44, 0x18, - 0xa1, 0xb1, 0xbf, 0x1f, 0x20, 0x4e, 0x53, 0x3f, 0x50, 0x9f, 0xe5, 0xd3, 0x18, 0xeb, 0x33, 0xd2, - 0xf7, 0xeb, 0x91, 0x7d, 0xdf, 0xce, 0xb4, 0xff, 0x48, 0x6e, 0x79, 0x2b, 0x45, 0x7e, 0x53, 0xa6, - 0x37, 0xb2, 0xe9, 0xbd, 0x8c, 0x31, 0xdc, 0x03, 0xd3, 0xec, 0x5d, 0x90, 0xf8, 0xfb, 0x18, 0xeb, - 0x40, 0x9a, 0xd8, 0x18, 0xf9, 0xa4, 0xe6, 0xd5, 0x49, 0x29, 0x1e, 0xcb, 0x2b, 0x8b, 0xd7, 0x4d, - 0x8c, 0xe1, 0x11, 0xf8, 0x3f, 0x0a, 0x18, 0xf7, 0x8b, 0x7f, 0xca, 0xef, 0x25, 0x61, 0xc0, 0xb1, - 0x5e, 0xa9, 0x6a, 0xb5, 0xca, 0xda, 0xaa, 0x9d, 0xad, 0x98, 0x9d, 0xaf, 0x98, 0xbd, 0x9b, 0xaf, - 0x98, 0x5b, 0x13, 0x36, 0x06, 0x7d, 0xf3, 0xa6, 0xfa, 0x43, 0x7f, 0x45, 0x63, 0x9d, 0x7c, 0x35, - 0x35, 0x6f, 0x49, 0xe4, 0x5e, 0xe4, 0xa9, 0x57, 0x32, 0x03, 0xdf, 0x83, 0x79, 0x71, 0x45, 0xf8, - 0xc5, 0x0e, 0x32, 0x7d, 0xb6, 0x3a, 0x5e, 0xab, 0xac, 0x3d, 0xb1, 0xff, 0xe9, 0xba, 0xb0, 0xb7, - 0xf2, 0x46, 0x4f, 0xee, 0xae, 0x6b, 0x28, 0x3f, 0xcb, 0x6a, 0xe2, 0x3f, 0x93, 0x5b, 0xde, 0x9c, - 0x40, 0x8a, 0x26, 0xb6, 0xbe, 0xf8, 0xe1, 0xcc, 0x2c, 0x9d, 0x9e, 0x99, 0xa5, 0x4f, 0x1f, 0xeb, - 0x93, 0x62, 0xdd, 0xb7, 0xdc, 0xbd, 0xf3, 0x4b, 0x43, 0xbb, 0xb8, 0x34, 0xb4, 0x6f, 0x97, 0x86, - 0x76, 0x72, 0x65, 0x94, 0x2e, 0xae, 0x8c, 0xd2, 0xe7, 0x2b, 0xa3, 0xf4, 0xc6, 0x1d, 0x9a, 0xb5, - 0xb2, 0x57, 0x8f, 0x82, 0x26, 0xcb, 0x03, 0xe7, 0xb0, 0xf1, 0xc8, 0x39, 0xfa, 0xdd, 0x3d, 0xd3, - 0xa1, 0x21, 0x8e, 0x9a, 0x53, 0x72, 0x88, 0x0f, 0x7f, 0x04, 0x00, 0x00, 0xff, 0xff, 0x5f, 0xdd, - 0x26, 0x5b, 0x3a, 0x05, 0x00, 0x00, + // 617 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0xcd, 0x4e, 0xdb, 0x4c, + 0x14, 0x8d, 0xf9, 0x20, 0xc0, 0x04, 0xf1, 0xc1, 0xd0, 0x1f, 0x83, 0xda, 0x18, 0x59, 0x6d, 0x95, + 0x4a, 0x8d, 0xdd, 0xf4, 0x67, 0xc3, 0x8e, 0xb4, 0x45, 0x42, 0xaa, 0x54, 0x64, 0x68, 0x17, 0x15, + 0x92, 0x3b, 0x19, 0x0f, 0x61, 0x14, 0xdb, 0xe3, 0xcc, 0x4c, 0x28, 0xbc, 0x41, 0x97, 0x2c, 0x59, + 0xf2, 0x10, 0x7d, 0x08, 0xd4, 0x15, 0xcb, 0xaa, 0x0b, 0xb7, 0x22, 0x6f, 0x10, 0xa9, 0xfb, 0xca, + 0xe3, 0xb1, 0xc9, 0xa2, 0x3f, 0xca, 0xca, 0x73, 0xef, 0xb9, 0xf7, 0x9c, 0x73, 0x3d, 0x73, 0xc1, + 0x43, 0x26, 0x22, 0x26, 0xa8, 0x70, 0x31, 0x8b, 0x31, 0x89, 0x25, 0x47, 0x92, 0x04, 0xcd, 0x90, + 0xf6, 0x07, 0x34, 0xa0, 0xf2, 0xc4, 0x4d, 0x18, 0x0b, 0x9d, 0x84, 0x33, 0xc9, 0xe0, 0x7d, 0x5d, + 0xea, 0x8c, 0x97, 0x96, 0x95, 0xce, 0x51, 0xab, 0x43, 0x24, 0x6a, 0xad, 0xad, 0x62, 0x55, 0xe7, + 0xab, 0x26, 0x37, 0x0f, 0x72, 0x86, 0xb5, 0x1b, 0x5d, 0xd6, 0x65, 0x79, 0x3e, 0x3b, 0xe9, 0xac, + 0xd5, 0x65, 0xac, 0x1b, 0x12, 0x57, 0x45, 0x9d, 0xc1, 0x81, 0x2b, 0x69, 0x44, 0x84, 0x44, 0x51, + 0xa2, 0x0b, 0x9e, 0xff, 0xc3, 0x23, 0x55, 0x59, 0x7a, 0x44, 0x7c, 0x4e, 0x30, 0xe3, 0x41, 0xde, + 0x66, 0xff, 0xac, 0x82, 0xe9, 0x1d, 0xc6, 0x42, 0xf8, 0x08, 0xcc, 0xa2, 0x20, 0xe0, 0x44, 0x08, + 0xd3, 0x58, 0x37, 0x1a, 0xf3, 0x6d, 0x38, 0x4a, 0xad, 0xc5, 0x13, 0x14, 0x85, 0x1b, 0xb6, 0x06, + 0x6c, 0xaf, 0x28, 0x81, 0x8b, 0x60, 0x8a, 0x06, 0xe6, 0xd4, 0xba, 0xd1, 0x98, 0xf6, 0xa6, 0x68, + 0x00, 0x3f, 0x80, 0xf9, 0x52, 0xca, 0xfc, 0x4f, 0xf5, 0xb7, 0x2f, 0x52, 0xab, 0xf2, 0x2d, 0xb5, + 0x1e, 0x74, 0xa9, 0x3c, 0x1c, 0x74, 0x1c, 0xcc, 0x22, 0x3d, 0xa8, 0xfe, 0x34, 0x45, 0xd0, 0x73, + 0xe5, 0x49, 0x42, 0x84, 0xf3, 0x92, 0xe0, 0x51, 0x6a, 0x2d, 0xe5, 0x6a, 0x25, 0x91, 0xed, 0x5d, + 0x93, 0xc2, 0x5b, 0xa0, 0x2a, 0x59, 0x8f, 0xc4, 0x8f, 0xcd, 0xe9, 0x8c, 0xde, 0xd3, 0x51, 0x99, + 0x6f, 0x99, 0x33, 0x63, 0xf9, 0x16, 0xec, 0x03, 0x88, 0x07, 0x9c, 0x93, 0x58, 0xfa, 0xa2, 0xcf, + 0xa5, 0x9f, 0x70, 0x8a, 0x89, 0x59, 0x55, 0xd6, 0x5e, 0x4c, 0x6c, 0x6d, 0x39, 0xb7, 0x26, 0x12, + 0xa6, 0x99, 0x6c, 0x6f, 0x49, 0xd3, 0xef, 0xf6, 0xb9, 0xdc, 0xc9, 0x52, 0xf0, 0x10, 0x2c, 0x14, + 0x92, 0x92, 0xe2, 0x9e, 0x39, 0xab, 0xc4, 0x5e, 0x4d, 0x20, 0xb6, 0x1d, 0xcb, 0x51, 0x6a, 0xad, + 0xe4, 0x62, 0xe3, 0x5c, 0xb6, 0x57, 0xd3, 0xe1, 0x1e, 0xc5, 0x3d, 0xb8, 0x01, 0x16, 0xb2, 0xac, + 0x2f, 0x12, 0x84, 0x69, 0xdc, 0x35, 0xe7, 0xb2, 0x8b, 0x68, 0xdf, 0xbe, 0xee, 0x1d, 0x47, 0x6d, + 0xaf, 0x96, 0x85, 0xbb, 0x79, 0x04, 0xcf, 0x0c, 0x70, 0x37, 0xe1, 0x04, 0x53, 0x41, 0x59, 0xec, + 0x1f, 0x20, 0x2c, 0x19, 0xf7, 0x91, 0x1e, 0xcb, 0x67, 0x31, 0x31, 0xe7, 0x95, 0xef, 0x77, 0x13, + 0xfb, 0xbe, 0x97, 0x6b, 0xff, 0x95, 0xdc, 0xf6, 0x56, 0x4b, 0x7c, 0x4b, 0xc1, 0x9b, 0xf9, 0xdf, + 0x7b, 0x13, 0x13, 0xb8, 0x0f, 0xe6, 0xc4, 0x47, 0x94, 0xf8, 0x07, 0x84, 0x98, 0x40, 0x99, 0xd8, + 0x9c, 0xf8, 0xa6, 0xfe, 0xd7, 0x37, 0xa5, 0x79, 0x6c, 0x6f, 0x36, 0x3b, 0x6e, 0x11, 0x02, 0x8f, + 0xc1, 0xcd, 0x10, 0x09, 0xe9, 0x97, 0x6f, 0xca, 0x1f, 0x24, 0x01, 0x92, 0xc4, 0xac, 0xad, 0x1b, + 0x8d, 0xda, 0x93, 0x35, 0x27, 0x5f, 0x31, 0xa7, 0x58, 0x31, 0x67, 0xaf, 0x58, 0xb1, 0x76, 0x23, + 0xb3, 0x31, 0x4a, 0xad, 0x3b, 0xfa, 0x85, 0xfe, 0x8e, 0xc6, 0x3e, 0xfd, 0x6e, 0x19, 0xde, 0x4a, + 0x86, 0xbd, 0x2e, 0xa0, 0xb7, 0x0a, 0xd9, 0x58, 0xfe, 0x74, 0x6e, 0x55, 0xce, 0xce, 0xad, 0xca, + 0x97, 0xcf, 0xcd, 0x99, 0x6c, 0xdb, 0xb6, 0xdb, 0xfb, 0x17, 0x57, 0x75, 0xe3, 0xf2, 0xaa, 0x6e, + 0xfc, 0xb8, 0xaa, 0x1b, 0xa7, 0xc3, 0x7a, 0xe5, 0x72, 0x58, 0xaf, 0x7c, 0x1d, 0xd6, 0x2b, 0xef, + 0xdb, 0x63, 0xa3, 0xea, 0x9d, 0x6e, 0x86, 0xa8, 0x23, 0x8a, 0xc0, 0x3d, 0x6a, 0x3d, 0x73, 0x8f, + 0xff, 0xb4, 0xe6, 0x11, 0x0b, 0x48, 0xd8, 0xa9, 0xaa, 0x19, 0x9e, 0xfe, 0x0a, 0x00, 0x00, 0xff, + 0xff, 0x83, 0x74, 0xf1, 0xd0, 0xb9, 0x04, 0x00, 0x00, } func (m *Pool) Marshal() (dAtA []byte, err error) { @@ -162,20 +158,6 @@ func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.PoolIncentives) > 0 { - for iNdEx := len(m.PoolIncentives) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.PoolIncentives[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintPool(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x62 - } - } n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastLiquidityUpdate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastLiquidityUpdate):]) if err1 != nil { return 0, err1 @@ -315,12 +297,6 @@ func (m *Pool) Size() (n int) { n += 1 + l + sovPool(uint64(l)) l = github_com_gogo_protobuf_types.SizeOfStdTime(m.LastLiquidityUpdate) n += 1 + l + sovPool(uint64(l)) - if len(m.PoolIncentives) > 0 { - for _, e := range m.PoolIncentives { - l = e.Size() - n += 1 + l + sovPool(uint64(l)) - } - } return n } @@ -696,40 +672,6 @@ func (m *Pool) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 12: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolIncentives", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PoolIncentives = append(m.PoolIncentives, types1.IncentiveRecord{}) - if err := m.PoolIncentives[len(m.PoolIncentives)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPool(dAtA[iNdEx:]) diff --git a/x/concentrated-liquidity/store.go b/x/concentrated-liquidity/store.go index 11b9af6a238..da4faa5e8d5 100644 --- a/x/concentrated-liquidity/store.go +++ b/x/concentrated-liquidity/store.go @@ -5,6 +5,7 @@ import ( "fmt" "strconv" "strings" + "time" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/gogo/protobuf/proto" @@ -101,3 +102,71 @@ func ParseFullPositionFromBytes(key, value []byte) (types.FullPositionByOwnerRes Liquidity: positionValue.Liquidity, }, nil } + +// ParseFullIncentiveRecordFromBz parses a IncentiveRecord from a byte array. +// Returns a struct containing the denom and min uptime associated with the incentive record. +// Returns an error if the byte array is empty. +// Returns an error if fails to parse. +func ParseIncentiveRecordFromBz(bz []byte) (incentiveRecord types.IncentiveRecord, err error) { + if len(bz) == 0 { + return types.IncentiveRecord{}, errors.New("incentive record not found") + } + err = proto.Unmarshal(bz, &incentiveRecord) + return incentiveRecord, err +} + +// ParseIncentiveRecordFromBz parses an incentive record from a byte array. +// Returns a struct containing the state associated with the incentive. +// Returns an error if the byte array is empty. +// Returns an error if fails to parse. +func ParseFullIncentiveRecordFromBz(key []byte, value []byte) (incentiveRecord types.IncentiveRecord, err error) { + if len(key) == 0 { + return types.IncentiveRecord{}, errors.New("key not found") + } + if len(value) == 0 { + return types.IncentiveRecord{}, fmt.Errorf("value not found for key (%s)", value) + } + + keyStr := string(key) + + // These may include irrelevant parts of the prefix such as the module prefix. + incentiveRecordKeyComponents := strings.Split(keyStr, types.KeySeparator) + + // We only care about the last 3 components, which are: + // - pool id + // - incentive denom + // - min uptime + + relevantIncentiveKeyComponents := incentiveRecordKeyComponents[len(incentiveRecordKeyComponents)-3:] + + incentivePrefix := incentiveRecordKeyComponents[0] + if incentivePrefix != string(types.IncentivePrefix) { + return types.IncentiveRecord{}, fmt.Errorf("Wrong incentive prefix, got: %v, required %v", []byte(incentivePrefix), types.IncentivePrefix) + } + + poolId, err := strconv.ParseUint(relevantIncentiveKeyComponents[0], 10, 64) + if err != nil { + return types.IncentiveRecord{}, err + } + + incentiveDenom := relevantIncentiveKeyComponents[1] + + minUptime, err := strconv.ParseUint(relevantIncentiveKeyComponents[2], 10, 64) + if err != nil { + return types.IncentiveRecord{}, err + } + + incentiveValue, err := ParseIncentiveRecordFromBz(value) + if err != nil { + return types.IncentiveRecord{}, err + } + + return types.IncentiveRecord{ + PoolId: poolId, + IncentiveDenom: incentiveDenom, + RemainingAmount: incentiveValue.RemainingAmount, + EmissionRate: incentiveValue.EmissionRate, + StartTime: incentiveValue.StartTime, + MinUptime: time.Duration(minUptime), + }, nil +} diff --git a/x/concentrated-liquidity/types/errors.go b/x/concentrated-liquidity/types/errors.go index 8c126372ef0..f128fdcc938 100644 --- a/x/concentrated-liquidity/types/errors.go +++ b/x/concentrated-liquidity/types/errors.go @@ -223,3 +223,13 @@ type PositionStillFrozenError struct { func (e PositionStillFrozenError) Error() string { return fmt.Sprintf("position is still frozen until %s", e.FrozenUntil) } + +type IncentiveRecordNotFoundError struct { + PoolId uint64 + IncentiveDenom string + MinUptime time.Duration +} + +func (e IncentiveRecordNotFoundError) Error() string { + return fmt.Sprintf("incentive record not found. pool id (%d), incentive denom (%s), minimum uptime (%s)", e.PoolId, e.IncentiveDenom, e.MinUptime.String()) +} diff --git a/x/concentrated-liquidity/types/incentive_record.pb.go b/x/concentrated-liquidity/types/incentive_record.pb.go index f87edef6fc0..3767d065026 100644 --- a/x/concentrated-liquidity/types/incentive_record.pb.go +++ b/x/concentrated-liquidity/types/incentive_record.pb.go @@ -31,19 +31,20 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // IncentiveRecord represents an active perpetual incentive gauge for a pool type IncentiveRecord struct { + PoolId uint64 `protobuf:"varint,1,opt,name=poolId,proto3" json:"poolId,omitempty"` // incentive_denom is the denom of the token being distributed as part of this // incentive record - IncentiveDenom string `protobuf:"bytes,1,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` + IncentiveDenom string `protobuf:"bytes,2,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` // remaining_amount is the total amount of incentives to be distributed - RemainingAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=remaining_amount,json=remainingAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"remaining_amount" yaml:"remaining_amount"` + RemainingAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=remaining_amount,json=remainingAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"remaining_amount" yaml:"remaining_amount"` // emission_rate is the incentive emission rate per second - EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"swap_fee"` + EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"swap_fee"` // start_time is the time when the incentive starts distributing - StartTime time.Time `protobuf:"bytes,4,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` + StartTime time.Time `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` // min_uptime is the minimum uptime required for liquidity to qualify for this // incentive. It should be always be one of the supported uptimes in // types.SupportedUptimes - MinUptime time.Duration `protobuf:"bytes,5,opt,name=min_uptime,json=minUptime,proto3,stdduration" json:"min_uptime" yaml:"min_uptime"` + MinUptime time.Duration `protobuf:"bytes,6,opt,name=min_uptime,json=minUptime,proto3,stdduration" json:"min_uptime" yaml:"min_uptime"` } func (m *IncentiveRecord) Reset() { *m = IncentiveRecord{} } @@ -79,6 +80,13 @@ func (m *IncentiveRecord) XXX_DiscardUnknown() { var xxx_messageInfo_IncentiveRecord proto.InternalMessageInfo +func (m *IncentiveRecord) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + func (m *IncentiveRecord) GetIncentiveDenom() string { if m != nil { return m.IncentiveDenom @@ -109,35 +117,36 @@ func init() { } var fileDescriptor_9d38bf94e42ee434 = []byte{ - // 447 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0x4f, 0x8f, 0x94, 0x30, - 0x18, 0xc6, 0xc1, 0x55, 0x93, 0xad, 0x7f, 0x50, 0x62, 0x22, 0x3b, 0x89, 0xb0, 0x21, 0x51, 0xf7, - 0x32, 0x6d, 0xc6, 0x3f, 0x17, 0x6f, 0x4b, 0xe6, 0xb2, 0x57, 0xa2, 0xd1, 0x18, 0x13, 0x52, 0xa0, - 0x83, 0x8d, 0xb4, 0x45, 0x5a, 0x46, 0xe7, 0x5b, 0xec, 0xd1, 0x8f, 0xb4, 0x89, 0x97, 0x3d, 0x1a, - 0x0f, 0x68, 0x66, 0xbe, 0xc1, 0x7e, 0x02, 0x43, 0x29, 0xcc, 0x64, 0x8c, 0x07, 0x4f, 0xf0, 0x3e, - 0xbc, 0xcf, 0xef, 0x7d, 0xfb, 0x50, 0xf0, 0x52, 0x48, 0x26, 0x24, 0x95, 0x28, 0x13, 0x3c, 0x23, - 0x5c, 0xd5, 0x58, 0x91, 0x7c, 0x5a, 0xd2, 0xcf, 0x0d, 0xcd, 0xa9, 0x5a, 0x21, 0xaa, 0x55, 0xba, - 0x24, 0x49, 0x4d, 0x32, 0x51, 0xe7, 0xb0, 0xaa, 0x85, 0x12, 0xee, 0x63, 0x63, 0x83, 0xbb, 0xb6, - 0xd1, 0x05, 0x97, 0xb3, 0x94, 0x28, 0x3c, 0x9b, 0x1c, 0x65, 0xba, 0x2f, 0xd1, 0x26, 0xd4, 0x17, - 0x3d, 0x61, 0xf2, 0xa0, 0x10, 0x85, 0xe8, 0xf5, 0xee, 0xcd, 0xa8, 0x41, 0x21, 0x44, 0x51, 0x12, - 0xa4, 0xab, 0xb4, 0x59, 0x20, 0x45, 0x19, 0x91, 0x0a, 0xb3, 0xca, 0x34, 0xf8, 0xfb, 0x0d, 0x79, - 0x53, 0x63, 0x45, 0x05, 0xef, 0xbf, 0x87, 0xdf, 0x0f, 0x80, 0x73, 0x36, 0xec, 0x1c, 0xeb, 0x95, - 0xdd, 0xa7, 0xc0, 0xd9, 0x1e, 0x23, 0x27, 0x5c, 0x30, 0xcf, 0x3e, 0xb6, 0x4f, 0x0e, 0xe3, 0xbb, - 0xa3, 0x3c, 0xef, 0x54, 0x57, 0x81, 0x7b, 0x35, 0x61, 0x98, 0x72, 0xca, 0x8b, 0x04, 0x33, 0xd1, - 0x70, 0xe5, 0x5d, 0xeb, 0x3a, 0xa3, 0xb3, 0x8b, 0x36, 0xb0, 0x7e, 0xb6, 0xc1, 0x93, 0x82, 0xaa, - 0x8f, 0x4d, 0x0a, 0x33, 0xc1, 0xcc, 0x71, 0xcc, 0x63, 0x2a, 0xf3, 0x4f, 0x48, 0xad, 0x2a, 0x22, - 0xe1, 0x9c, 0x64, 0x57, 0x6d, 0xf0, 0x70, 0x85, 0x59, 0xf9, 0x2a, 0xdc, 0xe7, 0x85, 0xb1, 0x33, - 0x4a, 0xa7, 0x5a, 0x71, 0x17, 0xe0, 0x0e, 0x61, 0x54, 0x4a, 0x2a, 0x78, 0xd2, 0xe5, 0xe8, 0x1d, - 0xe8, 0x91, 0xa7, 0xff, 0x3d, 0xd2, 0xe9, 0x47, 0xca, 0x2f, 0xb8, 0x4a, 0x16, 0x84, 0x84, 0xf1, - 0xed, 0x81, 0x1b, 0x63, 0x45, 0xdc, 0x77, 0x00, 0x48, 0x85, 0x6b, 0x95, 0x74, 0x99, 0x7a, 0xd7, - 0x8f, 0xed, 0x93, 0x5b, 0xcf, 0x26, 0xb0, 0xcf, 0x13, 0x0e, 0x79, 0xc2, 0xd7, 0x43, 0xe0, 0xd1, - 0xa3, 0x6e, 0x81, 0xab, 0x36, 0xb8, 0x6f, 0xb0, 0xa3, 0x37, 0x3c, 0xff, 0x15, 0xd8, 0xf1, 0xa1, - 0x16, 0xba, 0x76, 0xf7, 0x2d, 0x00, 0x8c, 0xf2, 0xa4, 0xa9, 0x34, 0xf9, 0x86, 0x26, 0x1f, 0xfd, - 0x45, 0x9e, 0x9b, 0x3f, 0xb5, 0x0f, 0xde, 0x5a, 0xc3, 0x6f, 0x1a, 0xcc, 0x28, 0x7f, 0xa3, 0xeb, - 0xe8, 0xc3, 0xc5, 0xda, 0xb7, 0x2f, 0xd7, 0xbe, 0xfd, 0x7b, 0xed, 0xdb, 0xe7, 0x1b, 0xdf, 0xba, - 0xdc, 0xf8, 0xd6, 0x8f, 0x8d, 0x6f, 0xbd, 0x8f, 0x76, 0x52, 0x31, 0x77, 0x71, 0x5a, 0xe2, 0x54, - 0x0e, 0x05, 0x5a, 0xce, 0x5e, 0xa0, 0xaf, 0xff, 0xba, 0xd5, 0x3a, 0xb5, 0xf4, 0xa6, 0x5e, 0xed, - 0xf9, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4f, 0x18, 0x98, 0xbc, 0x04, 0x03, 0x00, 0x00, + // 460 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0xcd, 0x8e, 0xd3, 0x30, + 0x18, 0x6c, 0xd8, 0xa5, 0xd2, 0x9a, 0x9f, 0x42, 0x84, 0x20, 0x5b, 0x89, 0xa4, 0x8a, 0x04, 0xf4, + 0xd2, 0x58, 0xe5, 0xe7, 0xc2, 0x6d, 0xab, 0x5e, 0x7a, 0x8d, 0x40, 0x20, 0x84, 0x14, 0x39, 0x89, + 0x1b, 0x2c, 0x62, 0x7f, 0x21, 0x76, 0x0a, 0x7d, 0x8b, 0x3d, 0xf2, 0x48, 0x7b, 0xdc, 0x23, 0xe2, + 0x50, 0x50, 0xfb, 0x06, 0xfb, 0x04, 0x28, 0x8e, 0x93, 0xad, 0x8a, 0x38, 0x70, 0x6a, 0x67, 0x32, + 0x33, 0xdf, 0xe7, 0xb1, 0xd1, 0x2b, 0x90, 0x1c, 0x24, 0x93, 0x38, 0x01, 0x91, 0x50, 0xa1, 0x4a, + 0xa2, 0x68, 0x3a, 0xc9, 0xd9, 0x97, 0x8a, 0xa5, 0x4c, 0xad, 0x31, 0xd3, 0x2c, 0x5b, 0xd1, 0xa8, + 0xa4, 0x09, 0x94, 0x69, 0x50, 0x94, 0xa0, 0xc0, 0x7e, 0x62, 0x6c, 0xc1, 0xbe, 0xad, 0x73, 0x05, + 0xab, 0x69, 0x4c, 0x15, 0x99, 0x0e, 0x4f, 0x13, 0xad, 0x8b, 0xb4, 0x09, 0x37, 0xa0, 0x49, 0x18, + 0x3e, 0xc8, 0x20, 0x83, 0x86, 0xaf, 0xff, 0x19, 0xd6, 0xcb, 0x00, 0xb2, 0x9c, 0x62, 0x8d, 0xe2, + 0x6a, 0x89, 0x15, 0xe3, 0x54, 0x2a, 0xc2, 0x0b, 0x23, 0x70, 0x0f, 0x05, 0x69, 0x55, 0x12, 0xc5, + 0x40, 0x34, 0xdf, 0xfd, 0xdd, 0x11, 0x1a, 0x2c, 0xda, 0x9d, 0x43, 0xbd, 0xb2, 0xfd, 0x10, 0xf5, + 0x0b, 0x80, 0x7c, 0x91, 0x3a, 0xd6, 0xc8, 0x1a, 0x1f, 0x87, 0x06, 0xd9, 0xcf, 0xd0, 0xe0, 0xfa, + 0x78, 0x29, 0x15, 0xc0, 0x9d, 0x1b, 0x23, 0x6b, 0x7c, 0x12, 0xde, 0xed, 0xe8, 0x79, 0xcd, 0xda, + 0x0a, 0xdd, 0x2b, 0x29, 0x27, 0x4c, 0x30, 0x91, 0x45, 0x84, 0x43, 0x25, 0x94, 0x73, 0x54, 0x2b, + 0x67, 0x8b, 0x8b, 0x8d, 0xd7, 0xfb, 0xb9, 0xf1, 0x9e, 0x66, 0x4c, 0x7d, 0xaa, 0xe2, 0x20, 0x01, + 0x6e, 0x8e, 0x69, 0x7e, 0x26, 0x32, 0xfd, 0x8c, 0xd5, 0xba, 0xa0, 0x32, 0x98, 0xd3, 0xe4, 0x6a, + 0xe3, 0x3d, 0x5a, 0x13, 0x9e, 0xbf, 0xf6, 0x0f, 0xf3, 0xfc, 0x70, 0xd0, 0x51, 0x67, 0x9a, 0xb1, + 0x97, 0xe8, 0x0e, 0xe5, 0x4c, 0x4a, 0x06, 0x22, 0xaa, 0xfb, 0x75, 0x8e, 0xf5, 0xc8, 0xb3, 0xff, + 0x1e, 0x39, 0x68, 0x46, 0xca, 0xaf, 0xa4, 0x88, 0x96, 0x94, 0xfa, 0xe1, 0xed, 0x36, 0x37, 0x24, + 0x8a, 0xda, 0xef, 0x11, 0x92, 0x8a, 0x94, 0x2a, 0xaa, 0xbb, 0x76, 0x6e, 0x8e, 0xac, 0xf1, 0xad, + 0xe7, 0xc3, 0xa0, 0xe9, 0x39, 0x68, 0x7b, 0x0e, 0xde, 0xb4, 0x17, 0x31, 0x7b, 0x5c, 0x2f, 0x70, + 0xb5, 0xf1, 0xee, 0x9b, 0xd8, 0xce, 0xeb, 0x9f, 0xff, 0xf2, 0xac, 0xf0, 0x44, 0x13, 0xb5, 0xdc, + 0x7e, 0x87, 0x10, 0x67, 0x22, 0xaa, 0x0a, 0x9d, 0xdc, 0xd7, 0xc9, 0xa7, 0x7f, 0x25, 0xcf, 0xcd, + 0x0d, 0x1e, 0x06, 0x5f, 0x5b, 0xfd, 0xef, 0x3a, 0x98, 0x33, 0xf1, 0x56, 0xe3, 0xd9, 0xc7, 0x8b, + 0xad, 0x6b, 0x5d, 0x6e, 0x5d, 0xeb, 0xf7, 0xd6, 0xb5, 0xce, 0x77, 0x6e, 0xef, 0x72, 0xe7, 0xf6, + 0x7e, 0xec, 0xdc, 0xde, 0x87, 0xd9, 0x5e, 0x2b, 0xe6, 0x8d, 0x4e, 0x72, 0x12, 0xcb, 0x16, 0xe0, + 0xd5, 0xf4, 0x25, 0xfe, 0xf6, 0xaf, 0xd7, 0xae, 0x5b, 0x8b, 0xfb, 0x7a, 0xb5, 0x17, 0x7f, 0x02, + 0x00, 0x00, 0xff, 0xff, 0xb1, 0xa4, 0x92, 0xf5, 0x1c, 0x03, 0x00, 0x00, } func (m *IncentiveRecord) Marshal() (dAtA []byte, err error) { @@ -167,7 +176,7 @@ func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= n1 i = encodeVarintIncentiveRecord(dAtA, i, uint64(n1)) i-- - dAtA[i] = 0x2a + dAtA[i] = 0x32 n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) if err2 != nil { return 0, err2 @@ -175,7 +184,7 @@ func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= n2 i = encodeVarintIncentiveRecord(dAtA, i, uint64(n2)) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x2a { size := m.EmissionRate.Size() i -= size @@ -185,7 +194,7 @@ func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintIncentiveRecord(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 { size := m.RemainingAmount.Size() i -= size @@ -195,13 +204,18 @@ func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintIncentiveRecord(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a if len(m.IncentiveDenom) > 0 { i -= len(m.IncentiveDenom) copy(dAtA[i:], m.IncentiveDenom) i = encodeVarintIncentiveRecord(dAtA, i, uint64(len(m.IncentiveDenom))) i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 + } + if m.PoolId != 0 { + i = encodeVarintIncentiveRecord(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 } return len(dAtA) - i, nil } @@ -223,6 +237,9 @@ func (m *IncentiveRecord) Size() (n int) { } var l int _ = l + if m.PoolId != 0 { + n += 1 + sovIncentiveRecord(uint64(m.PoolId)) + } l = len(m.IncentiveDenom) if l > 0 { n += 1 + l + sovIncentiveRecord(uint64(l)) @@ -274,6 +291,25 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentiveRecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field IncentiveDenom", wireType) } @@ -305,7 +341,7 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { } m.IncentiveDenom = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field RemainingAmount", wireType) } @@ -339,7 +375,7 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field EmissionRate", wireType) } @@ -373,7 +409,7 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) } @@ -406,7 +442,7 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: + case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field MinUptime", wireType) } diff --git a/x/concentrated-liquidity/types/keys.go b/x/concentrated-liquidity/types/keys.go index 4b42d8b25bf..5d5f7038fe9 100644 --- a/x/concentrated-liquidity/types/keys.go +++ b/x/concentrated-liquidity/types/keys.go @@ -20,9 +20,9 @@ const ( // Key prefixes var ( - TickPrefix = []byte{0x01} - PositionPrefix = []byte{0x02} - PoolPrefix = []byte{0x03} + TickPrefix = []byte{0x01} + PositionPrefix = []byte{0x02} + PoolPrefix = []byte{0x03} IncentivePrefix = []byte{0x04} ) @@ -90,5 +90,9 @@ func KeyPool(poolId uint64) []byte { } func KeyIncentiveRecord(poolId uint64, denom string, minUptime time.Duration) []byte { - return []byte(fmt.Sprintf("%s%d%s%d", IncentivePrefix, poolId, denom, uint64(minUptime))) -} \ No newline at end of file + return []byte(fmt.Sprintf("%s%s%d%s%s%s%d", IncentivePrefix, KeySeparator, poolId, KeySeparator, denom, KeySeparator, uint64(minUptime))) +} + +func KeyPoolIncentiveRecords(poolId uint64) []byte { + return []byte(fmt.Sprintf("%s%s%d", IncentivePrefix, KeySeparator, poolId)) +} diff --git a/x/concentrated-liquidity/types/pool.go b/x/concentrated-liquidity/types/pool.go index 6829b4d5f58..d6808514069 100644 --- a/x/concentrated-liquidity/types/pool.go +++ b/x/concentrated-liquidity/types/pool.go @@ -20,11 +20,9 @@ type ConcentratedPoolExtension interface { GetTickSpacing() uint64 GetLiquidity() sdk.Dec GetLastLiquidityUpdate() time.Time - GetPoolIncentives() []IncentiveRecord SetCurrentSqrtPrice(newSqrtPrice sdk.Dec) SetCurrentTick(newTick sdk.Int) SetLastLiquidityUpdate(newTime time.Time) - SetPoolIncentives(updatedRecords []IncentiveRecord) UpdateLiquidity(newLiquidity sdk.Dec) ApplySwap(newLiquidity sdk.Dec, newCurrentTick sdk.Int, newCurrentSqrtPrice sdk.Dec) error From 8355980f1497889b045615b2c2d93fd9b243e683 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 9 Feb 2023 18:06:29 -0800 Subject: [PATCH 055/136] comment cleanup --- x/concentrated-liquidity/incentives.go | 2 +- x/concentrated-liquidity/incentives_test.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index c4ab333bd7b..f3572698e88 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -229,7 +229,7 @@ func (k Keeper) setIncentiveRecord(ctx sdk.Context, incentiveRecord types.Incent } // nolint: unused -// setIncentiveRecords sets the passed in incentive records in state +// setMultipleIncentiveRecords sets multiple incentive records in state func (k Keeper) setMultipleIncentiveRecords(ctx sdk.Context, incentiveRecords []types.IncentiveRecord) { for _, incentiveRecord := range incentiveRecords { k.setIncentiveRecord(ctx, incentiveRecord) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 53c1a8a8ff8..16922de63b9 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -610,7 +610,8 @@ func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { } } -// Note: we test that incentive records are properly deducted by emissions in the `TestUpdateUptimeAccumulatorsToNow` above +// Note: we test that incentive records are properly deducted by emissions in `TestUpdateUptimeAccumulatorsToNow` above. +// This test aims to cover the behavior of a series of state read/writes relating to incentive records. func (s *KeeperTestSuite) TestIncentiveRecordsSetAndGet() { s.SetupTest() clKeeper := s.App.ConcentratedLiquidityKeeper From 85da6560c4000028114369dd0e3c2e1d46be9e7e Mon Sep 17 00:00:00 2001 From: alpo Date: Fri, 10 Feb 2023 08:05:56 -0800 Subject: [PATCH 056/136] minor comment and test cleanup --- x/concentrated-liquidity/incentives.go | 1 - x/concentrated-liquidity/incentives_test.go | 3 ++- x/concentrated-liquidity/store.go | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index f3572698e88..90d8c2f197e 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -222,7 +222,6 @@ func calcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, q // nolint: unused // setIncentiveRecords sets the passed in incentive records in state func (k Keeper) setIncentiveRecord(ctx sdk.Context, incentiveRecord types.IncentiveRecord) { - // Potentially need to set the pool's incentiveRecord field as well store := ctx.KVStore(k.storeKey) key := types.KeyIncentiveRecord(incentiveRecord.PoolId, incentiveRecord.IncentiveDenom, incentiveRecord.MinUptime) osmoutils.MustSet(store, key, &incentiveRecord) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 16922de63b9..94a099dd0cb 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -643,8 +643,9 @@ func (s *KeeperTestSuite) TestIncentiveRecordsSetAndGet() { s.Require().Equal([]types.IncentiveRecord{incentiveRecordOne}, allRecordsPoolOne) // Ensure records for other pool remain unchanged - _, err = clKeeper.GetIncentiveRecord(s.Ctx, clPoolTwo.GetId(), incentiveRecordOne.IncentiveDenom, incentiveRecordOne.MinUptime) + poolTwoRecord, err := clKeeper.GetIncentiveRecord(s.Ctx, clPoolTwo.GetId(), incentiveRecordOne.IncentiveDenom, incentiveRecordOne.MinUptime) s.Require().Error(err) + s.Require().Equal(types.IncentiveRecord{}, poolTwoRecord) allRecordsPoolTwo, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolTwo.GetId()) s.Require().NoError(err) s.Require().Equal(emptyIncentiveRecords, allRecordsPoolTwo) diff --git a/x/concentrated-liquidity/store.go b/x/concentrated-liquidity/store.go index da4faa5e8d5..b5d98f0ecbc 100644 --- a/x/concentrated-liquidity/store.go +++ b/x/concentrated-liquidity/store.go @@ -112,7 +112,11 @@ func ParseIncentiveRecordFromBz(bz []byte) (incentiveRecord types.IncentiveRecor return types.IncentiveRecord{}, errors.New("incentive record not found") } err = proto.Unmarshal(bz, &incentiveRecord) - return incentiveRecord, err + if err != nil { + return types.IncentiveRecord{}, err + } + + return incentiveRecord, nil } // ParseIncentiveRecordFromBz parses an incentive record from a byte array. From d167d77f6d5cd6d476f5c33f3b3d180ca894e0c6 Mon Sep 17 00:00:00 2001 From: alpo Date: Sat, 11 Feb 2023 00:29:14 -0800 Subject: [PATCH 057/136] clean up tests and comments --- x/concentrated-liquidity/position.go | 6 ++--- x/concentrated-liquidity/position_test.go | 29 ++++++++++++++++------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 383f17eaea7..b9f6d0edb69 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -66,10 +66,8 @@ func (k Keeper) initOrUpdatePosition( // TODO: consider deleting position if liquidity becomes zero // We update accumulators _prior_ to any position-related updates to ensure - // past rewards aren't distributed to new liquidity - // TODO: AddToAccumulator for each uptime accum here using (curTime - lastTime) / getPoolById().GetLiquidity() - // TODO: update LastLiqUpdate time here (using helper w/ new set fn + setPool) - // TODO: test + // past rewards aren't distributed to new liquidity. We also update pool's + // LastLiquidityUpdate here. k.updateUptimeAccumulatorsToNow(ctx, poolId) // Create records for relevant uptime accumulators here. diff --git a/x/concentrated-liquidity/position_test.go b/x/concentrated-liquidity/position_test.go index 4bb4b0f3e7b..b5fcedefadc 100644 --- a/x/concentrated-liquidity/position_test.go +++ b/x/concentrated-liquidity/position_test.go @@ -10,8 +10,11 @@ import ( ) func (s *KeeperTestSuite) TestInitOrUpdatePosition() { - const validPoolId = 1 - // defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + const ( + validPoolId = 1 + invalidPoolId = 2 + ) + defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) type param struct { poolId uint64 lowerTick int64 @@ -52,7 +55,6 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { positionExists: true, expectedLiquidity: DefaultLiquidityAmt.Add(DefaultLiquidityAmt), }, - /* { name: "Update position from -50 to 50 that already contains DefaultLiquidityAmt liquidity with DefaultLiquidityAmt more liquidity with an hour freeze duration", param: param{ @@ -68,7 +70,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { { name: "Init position for non-existing pool", param: param{ - poolId: 2, + poolId: invalidPoolId, lowerTick: -50, upperTick: 50, liquidityDelta: DefaultLiquidityAmt, @@ -76,7 +78,6 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { positionExists: false, expectedErr: types.PoolNotFoundError{PoolId: 2}, }, - */ { name: "Init position from -50 to 50 with negative DefaultLiquidityAmt liquidity", param: param{ @@ -103,10 +104,15 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { // We get initial uptime accum values for comparison later initUptimeAccumValues, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulatorValues(s.Ctx, test.param.poolId) - s.Require().NoError(err) - - // Ensure initial uptime accums are empty - s.Require().Equal(getExpectedUptimes().emptyExpectedAccumValues, initUptimeAccumValues) + if test.param.poolId == invalidPoolId { + s.Require().Error(err) + // Ensure that no accumulators are retrieved upon error + s.Require().Equal([]sdk.DecCoins{}, initUptimeAccumValues) + } else { + s.Require().NoError(err) + // Ensure initial uptime accums are empty + s.Require().Equal(getExpectedUptimes().emptyExpectedAccumValues, initUptimeAccumValues) + } // TODO: implement setIncentiveRecord(takes in array of IncentiveRecords) & set to test.poolIncentiveRecords @@ -155,6 +161,11 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { s.Require().Error(err) s.Require().ErrorContains(err, test.expectedErr.Error()) + // If the error is due to a nonexistent pool, we exit before pool-level checks + if test.param.poolId == invalidPoolId { + return + } + // Uptime accumulators should not be updated upon error newUptimeAccumValues, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulatorValues(s.Ctx, test.param.poolId) s.Require().NoError(err) From de7c1467eb306bf6a7cf0c8e4be1f76375b3861e Mon Sep 17 00:00:00 2001 From: alpo <62043214+AlpinYukseloglu@users.noreply.github.com> Date: Sat, 11 Feb 2023 02:49:48 -0800 Subject: [PATCH 058/136] [CL Incentives] Implement `setIncentiveRecords` and `getIncentiveRecords` (#4283) * set up keys * implement set and get for incentive records * comment cleanup * minor comment and test cleanup --- .../incentive_record.proto | 12 +- .../osmosis/concentrated-liquidity/pool.proto | 5 - x/concentrated-liquidity/export_test.go | 8 + x/concentrated-liquidity/incentives.go | 49 +++++- x/concentrated-liquidity/incentives_test.go | 84 ++++++++++- x/concentrated-liquidity/model/pool.go | 8 - x/concentrated-liquidity/model/pool.pb.go | 142 ++++++------------ x/concentrated-liquidity/store.go | 73 +++++++++ x/concentrated-liquidity/types/errors.go | 10 ++ .../types/incentive_record.pb.go | 122 +++++++++------ x/concentrated-liquidity/types/keys.go | 15 +- x/concentrated-liquidity/types/pool.go | 2 - 12 files changed, 355 insertions(+), 175 deletions(-) diff --git a/proto/osmosis/concentrated-liquidity/incentive_record.proto b/proto/osmosis/concentrated-liquidity/incentive_record.proto index d4c77d45e4f..b1b9674c18a 100644 --- a/proto/osmosis/concentrated-liquidity/incentive_record.proto +++ b/proto/osmosis/concentrated-liquidity/incentive_record.proto @@ -10,26 +10,28 @@ option go_package = "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidit // IncentiveRecord represents an active perpetual incentive gauge for a pool message IncentiveRecord { + uint64 poolId = 1; + // incentive_denom is the denom of the token being distributed as part of this // incentive record - string incentive_denom = 1; + string incentive_denom = 2; // remaining_amount is the total amount of incentives to be distributed - string remaining_amount = 2 [ + string remaining_amount = 3 [ (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.moretags) = "yaml:\"remaining_amount\"", (gogoproto.nullable) = false ]; // emission_rate is the incentive emission rate per second - string emission_rate = 3 [ + string emission_rate = 4 [ (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.moretags) = "yaml:\"swap_fee\"", (gogoproto.nullable) = false ]; // start_time is the time when the incentive starts distributing - google.protobuf.Timestamp start_time = 4 [ + google.protobuf.Timestamp start_time = 5 [ (gogoproto.nullable) = false, (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"start_time\"" @@ -38,7 +40,7 @@ message IncentiveRecord { // min_uptime is the minimum uptime required for liquidity to qualify for this // incentive. It should be always be one of the supported uptimes in // types.SupportedUptimes - google.protobuf.Duration min_uptime = 5 [ + google.protobuf.Duration min_uptime = 6 [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true, (gogoproto.moretags) = "yaml:\"min_uptime\"" diff --git a/proto/osmosis/concentrated-liquidity/pool.proto b/proto/osmosis/concentrated-liquidity/pool.proto index 009c35cce7f..3d6e1c24e82 100644 --- a/proto/osmosis/concentrated-liquidity/pool.proto +++ b/proto/osmosis/concentrated-liquidity/pool.proto @@ -63,9 +63,4 @@ message Pool { (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"last_liquidity_update\"" ]; - - repeated IncentiveRecord pool_incentives = 12 [ - (gogoproto.moretags) = "yaml:\"pool_incentives\"", - (gogoproto.nullable) = false - ]; } \ No newline at end of file diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index 3a095fdfd69..cac6198357e 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -168,3 +168,11 @@ func CalcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, q func (k Keeper) UpdateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) error { return k.updateUptimeAccumulatorsToNow(ctx, poolId) } + +func (k Keeper) SetIncentiveRecord(ctx sdk.Context, incentiveRecord types.IncentiveRecord) { + k.setIncentiveRecord(ctx, incentiveRecord) +} + +func (k Keeper) SetMultipleIncentiveRecords(ctx sdk.Context, incentiveRecords []types.IncentiveRecord) { + k.setMultipleIncentiveRecords(ctx, incentiveRecords) +} diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index cb31d798e59..90d8c2f197e 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -8,6 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/osmosis-labs/osmosis/osmoutils" "github.com/osmosis-labs/osmosis/osmoutils/accum" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" ) @@ -116,7 +117,11 @@ func (k Keeper) updateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) er } // Get relevant pool-level values - poolIncentiveRecords := pool.GetPoolIncentives() + poolIncentiveRecords, err := k.GetAllIncentiveRecordsForPool(ctx, poolId) + if err != nil { + return err + } + uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) if err != nil { return err @@ -164,7 +169,7 @@ func (k Keeper) updateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) er } // Update pool incentive records and LastLiquidityUpdate time in state to reflect emitted incentives - pool.SetPoolIncentives(poolIncentiveRecords) + k.setMultipleIncentiveRecords(ctx, poolIncentiveRecords) pool.SetLastLiquidityUpdate(ctx.BlockTime()) err = k.setPool(ctx, pool) if err != nil { @@ -213,3 +218,43 @@ func calcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, q return incentivesToAddToCurAccum, poolIncentiveRecords, nil } + +// nolint: unused +// setIncentiveRecords sets the passed in incentive records in state +func (k Keeper) setIncentiveRecord(ctx sdk.Context, incentiveRecord types.IncentiveRecord) { + store := ctx.KVStore(k.storeKey) + key := types.KeyIncentiveRecord(incentiveRecord.PoolId, incentiveRecord.IncentiveDenom, incentiveRecord.MinUptime) + osmoutils.MustSet(store, key, &incentiveRecord) +} + +// nolint: unused +// setMultipleIncentiveRecords sets multiple incentive records in state +func (k Keeper) setMultipleIncentiveRecords(ctx sdk.Context, incentiveRecords []types.IncentiveRecord) { + for _, incentiveRecord := range incentiveRecords { + k.setIncentiveRecord(ctx, incentiveRecord) + } +} + +// GetIncentiveRecord gets the incentive record corresponding to the passed in values from store +func (k Keeper) GetIncentiveRecord(ctx sdk.Context, poolId uint64, denom string, minUptime time.Duration) (types.IncentiveRecord, error) { + store := ctx.KVStore(k.storeKey) + incentiveStruct := types.IncentiveRecord{} + key := types.KeyIncentiveRecord(poolId, denom, minUptime) + + found, err := osmoutils.Get(store, key, &incentiveStruct) + if err != nil { + return types.IncentiveRecord{}, err + } + + if !found { + return types.IncentiveRecord{}, types.IncentiveRecordNotFoundError{PoolId: poolId, IncentiveDenom: denom, MinUptime: minUptime} + } + + return incentiveStruct, nil +} + +// GetAllIncentiveRecordsForPool gets all the incentive records for poolId +// Returns error if it is unable to retrieve +func (k Keeper) GetAllIncentiveRecordsForPool(ctx sdk.Context, poolId uint64) ([]types.IncentiveRecord, error) { + return osmoutils.GatherValuesFromStorePrefixWithKeyParser(ctx.KVStore(k.storeKey), types.KeyPoolIncentiveRecords(poolId), ParseFullIncentiveRecordFromBz) +} diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index eec6b21845c..94a099dd0cb 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -19,6 +19,7 @@ var ( testAccumOne = "testAccumOne" + // Note: lexicographic order is denomFour, denomOne, denomThree, denomTwo testDenomOne = "denomOne" testDenomTwo = "denomTwo" testDenomThree = "denomThree" @@ -41,6 +42,7 @@ var ( testUptimeFour = types.SupportedUptimes[3] incentiveRecordOne = types.IncentiveRecord{ + PoolId: validPoolId, IncentiveDenom: testDenomOne, RemainingAmount: defaultIncentiveAmount, EmissionRate: testEmissionOne, @@ -49,6 +51,7 @@ var ( } incentiveRecordTwo = types.IncentiveRecord{ + PoolId: validPoolId, IncentiveDenom: testDenomTwo, RemainingAmount: defaultIncentiveAmount, EmissionRate: testEmissionTwo, @@ -57,6 +60,7 @@ var ( } incentiveRecordThree = types.IncentiveRecord{ + PoolId: validPoolId, IncentiveDenom: testDenomThree, RemainingAmount: defaultIncentiveAmount, EmissionRate: testEmissionThree, @@ -65,6 +69,7 @@ var ( } incentiveRecordFour = types.IncentiveRecord{ + PoolId: validPoolId, IncentiveDenom: testDenomFour, RemainingAmount: defaultIncentiveAmount, EmissionRate: testEmissionFour, @@ -496,9 +501,10 @@ func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { expectedIncentiveRecords: []types.IncentiveRecord{ // We deduct incentives from each record since there are positions for all three + // Note that records are ordered lexicographically by denom in state chargeIncentive(incentiveRecordOne, time.Hour), - chargeIncentive(incentiveRecordTwo, time.Hour), chargeIncentive(incentiveRecordThree, time.Hour), + chargeIncentive(incentiveRecordTwo, time.Hour), }, expectedPass: true, }, @@ -509,10 +515,11 @@ func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { expectedIncentiveRecords: []types.IncentiveRecord{ // We only deduct from the first three incentive records since the last doesn't emit anything + // Note that records are ordered lexicographically by denom in state + incentiveRecordFour, chargeIncentive(incentiveRecordOne, time.Hour), - chargeIncentive(incentiveRecordTwo, time.Hour), chargeIncentive(incentiveRecordThree, time.Hour), - incentiveRecordFour, + chargeIncentive(incentiveRecordTwo, time.Hour), }, expectedPass: true, }, @@ -529,8 +536,7 @@ func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { clPool := s.PrepareConcentratedPool() // Initialize test incentives on the pool - clPool.SetPoolIncentives(tc.poolIncentiveRecords) - clKeeper.SetPool(s.Ctx, clPool) + clKeeper.SetMultipleIncentiveRecords(s.Ctx, tc.poolIncentiveRecords) // Get initial uptime accum values for comparison initUptimeAccumValues, err := clKeeper.GetUptimeAccumulatorValues(s.Ctx, tc.poolId) @@ -593,12 +599,76 @@ func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { // Ensure that LastLiquidityUpdate field is updated for pool s.Require().Equal(s.Ctx.BlockTime(), clPool.GetLastLiquidityUpdate()) - // Ensure that pool's IncentiveRecords are updated to reflect emitted incentives - s.Require().Equal(tc.expectedIncentiveRecords, clPool.GetPoolIncentives()) + updatedIncentiveRecords, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, tc.poolId) + s.Require().NoError(err) + s.Require().Equal(tc.expectedIncentiveRecords, updatedIncentiveRecords) } else { s.Require().Error(err) } }) } } + +// Note: we test that incentive records are properly deducted by emissions in `TestUpdateUptimeAccumulatorsToNow` above. +// This test aims to cover the behavior of a series of state read/writes relating to incentive records. +func (s *KeeperTestSuite) TestIncentiveRecordsSetAndGet() { + s.SetupTest() + clKeeper := s.App.ConcentratedLiquidityKeeper + s.Ctx = s.Ctx.WithBlockTime(defaultStartTime) + emptyIncentiveRecords := []types.IncentiveRecord{} + + // Set up test pool + clPoolOne := s.PrepareConcentratedPool() + + // Set up second pool for reference + clPoolTwo := s.PrepareConcentratedPool() + + // Ensure both pools start with no incentive records + poolOneRecords, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolOne.GetId()) + s.Require().NoError(err) + s.Require().Equal(emptyIncentiveRecords, poolOneRecords) + + poolTwoRecords, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolTwo.GetId()) + s.Require().NoError(err) + s.Require().Equal(emptyIncentiveRecords, poolTwoRecords) + + // Ensure setting and getting a single record works with single Get and GetAll + clKeeper.SetIncentiveRecord(s.Ctx, incentiveRecordOne) + poolOneRecord, err := clKeeper.GetIncentiveRecord(s.Ctx, clPoolOne.GetId(), incentiveRecordOne.IncentiveDenom, incentiveRecordOne.MinUptime) + s.Require().NoError(err) + s.Require().Equal(incentiveRecordOne, poolOneRecord) + allRecordsPoolOne, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolOne.GetId()) + s.Require().NoError(err) + s.Require().Equal([]types.IncentiveRecord{incentiveRecordOne}, allRecordsPoolOne) + + // Ensure records for other pool remain unchanged + poolTwoRecord, err := clKeeper.GetIncentiveRecord(s.Ctx, clPoolTwo.GetId(), incentiveRecordOne.IncentiveDenom, incentiveRecordOne.MinUptime) + s.Require().Error(err) + s.Require().Equal(types.IncentiveRecord{}, poolTwoRecord) + allRecordsPoolTwo, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolTwo.GetId()) + s.Require().NoError(err) + s.Require().Equal(emptyIncentiveRecords, allRecordsPoolTwo) + + // Ensure directly setting additional records don't overwrite previous ones + clKeeper.SetIncentiveRecord(s.Ctx, incentiveRecordTwo) + poolOneRecord, err = clKeeper.GetIncentiveRecord(s.Ctx, clPoolOne.GetId(), incentiveRecordTwo.IncentiveDenom, incentiveRecordTwo.MinUptime) + s.Require().NoError(err) + s.Require().Equal(incentiveRecordTwo, poolOneRecord) + allRecordsPoolOne, err = clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolOne.GetId()) + s.Require().NoError(err) + s.Require().Equal([]types.IncentiveRecord{incentiveRecordOne, incentiveRecordTwo}, allRecordsPoolOne) + + // Ensure setting multiple records through helper functions as expected + clKeeper.SetMultipleIncentiveRecords(s.Ctx, []types.IncentiveRecord{incentiveRecordThree, incentiveRecordFour}) + + // Note: we expect the records to be retrieved in lexicographic order by denom + allRecordsPoolOne, err = clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolOne.GetId()) + s.Require().NoError(err) + s.Require().Equal([]types.IncentiveRecord{incentiveRecordFour, incentiveRecordOne, incentiveRecordThree, incentiveRecordTwo}, allRecordsPoolOne) + + // Finally, we ensure the second pool remains unaffected + allRecordsPoolTwo, err = clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolTwo.GetId()) + s.Require().NoError(err) + s.Require().Equal(emptyIncentiveRecords, allRecordsPoolTwo) +} diff --git a/x/concentrated-liquidity/model/pool.go b/x/concentrated-liquidity/model/pool.go index b58b6fcc6ae..dfeaac47af0 100644 --- a/x/concentrated-liquidity/model/pool.go +++ b/x/concentrated-liquidity/model/pool.go @@ -156,10 +156,6 @@ func (p Pool) GetLastLiquidityUpdate() time.Time { return p.LastLiquidityUpdate } -func (p Pool) GetPoolIncentives() []types.IncentiveRecord { - return p.PoolIncentives -} - func (p Pool) GetType() poolmanagertypes.PoolType { return poolmanagertypes.Concentrated } @@ -184,10 +180,6 @@ func (p *Pool) SetLastLiquidityUpdate(newTime time.Time) { p.LastLiquidityUpdate = newTime } -func (p *Pool) SetPoolIncentives(updatedRecords []types.IncentiveRecord) { - p.PoolIncentives = updatedRecords -} - // updateLiquidityIfActivePosition updates the pool's liquidity if the position is active. // Returns true if updated, false otherwise. // TODO: add tests. diff --git a/x/concentrated-liquidity/model/pool.pb.go b/x/concentrated-liquidity/model/pool.pb.go index ad0d3d48cbc..abdc73e85e6 100644 --- a/x/concentrated-liquidity/model/pool.pb.go +++ b/x/concentrated-liquidity/model/pool.pb.go @@ -16,7 +16,7 @@ import ( proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - types1 "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" + _ "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" io "io" math "math" math_bits "math/bits" @@ -52,8 +52,7 @@ type Pool struct { SwapFee github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,10,opt,name=swap_fee,json=swapFee,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"swap_fee" yaml:"swap_fee"` // last_liquidity_update is the last time either the pool liquidity or the // active tick changed - LastLiquidityUpdate time.Time `protobuf:"bytes,11,opt,name=last_liquidity_update,json=lastLiquidityUpdate,proto3,stdtime" json:"last_liquidity_update" yaml:"last_liquidity_update"` - PoolIncentives []types1.IncentiveRecord `protobuf:"bytes,12,rep,name=pool_incentives,json=poolIncentives,proto3" json:"pool_incentives" yaml:"pool_incentives"` + LastLiquidityUpdate time.Time `protobuf:"bytes,11,opt,name=last_liquidity_update,json=lastLiquidityUpdate,proto3,stdtime" json:"last_liquidity_update" yaml:"last_liquidity_update"` } func (m *Pool) Reset() { *m = Pool{} } @@ -97,49 +96,46 @@ func init() { } var fileDescriptor_3526ea5373d96c9a = []byte{ - // 662 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x4b, 0x6f, 0xd3, 0x4c, - 0x14, 0x8d, 0xfb, 0x4a, 0x3b, 0xa9, 0xfa, 0x98, 0x7e, 0x5f, 0x71, 0x2b, 0xb0, 0x23, 0x0b, 0x50, - 0x90, 0x88, 0x4d, 0xca, 0x63, 0xd1, 0x5d, 0x0d, 0x54, 0xaa, 0x84, 0x44, 0xe5, 0x16, 0x16, 0xa8, - 0x92, 0x71, 0xc6, 0xd3, 0x74, 0x14, 0xc7, 0xe3, 0x78, 0x26, 0xa5, 0x5d, 0xb1, 0x65, 0xd9, 0x65, - 0x97, 0xfd, 0x11, 0xfc, 0x88, 0x8a, 0x55, 0x97, 0x88, 0x45, 0x40, 0xed, 0x3f, 0xc8, 0x82, 0x35, - 0x9a, 0xf1, 0xd8, 0x0d, 0x12, 0xaf, 0xac, 0xec, 0x7b, 0xee, 0xbd, 0xe7, 0x1c, 0xdf, 0xf1, 0x1d, - 0x70, 0x8f, 0xb2, 0x0e, 0x65, 0x84, 0x39, 0x88, 0xc6, 0x08, 0xc7, 0x3c, 0x0d, 0x38, 0x0e, 0xeb, - 0x11, 0xe9, 0xf6, 0x48, 0x48, 0xf8, 0xb1, 0x93, 0x50, 0x1a, 0xd9, 0x49, 0x4a, 0x39, 0x85, 0x77, - 0x54, 0xa9, 0x3d, 0x5c, 0x5a, 0x54, 0xda, 0x87, 0x8d, 0x26, 0xe6, 0x41, 0x63, 0x75, 0x05, 0xc9, - 0x3a, 0x5f, 0x36, 0x39, 0x59, 0x90, 0x31, 0xac, 0xfe, 0xd7, 0xa2, 0x2d, 0x9a, 0xe1, 0xe2, 0x4d, - 0xa1, 0x66, 0x8b, 0xd2, 0x56, 0x84, 0x1d, 0x19, 0x35, 0x7b, 0xfb, 0x0e, 0x27, 0x1d, 0xcc, 0x78, - 0xd0, 0x49, 0x54, 0xc1, 0xe3, 0xbf, 0x78, 0x24, 0x12, 0x25, 0x87, 0xd8, 0x4f, 0x31, 0xa2, 0x69, - 0x98, 0xb5, 0x59, 0xdf, 0xcb, 0x60, 0x62, 0x9b, 0xd2, 0x08, 0xde, 0x07, 0xe5, 0x20, 0x0c, 0x53, - 0xcc, 0x98, 0xae, 0x55, 0xb5, 0xda, 0x8c, 0x0b, 0x07, 0x7d, 0x73, 0xee, 0x38, 0xe8, 0x44, 0xeb, - 0x96, 0x4a, 0x58, 0x5e, 0x5e, 0x02, 0xe7, 0xc0, 0x18, 0x09, 0xf5, 0xb1, 0xaa, 0x56, 0x9b, 0xf0, - 0xc6, 0x48, 0x08, 0xdf, 0x82, 0x99, 0x42, 0x4a, 0x1f, 0x97, 0xfd, 0xee, 0x79, 0xdf, 0x2c, 0x7d, - 0xe9, 0x9b, 0x77, 0x5b, 0x84, 0x1f, 0xf4, 0x9a, 0x36, 0xa2, 0x1d, 0xf5, 0xa1, 0xea, 0x51, 0x67, - 0x61, 0xdb, 0xe1, 0xc7, 0x09, 0x66, 0xf6, 0x33, 0x8c, 0x06, 0x7d, 0x73, 0x21, 0x53, 0x2b, 0x88, - 0x2c, 0xef, 0x9a, 0x14, 0x2e, 0x83, 0x29, 0x4e, 0xdb, 0x38, 0x7e, 0xa0, 0x4f, 0x08, 0x7a, 0x4f, - 0x45, 0x05, 0xde, 0xd0, 0x27, 0x87, 0xf0, 0x06, 0xec, 0x02, 0x88, 0x7a, 0x69, 0x8a, 0x63, 0xee, - 0xb3, 0x6e, 0xca, 0xfd, 0x24, 0x25, 0x08, 0xeb, 0x53, 0xd2, 0xda, 0xd3, 0x91, 0xad, 0x2d, 0x66, - 0xd6, 0x58, 0x42, 0x15, 0x93, 0xe5, 0x2d, 0x28, 0xfa, 0x9d, 0x6e, 0xca, 0xb7, 0x05, 0x04, 0x0f, - 0xc0, 0x6c, 0x2e, 0xc9, 0x09, 0x6a, 0xeb, 0x65, 0x29, 0xf6, 0x7c, 0x04, 0xb1, 0xad, 0x98, 0x0f, - 0xfa, 0xe6, 0x52, 0x26, 0x36, 0xcc, 0x65, 0x79, 0x15, 0x15, 0xee, 0x12, 0xd4, 0x86, 0xeb, 0x60, - 0x56, 0xa0, 0x3e, 0x4b, 0x02, 0x44, 0xe2, 0x96, 0x3e, 0x2d, 0x0e, 0xc2, 0xbd, 0x71, 0xdd, 0x3b, - 0x9c, 0xb5, 0xbc, 0x8a, 0x08, 0x77, 0xb2, 0x08, 0x9e, 0x6a, 0xe0, 0x56, 0x92, 0x62, 0x44, 0x18, - 0xa1, 0xb1, 0xbf, 0x1f, 0x20, 0x4e, 0x53, 0x3f, 0x50, 0x9f, 0xe5, 0xd3, 0x18, 0xeb, 0x33, 0xd2, - 0xf7, 0xeb, 0x91, 0x7d, 0xdf, 0xce, 0xb4, 0xff, 0x48, 0x6e, 0x79, 0x2b, 0x45, 0x7e, 0x53, 0xa6, - 0x37, 0xb2, 0xe9, 0xbd, 0x8c, 0x31, 0xdc, 0x03, 0xd3, 0xec, 0x5d, 0x90, 0xf8, 0xfb, 0x18, 0xeb, - 0x40, 0x9a, 0xd8, 0x18, 0xf9, 0xa4, 0xe6, 0xd5, 0x49, 0x29, 0x1e, 0xcb, 0x2b, 0x8b, 0xd7, 0x4d, - 0x8c, 0xe1, 0x11, 0xf8, 0x3f, 0x0a, 0x18, 0xf7, 0x8b, 0x7f, 0xca, 0xef, 0x25, 0x61, 0xc0, 0xb1, - 0x5e, 0xa9, 0x6a, 0xb5, 0xca, 0xda, 0xaa, 0x9d, 0xad, 0x98, 0x9d, 0xaf, 0x98, 0xbd, 0x9b, 0xaf, - 0x98, 0x5b, 0x13, 0x36, 0x06, 0x7d, 0xf3, 0xa6, 0xfa, 0x43, 0x7f, 0x45, 0x63, 0x9d, 0x7c, 0x35, - 0x35, 0x6f, 0x49, 0xe4, 0x5e, 0xe4, 0xa9, 0x57, 0x32, 0x03, 0xdf, 0x83, 0x79, 0x71, 0x45, 0xf8, - 0xc5, 0x0e, 0x32, 0x7d, 0xb6, 0x3a, 0x5e, 0xab, 0xac, 0x3d, 0xb1, 0xff, 0xe9, 0xba, 0xb0, 0xb7, - 0xf2, 0x46, 0x4f, 0xee, 0xae, 0x6b, 0x28, 0x3f, 0xcb, 0x6a, 0xe2, 0x3f, 0x93, 0x5b, 0xde, 0x9c, - 0x40, 0x8a, 0x26, 0xb6, 0xbe, 0xf8, 0xe1, 0xcc, 0x2c, 0x9d, 0x9e, 0x99, 0xa5, 0x4f, 0x1f, 0xeb, - 0x93, 0x62, 0xdd, 0xb7, 0xdc, 0xbd, 0xf3, 0x4b, 0x43, 0xbb, 0xb8, 0x34, 0xb4, 0x6f, 0x97, 0x86, - 0x76, 0x72, 0x65, 0x94, 0x2e, 0xae, 0x8c, 0xd2, 0xe7, 0x2b, 0xa3, 0xf4, 0xc6, 0x1d, 0x9a, 0xb5, - 0xb2, 0x57, 0x8f, 0x82, 0x26, 0xcb, 0x03, 0xe7, 0xb0, 0xf1, 0xc8, 0x39, 0xfa, 0xdd, 0x3d, 0xd3, - 0xa1, 0x21, 0x8e, 0x9a, 0x53, 0x72, 0x88, 0x0f, 0x7f, 0x04, 0x00, 0x00, 0xff, 0xff, 0x5f, 0xdd, - 0x26, 0x5b, 0x3a, 0x05, 0x00, 0x00, + // 617 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0xcd, 0x4e, 0xdb, 0x4c, + 0x14, 0x8d, 0xf9, 0x20, 0xc0, 0x04, 0xf1, 0xc1, 0xd0, 0x1f, 0x83, 0xda, 0x18, 0x59, 0x6d, 0x95, + 0x4a, 0x8d, 0xdd, 0xf4, 0x67, 0xc3, 0x8e, 0xb4, 0x45, 0x42, 0xaa, 0x54, 0x64, 0x68, 0x17, 0x15, + 0x92, 0x3b, 0x19, 0x0f, 0x61, 0x14, 0xdb, 0xe3, 0xcc, 0x4c, 0x28, 0xbc, 0x41, 0x97, 0x2c, 0x59, + 0xf2, 0x10, 0x7d, 0x08, 0xd4, 0x15, 0xcb, 0xaa, 0x0b, 0xb7, 0x22, 0x6f, 0x10, 0xa9, 0xfb, 0xca, + 0xe3, 0xb1, 0xc9, 0xa2, 0x3f, 0xca, 0xca, 0x73, 0xef, 0xb9, 0xf7, 0x9c, 0x73, 0x3d, 0x73, 0xc1, + 0x43, 0x26, 0x22, 0x26, 0xa8, 0x70, 0x31, 0x8b, 0x31, 0x89, 0x25, 0x47, 0x92, 0x04, 0xcd, 0x90, + 0xf6, 0x07, 0x34, 0xa0, 0xf2, 0xc4, 0x4d, 0x18, 0x0b, 0x9d, 0x84, 0x33, 0xc9, 0xe0, 0x7d, 0x5d, + 0xea, 0x8c, 0x97, 0x96, 0x95, 0xce, 0x51, 0xab, 0x43, 0x24, 0x6a, 0xad, 0xad, 0x62, 0x55, 0xe7, + 0xab, 0x26, 0x37, 0x0f, 0x72, 0x86, 0xb5, 0x1b, 0x5d, 0xd6, 0x65, 0x79, 0x3e, 0x3b, 0xe9, 0xac, + 0xd5, 0x65, 0xac, 0x1b, 0x12, 0x57, 0x45, 0x9d, 0xc1, 0x81, 0x2b, 0x69, 0x44, 0x84, 0x44, 0x51, + 0xa2, 0x0b, 0x9e, 0xff, 0xc3, 0x23, 0x55, 0x59, 0x7a, 0x44, 0x7c, 0x4e, 0x30, 0xe3, 0x41, 0xde, + 0x66, 0xff, 0xac, 0x82, 0xe9, 0x1d, 0xc6, 0x42, 0xf8, 0x08, 0xcc, 0xa2, 0x20, 0xe0, 0x44, 0x08, + 0xd3, 0x58, 0x37, 0x1a, 0xf3, 0x6d, 0x38, 0x4a, 0xad, 0xc5, 0x13, 0x14, 0x85, 0x1b, 0xb6, 0x06, + 0x6c, 0xaf, 0x28, 0x81, 0x8b, 0x60, 0x8a, 0x06, 0xe6, 0xd4, 0xba, 0xd1, 0x98, 0xf6, 0xa6, 0x68, + 0x00, 0x3f, 0x80, 0xf9, 0x52, 0xca, 0xfc, 0x4f, 0xf5, 0xb7, 0x2f, 0x52, 0xab, 0xf2, 0x2d, 0xb5, + 0x1e, 0x74, 0xa9, 0x3c, 0x1c, 0x74, 0x1c, 0xcc, 0x22, 0x3d, 0xa8, 0xfe, 0x34, 0x45, 0xd0, 0x73, + 0xe5, 0x49, 0x42, 0x84, 0xf3, 0x92, 0xe0, 0x51, 0x6a, 0x2d, 0xe5, 0x6a, 0x25, 0x91, 0xed, 0x5d, + 0x93, 0xc2, 0x5b, 0xa0, 0x2a, 0x59, 0x8f, 0xc4, 0x8f, 0xcd, 0xe9, 0x8c, 0xde, 0xd3, 0x51, 0x99, + 0x6f, 0x99, 0x33, 0x63, 0xf9, 0x16, 0xec, 0x03, 0x88, 0x07, 0x9c, 0x93, 0x58, 0xfa, 0xa2, 0xcf, + 0xa5, 0x9f, 0x70, 0x8a, 0x89, 0x59, 0x55, 0xd6, 0x5e, 0x4c, 0x6c, 0x6d, 0x39, 0xb7, 0x26, 0x12, + 0xa6, 0x99, 0x6c, 0x6f, 0x49, 0xd3, 0xef, 0xf6, 0xb9, 0xdc, 0xc9, 0x52, 0xf0, 0x10, 0x2c, 0x14, + 0x92, 0x92, 0xe2, 0x9e, 0x39, 0xab, 0xc4, 0x5e, 0x4d, 0x20, 0xb6, 0x1d, 0xcb, 0x51, 0x6a, 0xad, + 0xe4, 0x62, 0xe3, 0x5c, 0xb6, 0x57, 0xd3, 0xe1, 0x1e, 0xc5, 0x3d, 0xb8, 0x01, 0x16, 0xb2, 0xac, + 0x2f, 0x12, 0x84, 0x69, 0xdc, 0x35, 0xe7, 0xb2, 0x8b, 0x68, 0xdf, 0xbe, 0xee, 0x1d, 0x47, 0x6d, + 0xaf, 0x96, 0x85, 0xbb, 0x79, 0x04, 0xcf, 0x0c, 0x70, 0x37, 0xe1, 0x04, 0x53, 0x41, 0x59, 0xec, + 0x1f, 0x20, 0x2c, 0x19, 0xf7, 0x91, 0x1e, 0xcb, 0x67, 0x31, 0x31, 0xe7, 0x95, 0xef, 0x77, 0x13, + 0xfb, 0xbe, 0x97, 0x6b, 0xff, 0x95, 0xdc, 0xf6, 0x56, 0x4b, 0x7c, 0x4b, 0xc1, 0x9b, 0xf9, 0xdf, + 0x7b, 0x13, 0x13, 0xb8, 0x0f, 0xe6, 0xc4, 0x47, 0x94, 0xf8, 0x07, 0x84, 0x98, 0x40, 0x99, 0xd8, + 0x9c, 0xf8, 0xa6, 0xfe, 0xd7, 0x37, 0xa5, 0x79, 0x6c, 0x6f, 0x36, 0x3b, 0x6e, 0x11, 0x02, 0x8f, + 0xc1, 0xcd, 0x10, 0x09, 0xe9, 0x97, 0x6f, 0xca, 0x1f, 0x24, 0x01, 0x92, 0xc4, 0xac, 0xad, 0x1b, + 0x8d, 0xda, 0x93, 0x35, 0x27, 0x5f, 0x31, 0xa7, 0x58, 0x31, 0x67, 0xaf, 0x58, 0xb1, 0x76, 0x23, + 0xb3, 0x31, 0x4a, 0xad, 0x3b, 0xfa, 0x85, 0xfe, 0x8e, 0xc6, 0x3e, 0xfd, 0x6e, 0x19, 0xde, 0x4a, + 0x86, 0xbd, 0x2e, 0xa0, 0xb7, 0x0a, 0xd9, 0x58, 0xfe, 0x74, 0x6e, 0x55, 0xce, 0xce, 0xad, 0xca, + 0x97, 0xcf, 0xcd, 0x99, 0x6c, 0xdb, 0xb6, 0xdb, 0xfb, 0x17, 0x57, 0x75, 0xe3, 0xf2, 0xaa, 0x6e, + 0xfc, 0xb8, 0xaa, 0x1b, 0xa7, 0xc3, 0x7a, 0xe5, 0x72, 0x58, 0xaf, 0x7c, 0x1d, 0xd6, 0x2b, 0xef, + 0xdb, 0x63, 0xa3, 0xea, 0x9d, 0x6e, 0x86, 0xa8, 0x23, 0x8a, 0xc0, 0x3d, 0x6a, 0x3d, 0x73, 0x8f, + 0xff, 0xb4, 0xe6, 0x11, 0x0b, 0x48, 0xd8, 0xa9, 0xaa, 0x19, 0x9e, 0xfe, 0x0a, 0x00, 0x00, 0xff, + 0xff, 0x83, 0x74, 0xf1, 0xd0, 0xb9, 0x04, 0x00, 0x00, } func (m *Pool) Marshal() (dAtA []byte, err error) { @@ -162,20 +158,6 @@ func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.PoolIncentives) > 0 { - for iNdEx := len(m.PoolIncentives) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.PoolIncentives[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintPool(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x62 - } - } n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastLiquidityUpdate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastLiquidityUpdate):]) if err1 != nil { return 0, err1 @@ -315,12 +297,6 @@ func (m *Pool) Size() (n int) { n += 1 + l + sovPool(uint64(l)) l = github_com_gogo_protobuf_types.SizeOfStdTime(m.LastLiquidityUpdate) n += 1 + l + sovPool(uint64(l)) - if len(m.PoolIncentives) > 0 { - for _, e := range m.PoolIncentives { - l = e.Size() - n += 1 + l + sovPool(uint64(l)) - } - } return n } @@ -696,40 +672,6 @@ func (m *Pool) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 12: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolIncentives", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PoolIncentives = append(m.PoolIncentives, types1.IncentiveRecord{}) - if err := m.PoolIncentives[len(m.PoolIncentives)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPool(dAtA[iNdEx:]) diff --git a/x/concentrated-liquidity/store.go b/x/concentrated-liquidity/store.go index 11b9af6a238..b5d98f0ecbc 100644 --- a/x/concentrated-liquidity/store.go +++ b/x/concentrated-liquidity/store.go @@ -5,6 +5,7 @@ import ( "fmt" "strconv" "strings" + "time" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/gogo/protobuf/proto" @@ -101,3 +102,75 @@ func ParseFullPositionFromBytes(key, value []byte) (types.FullPositionByOwnerRes Liquidity: positionValue.Liquidity, }, nil } + +// ParseFullIncentiveRecordFromBz parses a IncentiveRecord from a byte array. +// Returns a struct containing the denom and min uptime associated with the incentive record. +// Returns an error if the byte array is empty. +// Returns an error if fails to parse. +func ParseIncentiveRecordFromBz(bz []byte) (incentiveRecord types.IncentiveRecord, err error) { + if len(bz) == 0 { + return types.IncentiveRecord{}, errors.New("incentive record not found") + } + err = proto.Unmarshal(bz, &incentiveRecord) + if err != nil { + return types.IncentiveRecord{}, err + } + + return incentiveRecord, nil +} + +// ParseIncentiveRecordFromBz parses an incentive record from a byte array. +// Returns a struct containing the state associated with the incentive. +// Returns an error if the byte array is empty. +// Returns an error if fails to parse. +func ParseFullIncentiveRecordFromBz(key []byte, value []byte) (incentiveRecord types.IncentiveRecord, err error) { + if len(key) == 0 { + return types.IncentiveRecord{}, errors.New("key not found") + } + if len(value) == 0 { + return types.IncentiveRecord{}, fmt.Errorf("value not found for key (%s)", value) + } + + keyStr := string(key) + + // These may include irrelevant parts of the prefix such as the module prefix. + incentiveRecordKeyComponents := strings.Split(keyStr, types.KeySeparator) + + // We only care about the last 3 components, which are: + // - pool id + // - incentive denom + // - min uptime + + relevantIncentiveKeyComponents := incentiveRecordKeyComponents[len(incentiveRecordKeyComponents)-3:] + + incentivePrefix := incentiveRecordKeyComponents[0] + if incentivePrefix != string(types.IncentivePrefix) { + return types.IncentiveRecord{}, fmt.Errorf("Wrong incentive prefix, got: %v, required %v", []byte(incentivePrefix), types.IncentivePrefix) + } + + poolId, err := strconv.ParseUint(relevantIncentiveKeyComponents[0], 10, 64) + if err != nil { + return types.IncentiveRecord{}, err + } + + incentiveDenom := relevantIncentiveKeyComponents[1] + + minUptime, err := strconv.ParseUint(relevantIncentiveKeyComponents[2], 10, 64) + if err != nil { + return types.IncentiveRecord{}, err + } + + incentiveValue, err := ParseIncentiveRecordFromBz(value) + if err != nil { + return types.IncentiveRecord{}, err + } + + return types.IncentiveRecord{ + PoolId: poolId, + IncentiveDenom: incentiveDenom, + RemainingAmount: incentiveValue.RemainingAmount, + EmissionRate: incentiveValue.EmissionRate, + StartTime: incentiveValue.StartTime, + MinUptime: time.Duration(minUptime), + }, nil +} diff --git a/x/concentrated-liquidity/types/errors.go b/x/concentrated-liquidity/types/errors.go index 8c126372ef0..f128fdcc938 100644 --- a/x/concentrated-liquidity/types/errors.go +++ b/x/concentrated-liquidity/types/errors.go @@ -223,3 +223,13 @@ type PositionStillFrozenError struct { func (e PositionStillFrozenError) Error() string { return fmt.Sprintf("position is still frozen until %s", e.FrozenUntil) } + +type IncentiveRecordNotFoundError struct { + PoolId uint64 + IncentiveDenom string + MinUptime time.Duration +} + +func (e IncentiveRecordNotFoundError) Error() string { + return fmt.Sprintf("incentive record not found. pool id (%d), incentive denom (%s), minimum uptime (%s)", e.PoolId, e.IncentiveDenom, e.MinUptime.String()) +} diff --git a/x/concentrated-liquidity/types/incentive_record.pb.go b/x/concentrated-liquidity/types/incentive_record.pb.go index f87edef6fc0..3767d065026 100644 --- a/x/concentrated-liquidity/types/incentive_record.pb.go +++ b/x/concentrated-liquidity/types/incentive_record.pb.go @@ -31,19 +31,20 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // IncentiveRecord represents an active perpetual incentive gauge for a pool type IncentiveRecord struct { + PoolId uint64 `protobuf:"varint,1,opt,name=poolId,proto3" json:"poolId,omitempty"` // incentive_denom is the denom of the token being distributed as part of this // incentive record - IncentiveDenom string `protobuf:"bytes,1,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` + IncentiveDenom string `protobuf:"bytes,2,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` // remaining_amount is the total amount of incentives to be distributed - RemainingAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=remaining_amount,json=remainingAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"remaining_amount" yaml:"remaining_amount"` + RemainingAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=remaining_amount,json=remainingAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"remaining_amount" yaml:"remaining_amount"` // emission_rate is the incentive emission rate per second - EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"swap_fee"` + EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"swap_fee"` // start_time is the time when the incentive starts distributing - StartTime time.Time `protobuf:"bytes,4,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` + StartTime time.Time `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` // min_uptime is the minimum uptime required for liquidity to qualify for this // incentive. It should be always be one of the supported uptimes in // types.SupportedUptimes - MinUptime time.Duration `protobuf:"bytes,5,opt,name=min_uptime,json=minUptime,proto3,stdduration" json:"min_uptime" yaml:"min_uptime"` + MinUptime time.Duration `protobuf:"bytes,6,opt,name=min_uptime,json=minUptime,proto3,stdduration" json:"min_uptime" yaml:"min_uptime"` } func (m *IncentiveRecord) Reset() { *m = IncentiveRecord{} } @@ -79,6 +80,13 @@ func (m *IncentiveRecord) XXX_DiscardUnknown() { var xxx_messageInfo_IncentiveRecord proto.InternalMessageInfo +func (m *IncentiveRecord) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + func (m *IncentiveRecord) GetIncentiveDenom() string { if m != nil { return m.IncentiveDenom @@ -109,35 +117,36 @@ func init() { } var fileDescriptor_9d38bf94e42ee434 = []byte{ - // 447 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0x4f, 0x8f, 0x94, 0x30, - 0x18, 0xc6, 0xc1, 0x55, 0x93, 0xad, 0x7f, 0x50, 0x62, 0x22, 0x3b, 0x89, 0xb0, 0x21, 0x51, 0xf7, - 0x32, 0x6d, 0xc6, 0x3f, 0x17, 0x6f, 0x4b, 0xe6, 0xb2, 0x57, 0xa2, 0xd1, 0x18, 0x13, 0x52, 0xa0, - 0x83, 0x8d, 0xb4, 0x45, 0x5a, 0x46, 0xe7, 0x5b, 0xec, 0xd1, 0x8f, 0xb4, 0x89, 0x97, 0x3d, 0x1a, - 0x0f, 0x68, 0x66, 0xbe, 0xc1, 0x7e, 0x02, 0x43, 0x29, 0xcc, 0x64, 0x8c, 0x07, 0x4f, 0xf0, 0x3e, - 0xbc, 0xcf, 0xef, 0x7d, 0xfb, 0x50, 0xf0, 0x52, 0x48, 0x26, 0x24, 0x95, 0x28, 0x13, 0x3c, 0x23, - 0x5c, 0xd5, 0x58, 0x91, 0x7c, 0x5a, 0xd2, 0xcf, 0x0d, 0xcd, 0xa9, 0x5a, 0x21, 0xaa, 0x55, 0xba, - 0x24, 0x49, 0x4d, 0x32, 0x51, 0xe7, 0xb0, 0xaa, 0x85, 0x12, 0xee, 0x63, 0x63, 0x83, 0xbb, 0xb6, - 0xd1, 0x05, 0x97, 0xb3, 0x94, 0x28, 0x3c, 0x9b, 0x1c, 0x65, 0xba, 0x2f, 0xd1, 0x26, 0xd4, 0x17, - 0x3d, 0x61, 0xf2, 0xa0, 0x10, 0x85, 0xe8, 0xf5, 0xee, 0xcd, 0xa8, 0x41, 0x21, 0x44, 0x51, 0x12, - 0xa4, 0xab, 0xb4, 0x59, 0x20, 0x45, 0x19, 0x91, 0x0a, 0xb3, 0xca, 0x34, 0xf8, 0xfb, 0x0d, 0x79, - 0x53, 0x63, 0x45, 0x05, 0xef, 0xbf, 0x87, 0xdf, 0x0f, 0x80, 0x73, 0x36, 0xec, 0x1c, 0xeb, 0x95, - 0xdd, 0xa7, 0xc0, 0xd9, 0x1e, 0x23, 0x27, 0x5c, 0x30, 0xcf, 0x3e, 0xb6, 0x4f, 0x0e, 0xe3, 0xbb, - 0xa3, 0x3c, 0xef, 0x54, 0x57, 0x81, 0x7b, 0x35, 0x61, 0x98, 0x72, 0xca, 0x8b, 0x04, 0x33, 0xd1, - 0x70, 0xe5, 0x5d, 0xeb, 0x3a, 0xa3, 0xb3, 0x8b, 0x36, 0xb0, 0x7e, 0xb6, 0xc1, 0x93, 0x82, 0xaa, - 0x8f, 0x4d, 0x0a, 0x33, 0xc1, 0xcc, 0x71, 0xcc, 0x63, 0x2a, 0xf3, 0x4f, 0x48, 0xad, 0x2a, 0x22, - 0xe1, 0x9c, 0x64, 0x57, 0x6d, 0xf0, 0x70, 0x85, 0x59, 0xf9, 0x2a, 0xdc, 0xe7, 0x85, 0xb1, 0x33, - 0x4a, 0xa7, 0x5a, 0x71, 0x17, 0xe0, 0x0e, 0x61, 0x54, 0x4a, 0x2a, 0x78, 0xd2, 0xe5, 0xe8, 0x1d, - 0xe8, 0x91, 0xa7, 0xff, 0x3d, 0xd2, 0xe9, 0x47, 0xca, 0x2f, 0xb8, 0x4a, 0x16, 0x84, 0x84, 0xf1, - 0xed, 0x81, 0x1b, 0x63, 0x45, 0xdc, 0x77, 0x00, 0x48, 0x85, 0x6b, 0x95, 0x74, 0x99, 0x7a, 0xd7, - 0x8f, 0xed, 0x93, 0x5b, 0xcf, 0x26, 0xb0, 0xcf, 0x13, 0x0e, 0x79, 0xc2, 0xd7, 0x43, 0xe0, 0xd1, - 0xa3, 0x6e, 0x81, 0xab, 0x36, 0xb8, 0x6f, 0xb0, 0xa3, 0x37, 0x3c, 0xff, 0x15, 0xd8, 0xf1, 0xa1, - 0x16, 0xba, 0x76, 0xf7, 0x2d, 0x00, 0x8c, 0xf2, 0xa4, 0xa9, 0x34, 0xf9, 0x86, 0x26, 0x1f, 0xfd, - 0x45, 0x9e, 0x9b, 0x3f, 0xb5, 0x0f, 0xde, 0x5a, 0xc3, 0x6f, 0x1a, 0xcc, 0x28, 0x7f, 0xa3, 0xeb, - 0xe8, 0xc3, 0xc5, 0xda, 0xb7, 0x2f, 0xd7, 0xbe, 0xfd, 0x7b, 0xed, 0xdb, 0xe7, 0x1b, 0xdf, 0xba, - 0xdc, 0xf8, 0xd6, 0x8f, 0x8d, 0x6f, 0xbd, 0x8f, 0x76, 0x52, 0x31, 0x77, 0x71, 0x5a, 0xe2, 0x54, - 0x0e, 0x05, 0x5a, 0xce, 0x5e, 0xa0, 0xaf, 0xff, 0xba, 0xd5, 0x3a, 0xb5, 0xf4, 0xa6, 0x5e, 0xed, - 0xf9, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4f, 0x18, 0x98, 0xbc, 0x04, 0x03, 0x00, 0x00, + // 460 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0xcd, 0x8e, 0xd3, 0x30, + 0x18, 0x6c, 0xd8, 0xa5, 0xd2, 0x9a, 0x9f, 0x42, 0x84, 0x20, 0x5b, 0x89, 0xa4, 0x8a, 0x04, 0xf4, + 0xd2, 0x58, 0xe5, 0xe7, 0xc2, 0x6d, 0xab, 0x5e, 0x7a, 0x8d, 0x40, 0x20, 0x84, 0x14, 0x39, 0x89, + 0x1b, 0x2c, 0x62, 0x7f, 0x21, 0x76, 0x0a, 0x7d, 0x8b, 0x3d, 0xf2, 0x48, 0x7b, 0xdc, 0x23, 0xe2, + 0x50, 0x50, 0xfb, 0x06, 0xfb, 0x04, 0x28, 0x8e, 0x93, 0xad, 0x8a, 0x38, 0x70, 0x6a, 0x67, 0x32, + 0x33, 0xdf, 0xe7, 0xb1, 0xd1, 0x2b, 0x90, 0x1c, 0x24, 0x93, 0x38, 0x01, 0x91, 0x50, 0xa1, 0x4a, + 0xa2, 0x68, 0x3a, 0xc9, 0xd9, 0x97, 0x8a, 0xa5, 0x4c, 0xad, 0x31, 0xd3, 0x2c, 0x5b, 0xd1, 0xa8, + 0xa4, 0x09, 0x94, 0x69, 0x50, 0x94, 0xa0, 0xc0, 0x7e, 0x62, 0x6c, 0xc1, 0xbe, 0xad, 0x73, 0x05, + 0xab, 0x69, 0x4c, 0x15, 0x99, 0x0e, 0x4f, 0x13, 0xad, 0x8b, 0xb4, 0x09, 0x37, 0xa0, 0x49, 0x18, + 0x3e, 0xc8, 0x20, 0x83, 0x86, 0xaf, 0xff, 0x19, 0xd6, 0xcb, 0x00, 0xb2, 0x9c, 0x62, 0x8d, 0xe2, + 0x6a, 0x89, 0x15, 0xe3, 0x54, 0x2a, 0xc2, 0x0b, 0x23, 0x70, 0x0f, 0x05, 0x69, 0x55, 0x12, 0xc5, + 0x40, 0x34, 0xdf, 0xfd, 0xdd, 0x11, 0x1a, 0x2c, 0xda, 0x9d, 0x43, 0xbd, 0xb2, 0xfd, 0x10, 0xf5, + 0x0b, 0x80, 0x7c, 0x91, 0x3a, 0xd6, 0xc8, 0x1a, 0x1f, 0x87, 0x06, 0xd9, 0xcf, 0xd0, 0xe0, 0xfa, + 0x78, 0x29, 0x15, 0xc0, 0x9d, 0x1b, 0x23, 0x6b, 0x7c, 0x12, 0xde, 0xed, 0xe8, 0x79, 0xcd, 0xda, + 0x0a, 0xdd, 0x2b, 0x29, 0x27, 0x4c, 0x30, 0x91, 0x45, 0x84, 0x43, 0x25, 0x94, 0x73, 0x54, 0x2b, + 0x67, 0x8b, 0x8b, 0x8d, 0xd7, 0xfb, 0xb9, 0xf1, 0x9e, 0x66, 0x4c, 0x7d, 0xaa, 0xe2, 0x20, 0x01, + 0x6e, 0x8e, 0x69, 0x7e, 0x26, 0x32, 0xfd, 0x8c, 0xd5, 0xba, 0xa0, 0x32, 0x98, 0xd3, 0xe4, 0x6a, + 0xe3, 0x3d, 0x5a, 0x13, 0x9e, 0xbf, 0xf6, 0x0f, 0xf3, 0xfc, 0x70, 0xd0, 0x51, 0x67, 0x9a, 0xb1, + 0x97, 0xe8, 0x0e, 0xe5, 0x4c, 0x4a, 0x06, 0x22, 0xaa, 0xfb, 0x75, 0x8e, 0xf5, 0xc8, 0xb3, 0xff, + 0x1e, 0x39, 0x68, 0x46, 0xca, 0xaf, 0xa4, 0x88, 0x96, 0x94, 0xfa, 0xe1, 0xed, 0x36, 0x37, 0x24, + 0x8a, 0xda, 0xef, 0x11, 0x92, 0x8a, 0x94, 0x2a, 0xaa, 0xbb, 0x76, 0x6e, 0x8e, 0xac, 0xf1, 0xad, + 0xe7, 0xc3, 0xa0, 0xe9, 0x39, 0x68, 0x7b, 0x0e, 0xde, 0xb4, 0x17, 0x31, 0x7b, 0x5c, 0x2f, 0x70, + 0xb5, 0xf1, 0xee, 0x9b, 0xd8, 0xce, 0xeb, 0x9f, 0xff, 0xf2, 0xac, 0xf0, 0x44, 0x13, 0xb5, 0xdc, + 0x7e, 0x87, 0x10, 0x67, 0x22, 0xaa, 0x0a, 0x9d, 0xdc, 0xd7, 0xc9, 0xa7, 0x7f, 0x25, 0xcf, 0xcd, + 0x0d, 0x1e, 0x06, 0x5f, 0x5b, 0xfd, 0xef, 0x3a, 0x98, 0x33, 0xf1, 0x56, 0xe3, 0xd9, 0xc7, 0x8b, + 0xad, 0x6b, 0x5d, 0x6e, 0x5d, 0xeb, 0xf7, 0xd6, 0xb5, 0xce, 0x77, 0x6e, 0xef, 0x72, 0xe7, 0xf6, + 0x7e, 0xec, 0xdc, 0xde, 0x87, 0xd9, 0x5e, 0x2b, 0xe6, 0x8d, 0x4e, 0x72, 0x12, 0xcb, 0x16, 0xe0, + 0xd5, 0xf4, 0x25, 0xfe, 0xf6, 0xaf, 0xd7, 0xae, 0x5b, 0x8b, 0xfb, 0x7a, 0xb5, 0x17, 0x7f, 0x02, + 0x00, 0x00, 0xff, 0xff, 0xb1, 0xa4, 0x92, 0xf5, 0x1c, 0x03, 0x00, 0x00, } func (m *IncentiveRecord) Marshal() (dAtA []byte, err error) { @@ -167,7 +176,7 @@ func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= n1 i = encodeVarintIncentiveRecord(dAtA, i, uint64(n1)) i-- - dAtA[i] = 0x2a + dAtA[i] = 0x32 n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) if err2 != nil { return 0, err2 @@ -175,7 +184,7 @@ func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= n2 i = encodeVarintIncentiveRecord(dAtA, i, uint64(n2)) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x2a { size := m.EmissionRate.Size() i -= size @@ -185,7 +194,7 @@ func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintIncentiveRecord(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 { size := m.RemainingAmount.Size() i -= size @@ -195,13 +204,18 @@ func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintIncentiveRecord(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a if len(m.IncentiveDenom) > 0 { i -= len(m.IncentiveDenom) copy(dAtA[i:], m.IncentiveDenom) i = encodeVarintIncentiveRecord(dAtA, i, uint64(len(m.IncentiveDenom))) i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 + } + if m.PoolId != 0 { + i = encodeVarintIncentiveRecord(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 } return len(dAtA) - i, nil } @@ -223,6 +237,9 @@ func (m *IncentiveRecord) Size() (n int) { } var l int _ = l + if m.PoolId != 0 { + n += 1 + sovIncentiveRecord(uint64(m.PoolId)) + } l = len(m.IncentiveDenom) if l > 0 { n += 1 + l + sovIncentiveRecord(uint64(l)) @@ -274,6 +291,25 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentiveRecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field IncentiveDenom", wireType) } @@ -305,7 +341,7 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { } m.IncentiveDenom = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field RemainingAmount", wireType) } @@ -339,7 +375,7 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field EmissionRate", wireType) } @@ -373,7 +409,7 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) } @@ -406,7 +442,7 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: + case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field MinUptime", wireType) } diff --git a/x/concentrated-liquidity/types/keys.go b/x/concentrated-liquidity/types/keys.go index d07d654761b..5d5f7038fe9 100644 --- a/x/concentrated-liquidity/types/keys.go +++ b/x/concentrated-liquidity/types/keys.go @@ -20,9 +20,10 @@ const ( // Key prefixes var ( - TickPrefix = []byte{0x01} - PositionPrefix = []byte{0x02} - PoolPrefix = []byte{0x03} + TickPrefix = []byte{0x01} + PositionPrefix = []byte{0x02} + PoolPrefix = []byte{0x03} + IncentivePrefix = []byte{0x04} ) // TickIndexToBytes converts a tick index to a byte slice. Negative tick indexes @@ -87,3 +88,11 @@ func KeyUserPositions(addr sdk.AccAddress) []byte { func KeyPool(poolId uint64) []byte { return []byte(fmt.Sprintf("%s%d", PoolPrefix, poolId)) } + +func KeyIncentiveRecord(poolId uint64, denom string, minUptime time.Duration) []byte { + return []byte(fmt.Sprintf("%s%s%d%s%s%s%d", IncentivePrefix, KeySeparator, poolId, KeySeparator, denom, KeySeparator, uint64(minUptime))) +} + +func KeyPoolIncentiveRecords(poolId uint64) []byte { + return []byte(fmt.Sprintf("%s%s%d", IncentivePrefix, KeySeparator, poolId)) +} diff --git a/x/concentrated-liquidity/types/pool.go b/x/concentrated-liquidity/types/pool.go index 6829b4d5f58..d6808514069 100644 --- a/x/concentrated-liquidity/types/pool.go +++ b/x/concentrated-liquidity/types/pool.go @@ -20,11 +20,9 @@ type ConcentratedPoolExtension interface { GetTickSpacing() uint64 GetLiquidity() sdk.Dec GetLastLiquidityUpdate() time.Time - GetPoolIncentives() []IncentiveRecord SetCurrentSqrtPrice(newSqrtPrice sdk.Dec) SetCurrentTick(newTick sdk.Int) SetLastLiquidityUpdate(newTime time.Time) - SetPoolIncentives(updatedRecords []IncentiveRecord) UpdateLiquidity(newLiquidity sdk.Dec) ApplySwap(newLiquidity sdk.Dec, newCurrentTick sdk.Int, newCurrentSqrtPrice sdk.Dec) error From ad5db485eee6d657a6e93d0724c6ae74ab6ce7a9 Mon Sep 17 00:00:00 2001 From: alpo <62043214+AlpinYukseloglu@users.noreply.github.com> Date: Sat, 11 Feb 2023 10:28:04 -0800 Subject: [PATCH 059/136] Revert "[CL Incentives] Implement `setIncentiveRecords` and `getIncentiveRecords` (#4283)" (#4294) This reverts commit de7c1467eb306bf6a7cf0c8e4be1f76375b3861e. --- .../incentive_record.proto | 12 +- .../osmosis/concentrated-liquidity/pool.proto | 5 + x/concentrated-liquidity/export_test.go | 8 - x/concentrated-liquidity/incentives.go | 49 +----- x/concentrated-liquidity/incentives_test.go | 84 +---------- x/concentrated-liquidity/model/pool.go | 8 + x/concentrated-liquidity/model/pool.pb.go | 142 ++++++++++++------ x/concentrated-liquidity/store.go | 73 --------- x/concentrated-liquidity/types/errors.go | 10 -- .../types/incentive_record.pb.go | 122 ++++++--------- x/concentrated-liquidity/types/keys.go | 15 +- x/concentrated-liquidity/types/pool.go | 2 + 12 files changed, 175 insertions(+), 355 deletions(-) diff --git a/proto/osmosis/concentrated-liquidity/incentive_record.proto b/proto/osmosis/concentrated-liquidity/incentive_record.proto index b1b9674c18a..d4c77d45e4f 100644 --- a/proto/osmosis/concentrated-liquidity/incentive_record.proto +++ b/proto/osmosis/concentrated-liquidity/incentive_record.proto @@ -10,28 +10,26 @@ option go_package = "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidit // IncentiveRecord represents an active perpetual incentive gauge for a pool message IncentiveRecord { - uint64 poolId = 1; - // incentive_denom is the denom of the token being distributed as part of this // incentive record - string incentive_denom = 2; + string incentive_denom = 1; // remaining_amount is the total amount of incentives to be distributed - string remaining_amount = 3 [ + string remaining_amount = 2 [ (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.moretags) = "yaml:\"remaining_amount\"", (gogoproto.nullable) = false ]; // emission_rate is the incentive emission rate per second - string emission_rate = 4 [ + string emission_rate = 3 [ (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.moretags) = "yaml:\"swap_fee\"", (gogoproto.nullable) = false ]; // start_time is the time when the incentive starts distributing - google.protobuf.Timestamp start_time = 5 [ + google.protobuf.Timestamp start_time = 4 [ (gogoproto.nullable) = false, (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"start_time\"" @@ -40,7 +38,7 @@ message IncentiveRecord { // min_uptime is the minimum uptime required for liquidity to qualify for this // incentive. It should be always be one of the supported uptimes in // types.SupportedUptimes - google.protobuf.Duration min_uptime = 6 [ + google.protobuf.Duration min_uptime = 5 [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true, (gogoproto.moretags) = "yaml:\"min_uptime\"" diff --git a/proto/osmosis/concentrated-liquidity/pool.proto b/proto/osmosis/concentrated-liquidity/pool.proto index 3d6e1c24e82..009c35cce7f 100644 --- a/proto/osmosis/concentrated-liquidity/pool.proto +++ b/proto/osmosis/concentrated-liquidity/pool.proto @@ -63,4 +63,9 @@ message Pool { (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"last_liquidity_update\"" ]; + + repeated IncentiveRecord pool_incentives = 12 [ + (gogoproto.moretags) = "yaml:\"pool_incentives\"", + (gogoproto.nullable) = false + ]; } \ No newline at end of file diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index cac6198357e..3a095fdfd69 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -168,11 +168,3 @@ func CalcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, q func (k Keeper) UpdateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) error { return k.updateUptimeAccumulatorsToNow(ctx, poolId) } - -func (k Keeper) SetIncentiveRecord(ctx sdk.Context, incentiveRecord types.IncentiveRecord) { - k.setIncentiveRecord(ctx, incentiveRecord) -} - -func (k Keeper) SetMultipleIncentiveRecords(ctx sdk.Context, incentiveRecords []types.IncentiveRecord) { - k.setMultipleIncentiveRecords(ctx, incentiveRecords) -} diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 90d8c2f197e..cb31d798e59 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -8,7 +8,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/osmosis-labs/osmosis/osmoutils" "github.com/osmosis-labs/osmosis/osmoutils/accum" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" ) @@ -117,11 +116,7 @@ func (k Keeper) updateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) er } // Get relevant pool-level values - poolIncentiveRecords, err := k.GetAllIncentiveRecordsForPool(ctx, poolId) - if err != nil { - return err - } - + poolIncentiveRecords := pool.GetPoolIncentives() uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) if err != nil { return err @@ -169,7 +164,7 @@ func (k Keeper) updateUptimeAccumulatorsToNow(ctx sdk.Context, poolId uint64) er } // Update pool incentive records and LastLiquidityUpdate time in state to reflect emitted incentives - k.setMultipleIncentiveRecords(ctx, poolIncentiveRecords) + pool.SetPoolIncentives(poolIncentiveRecords) pool.SetLastLiquidityUpdate(ctx.BlockTime()) err = k.setPool(ctx, pool) if err != nil { @@ -218,43 +213,3 @@ func calcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, q return incentivesToAddToCurAccum, poolIncentiveRecords, nil } - -// nolint: unused -// setIncentiveRecords sets the passed in incentive records in state -func (k Keeper) setIncentiveRecord(ctx sdk.Context, incentiveRecord types.IncentiveRecord) { - store := ctx.KVStore(k.storeKey) - key := types.KeyIncentiveRecord(incentiveRecord.PoolId, incentiveRecord.IncentiveDenom, incentiveRecord.MinUptime) - osmoutils.MustSet(store, key, &incentiveRecord) -} - -// nolint: unused -// setMultipleIncentiveRecords sets multiple incentive records in state -func (k Keeper) setMultipleIncentiveRecords(ctx sdk.Context, incentiveRecords []types.IncentiveRecord) { - for _, incentiveRecord := range incentiveRecords { - k.setIncentiveRecord(ctx, incentiveRecord) - } -} - -// GetIncentiveRecord gets the incentive record corresponding to the passed in values from store -func (k Keeper) GetIncentiveRecord(ctx sdk.Context, poolId uint64, denom string, minUptime time.Duration) (types.IncentiveRecord, error) { - store := ctx.KVStore(k.storeKey) - incentiveStruct := types.IncentiveRecord{} - key := types.KeyIncentiveRecord(poolId, denom, minUptime) - - found, err := osmoutils.Get(store, key, &incentiveStruct) - if err != nil { - return types.IncentiveRecord{}, err - } - - if !found { - return types.IncentiveRecord{}, types.IncentiveRecordNotFoundError{PoolId: poolId, IncentiveDenom: denom, MinUptime: minUptime} - } - - return incentiveStruct, nil -} - -// GetAllIncentiveRecordsForPool gets all the incentive records for poolId -// Returns error if it is unable to retrieve -func (k Keeper) GetAllIncentiveRecordsForPool(ctx sdk.Context, poolId uint64) ([]types.IncentiveRecord, error) { - return osmoutils.GatherValuesFromStorePrefixWithKeyParser(ctx.KVStore(k.storeKey), types.KeyPoolIncentiveRecords(poolId), ParseFullIncentiveRecordFromBz) -} diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 94a099dd0cb..eec6b21845c 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -19,7 +19,6 @@ var ( testAccumOne = "testAccumOne" - // Note: lexicographic order is denomFour, denomOne, denomThree, denomTwo testDenomOne = "denomOne" testDenomTwo = "denomTwo" testDenomThree = "denomThree" @@ -42,7 +41,6 @@ var ( testUptimeFour = types.SupportedUptimes[3] incentiveRecordOne = types.IncentiveRecord{ - PoolId: validPoolId, IncentiveDenom: testDenomOne, RemainingAmount: defaultIncentiveAmount, EmissionRate: testEmissionOne, @@ -51,7 +49,6 @@ var ( } incentiveRecordTwo = types.IncentiveRecord{ - PoolId: validPoolId, IncentiveDenom: testDenomTwo, RemainingAmount: defaultIncentiveAmount, EmissionRate: testEmissionTwo, @@ -60,7 +57,6 @@ var ( } incentiveRecordThree = types.IncentiveRecord{ - PoolId: validPoolId, IncentiveDenom: testDenomThree, RemainingAmount: defaultIncentiveAmount, EmissionRate: testEmissionThree, @@ -69,7 +65,6 @@ var ( } incentiveRecordFour = types.IncentiveRecord{ - PoolId: validPoolId, IncentiveDenom: testDenomFour, RemainingAmount: defaultIncentiveAmount, EmissionRate: testEmissionFour, @@ -501,10 +496,9 @@ func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { expectedIncentiveRecords: []types.IncentiveRecord{ // We deduct incentives from each record since there are positions for all three - // Note that records are ordered lexicographically by denom in state chargeIncentive(incentiveRecordOne, time.Hour), - chargeIncentive(incentiveRecordThree, time.Hour), chargeIncentive(incentiveRecordTwo, time.Hour), + chargeIncentive(incentiveRecordThree, time.Hour), }, expectedPass: true, }, @@ -515,11 +509,10 @@ func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { expectedIncentiveRecords: []types.IncentiveRecord{ // We only deduct from the first three incentive records since the last doesn't emit anything - // Note that records are ordered lexicographically by denom in state - incentiveRecordFour, chargeIncentive(incentiveRecordOne, time.Hour), - chargeIncentive(incentiveRecordThree, time.Hour), chargeIncentive(incentiveRecordTwo, time.Hour), + chargeIncentive(incentiveRecordThree, time.Hour), + incentiveRecordFour, }, expectedPass: true, }, @@ -536,7 +529,8 @@ func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { clPool := s.PrepareConcentratedPool() // Initialize test incentives on the pool - clKeeper.SetMultipleIncentiveRecords(s.Ctx, tc.poolIncentiveRecords) + clPool.SetPoolIncentives(tc.poolIncentiveRecords) + clKeeper.SetPool(s.Ctx, clPool) // Get initial uptime accum values for comparison initUptimeAccumValues, err := clKeeper.GetUptimeAccumulatorValues(s.Ctx, tc.poolId) @@ -599,76 +593,12 @@ func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { // Ensure that LastLiquidityUpdate field is updated for pool s.Require().Equal(s.Ctx.BlockTime(), clPool.GetLastLiquidityUpdate()) + // Ensure that pool's IncentiveRecords are updated to reflect emitted incentives - updatedIncentiveRecords, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, tc.poolId) - s.Require().NoError(err) - s.Require().Equal(tc.expectedIncentiveRecords, updatedIncentiveRecords) + s.Require().Equal(tc.expectedIncentiveRecords, clPool.GetPoolIncentives()) } else { s.Require().Error(err) } }) } } - -// Note: we test that incentive records are properly deducted by emissions in `TestUpdateUptimeAccumulatorsToNow` above. -// This test aims to cover the behavior of a series of state read/writes relating to incentive records. -func (s *KeeperTestSuite) TestIncentiveRecordsSetAndGet() { - s.SetupTest() - clKeeper := s.App.ConcentratedLiquidityKeeper - s.Ctx = s.Ctx.WithBlockTime(defaultStartTime) - emptyIncentiveRecords := []types.IncentiveRecord{} - - // Set up test pool - clPoolOne := s.PrepareConcentratedPool() - - // Set up second pool for reference - clPoolTwo := s.PrepareConcentratedPool() - - // Ensure both pools start with no incentive records - poolOneRecords, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolOne.GetId()) - s.Require().NoError(err) - s.Require().Equal(emptyIncentiveRecords, poolOneRecords) - - poolTwoRecords, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolTwo.GetId()) - s.Require().NoError(err) - s.Require().Equal(emptyIncentiveRecords, poolTwoRecords) - - // Ensure setting and getting a single record works with single Get and GetAll - clKeeper.SetIncentiveRecord(s.Ctx, incentiveRecordOne) - poolOneRecord, err := clKeeper.GetIncentiveRecord(s.Ctx, clPoolOne.GetId(), incentiveRecordOne.IncentiveDenom, incentiveRecordOne.MinUptime) - s.Require().NoError(err) - s.Require().Equal(incentiveRecordOne, poolOneRecord) - allRecordsPoolOne, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolOne.GetId()) - s.Require().NoError(err) - s.Require().Equal([]types.IncentiveRecord{incentiveRecordOne}, allRecordsPoolOne) - - // Ensure records for other pool remain unchanged - poolTwoRecord, err := clKeeper.GetIncentiveRecord(s.Ctx, clPoolTwo.GetId(), incentiveRecordOne.IncentiveDenom, incentiveRecordOne.MinUptime) - s.Require().Error(err) - s.Require().Equal(types.IncentiveRecord{}, poolTwoRecord) - allRecordsPoolTwo, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolTwo.GetId()) - s.Require().NoError(err) - s.Require().Equal(emptyIncentiveRecords, allRecordsPoolTwo) - - // Ensure directly setting additional records don't overwrite previous ones - clKeeper.SetIncentiveRecord(s.Ctx, incentiveRecordTwo) - poolOneRecord, err = clKeeper.GetIncentiveRecord(s.Ctx, clPoolOne.GetId(), incentiveRecordTwo.IncentiveDenom, incentiveRecordTwo.MinUptime) - s.Require().NoError(err) - s.Require().Equal(incentiveRecordTwo, poolOneRecord) - allRecordsPoolOne, err = clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolOne.GetId()) - s.Require().NoError(err) - s.Require().Equal([]types.IncentiveRecord{incentiveRecordOne, incentiveRecordTwo}, allRecordsPoolOne) - - // Ensure setting multiple records through helper functions as expected - clKeeper.SetMultipleIncentiveRecords(s.Ctx, []types.IncentiveRecord{incentiveRecordThree, incentiveRecordFour}) - - // Note: we expect the records to be retrieved in lexicographic order by denom - allRecordsPoolOne, err = clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolOne.GetId()) - s.Require().NoError(err) - s.Require().Equal([]types.IncentiveRecord{incentiveRecordFour, incentiveRecordOne, incentiveRecordThree, incentiveRecordTwo}, allRecordsPoolOne) - - // Finally, we ensure the second pool remains unaffected - allRecordsPoolTwo, err = clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolTwo.GetId()) - s.Require().NoError(err) - s.Require().Equal(emptyIncentiveRecords, allRecordsPoolTwo) -} diff --git a/x/concentrated-liquidity/model/pool.go b/x/concentrated-liquidity/model/pool.go index dfeaac47af0..b58b6fcc6ae 100644 --- a/x/concentrated-liquidity/model/pool.go +++ b/x/concentrated-liquidity/model/pool.go @@ -156,6 +156,10 @@ func (p Pool) GetLastLiquidityUpdate() time.Time { return p.LastLiquidityUpdate } +func (p Pool) GetPoolIncentives() []types.IncentiveRecord { + return p.PoolIncentives +} + func (p Pool) GetType() poolmanagertypes.PoolType { return poolmanagertypes.Concentrated } @@ -180,6 +184,10 @@ func (p *Pool) SetLastLiquidityUpdate(newTime time.Time) { p.LastLiquidityUpdate = newTime } +func (p *Pool) SetPoolIncentives(updatedRecords []types.IncentiveRecord) { + p.PoolIncentives = updatedRecords +} + // updateLiquidityIfActivePosition updates the pool's liquidity if the position is active. // Returns true if updated, false otherwise. // TODO: add tests. diff --git a/x/concentrated-liquidity/model/pool.pb.go b/x/concentrated-liquidity/model/pool.pb.go index abdc73e85e6..ad0d3d48cbc 100644 --- a/x/concentrated-liquidity/model/pool.pb.go +++ b/x/concentrated-liquidity/model/pool.pb.go @@ -16,7 +16,7 @@ import ( proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" + types1 "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" io "io" math "math" math_bits "math/bits" @@ -52,7 +52,8 @@ type Pool struct { SwapFee github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,10,opt,name=swap_fee,json=swapFee,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"swap_fee" yaml:"swap_fee"` // last_liquidity_update is the last time either the pool liquidity or the // active tick changed - LastLiquidityUpdate time.Time `protobuf:"bytes,11,opt,name=last_liquidity_update,json=lastLiquidityUpdate,proto3,stdtime" json:"last_liquidity_update" yaml:"last_liquidity_update"` + LastLiquidityUpdate time.Time `protobuf:"bytes,11,opt,name=last_liquidity_update,json=lastLiquidityUpdate,proto3,stdtime" json:"last_liquidity_update" yaml:"last_liquidity_update"` + PoolIncentives []types1.IncentiveRecord `protobuf:"bytes,12,rep,name=pool_incentives,json=poolIncentives,proto3" json:"pool_incentives" yaml:"pool_incentives"` } func (m *Pool) Reset() { *m = Pool{} } @@ -96,46 +97,49 @@ func init() { } var fileDescriptor_3526ea5373d96c9a = []byte{ - // 617 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0xcd, 0x4e, 0xdb, 0x4c, - 0x14, 0x8d, 0xf9, 0x20, 0xc0, 0x04, 0xf1, 0xc1, 0xd0, 0x1f, 0x83, 0xda, 0x18, 0x59, 0x6d, 0x95, - 0x4a, 0x8d, 0xdd, 0xf4, 0x67, 0xc3, 0x8e, 0xb4, 0x45, 0x42, 0xaa, 0x54, 0x64, 0x68, 0x17, 0x15, - 0x92, 0x3b, 0x19, 0x0f, 0x61, 0x14, 0xdb, 0xe3, 0xcc, 0x4c, 0x28, 0xbc, 0x41, 0x97, 0x2c, 0x59, - 0xf2, 0x10, 0x7d, 0x08, 0xd4, 0x15, 0xcb, 0xaa, 0x0b, 0xb7, 0x22, 0x6f, 0x10, 0xa9, 0xfb, 0xca, - 0xe3, 0xb1, 0xc9, 0xa2, 0x3f, 0xca, 0xca, 0x73, 0xef, 0xb9, 0xf7, 0x9c, 0x73, 0x3d, 0x73, 0xc1, - 0x43, 0x26, 0x22, 0x26, 0xa8, 0x70, 0x31, 0x8b, 0x31, 0x89, 0x25, 0x47, 0x92, 0x04, 0xcd, 0x90, - 0xf6, 0x07, 0x34, 0xa0, 0xf2, 0xc4, 0x4d, 0x18, 0x0b, 0x9d, 0x84, 0x33, 0xc9, 0xe0, 0x7d, 0x5d, - 0xea, 0x8c, 0x97, 0x96, 0x95, 0xce, 0x51, 0xab, 0x43, 0x24, 0x6a, 0xad, 0xad, 0x62, 0x55, 0xe7, - 0xab, 0x26, 0x37, 0x0f, 0x72, 0x86, 0xb5, 0x1b, 0x5d, 0xd6, 0x65, 0x79, 0x3e, 0x3b, 0xe9, 0xac, - 0xd5, 0x65, 0xac, 0x1b, 0x12, 0x57, 0x45, 0x9d, 0xc1, 0x81, 0x2b, 0x69, 0x44, 0x84, 0x44, 0x51, - 0xa2, 0x0b, 0x9e, 0xff, 0xc3, 0x23, 0x55, 0x59, 0x7a, 0x44, 0x7c, 0x4e, 0x30, 0xe3, 0x41, 0xde, - 0x66, 0xff, 0xac, 0x82, 0xe9, 0x1d, 0xc6, 0x42, 0xf8, 0x08, 0xcc, 0xa2, 0x20, 0xe0, 0x44, 0x08, - 0xd3, 0x58, 0x37, 0x1a, 0xf3, 0x6d, 0x38, 0x4a, 0xad, 0xc5, 0x13, 0x14, 0x85, 0x1b, 0xb6, 0x06, - 0x6c, 0xaf, 0x28, 0x81, 0x8b, 0x60, 0x8a, 0x06, 0xe6, 0xd4, 0xba, 0xd1, 0x98, 0xf6, 0xa6, 0x68, - 0x00, 0x3f, 0x80, 0xf9, 0x52, 0xca, 0xfc, 0x4f, 0xf5, 0xb7, 0x2f, 0x52, 0xab, 0xf2, 0x2d, 0xb5, - 0x1e, 0x74, 0xa9, 0x3c, 0x1c, 0x74, 0x1c, 0xcc, 0x22, 0x3d, 0xa8, 0xfe, 0x34, 0x45, 0xd0, 0x73, - 0xe5, 0x49, 0x42, 0x84, 0xf3, 0x92, 0xe0, 0x51, 0x6a, 0x2d, 0xe5, 0x6a, 0x25, 0x91, 0xed, 0x5d, - 0x93, 0xc2, 0x5b, 0xa0, 0x2a, 0x59, 0x8f, 0xc4, 0x8f, 0xcd, 0xe9, 0x8c, 0xde, 0xd3, 0x51, 0x99, - 0x6f, 0x99, 0x33, 0x63, 0xf9, 0x16, 0xec, 0x03, 0x88, 0x07, 0x9c, 0x93, 0x58, 0xfa, 0xa2, 0xcf, - 0xa5, 0x9f, 0x70, 0x8a, 0x89, 0x59, 0x55, 0xd6, 0x5e, 0x4c, 0x6c, 0x6d, 0x39, 0xb7, 0x26, 0x12, - 0xa6, 0x99, 0x6c, 0x6f, 0x49, 0xd3, 0xef, 0xf6, 0xb9, 0xdc, 0xc9, 0x52, 0xf0, 0x10, 0x2c, 0x14, - 0x92, 0x92, 0xe2, 0x9e, 0x39, 0xab, 0xc4, 0x5e, 0x4d, 0x20, 0xb6, 0x1d, 0xcb, 0x51, 0x6a, 0xad, - 0xe4, 0x62, 0xe3, 0x5c, 0xb6, 0x57, 0xd3, 0xe1, 0x1e, 0xc5, 0x3d, 0xb8, 0x01, 0x16, 0xb2, 0xac, - 0x2f, 0x12, 0x84, 0x69, 0xdc, 0x35, 0xe7, 0xb2, 0x8b, 0x68, 0xdf, 0xbe, 0xee, 0x1d, 0x47, 0x6d, - 0xaf, 0x96, 0x85, 0xbb, 0x79, 0x04, 0xcf, 0x0c, 0x70, 0x37, 0xe1, 0x04, 0x53, 0x41, 0x59, 0xec, - 0x1f, 0x20, 0x2c, 0x19, 0xf7, 0x91, 0x1e, 0xcb, 0x67, 0x31, 0x31, 0xe7, 0x95, 0xef, 0x77, 0x13, - 0xfb, 0xbe, 0x97, 0x6b, 0xff, 0x95, 0xdc, 0xf6, 0x56, 0x4b, 0x7c, 0x4b, 0xc1, 0x9b, 0xf9, 0xdf, - 0x7b, 0x13, 0x13, 0xb8, 0x0f, 0xe6, 0xc4, 0x47, 0x94, 0xf8, 0x07, 0x84, 0x98, 0x40, 0x99, 0xd8, - 0x9c, 0xf8, 0xa6, 0xfe, 0xd7, 0x37, 0xa5, 0x79, 0x6c, 0x6f, 0x36, 0x3b, 0x6e, 0x11, 0x02, 0x8f, - 0xc1, 0xcd, 0x10, 0x09, 0xe9, 0x97, 0x6f, 0xca, 0x1f, 0x24, 0x01, 0x92, 0xc4, 0xac, 0xad, 0x1b, - 0x8d, 0xda, 0x93, 0x35, 0x27, 0x5f, 0x31, 0xa7, 0x58, 0x31, 0x67, 0xaf, 0x58, 0xb1, 0x76, 0x23, - 0xb3, 0x31, 0x4a, 0xad, 0x3b, 0xfa, 0x85, 0xfe, 0x8e, 0xc6, 0x3e, 0xfd, 0x6e, 0x19, 0xde, 0x4a, - 0x86, 0xbd, 0x2e, 0xa0, 0xb7, 0x0a, 0xd9, 0x58, 0xfe, 0x74, 0x6e, 0x55, 0xce, 0xce, 0xad, 0xca, - 0x97, 0xcf, 0xcd, 0x99, 0x6c, 0xdb, 0xb6, 0xdb, 0xfb, 0x17, 0x57, 0x75, 0xe3, 0xf2, 0xaa, 0x6e, - 0xfc, 0xb8, 0xaa, 0x1b, 0xa7, 0xc3, 0x7a, 0xe5, 0x72, 0x58, 0xaf, 0x7c, 0x1d, 0xd6, 0x2b, 0xef, - 0xdb, 0x63, 0xa3, 0xea, 0x9d, 0x6e, 0x86, 0xa8, 0x23, 0x8a, 0xc0, 0x3d, 0x6a, 0x3d, 0x73, 0x8f, - 0xff, 0xb4, 0xe6, 0x11, 0x0b, 0x48, 0xd8, 0xa9, 0xaa, 0x19, 0x9e, 0xfe, 0x0a, 0x00, 0x00, 0xff, - 0xff, 0x83, 0x74, 0xf1, 0xd0, 0xb9, 0x04, 0x00, 0x00, + // 662 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x4b, 0x6f, 0xd3, 0x4c, + 0x14, 0x8d, 0xfb, 0x4a, 0x3b, 0xa9, 0xfa, 0x98, 0x7e, 0x5f, 0x71, 0x2b, 0xb0, 0x23, 0x0b, 0x50, + 0x90, 0x88, 0x4d, 0xca, 0x63, 0xd1, 0x5d, 0x0d, 0x54, 0xaa, 0x84, 0x44, 0xe5, 0x16, 0x16, 0xa8, + 0x92, 0x71, 0xc6, 0xd3, 0x74, 0x14, 0xc7, 0xe3, 0x78, 0x26, 0xa5, 0x5d, 0xb1, 0x65, 0xd9, 0x65, + 0x97, 0xfd, 0x11, 0xfc, 0x88, 0x8a, 0x55, 0x97, 0x88, 0x45, 0x40, 0xed, 0x3f, 0xc8, 0x82, 0x35, + 0x9a, 0xf1, 0xd8, 0x0d, 0x12, 0xaf, 0xac, 0xec, 0x7b, 0xee, 0xbd, 0xe7, 0x1c, 0xdf, 0xf1, 0x1d, + 0x70, 0x8f, 0xb2, 0x0e, 0x65, 0x84, 0x39, 0x88, 0xc6, 0x08, 0xc7, 0x3c, 0x0d, 0x38, 0x0e, 0xeb, + 0x11, 0xe9, 0xf6, 0x48, 0x48, 0xf8, 0xb1, 0x93, 0x50, 0x1a, 0xd9, 0x49, 0x4a, 0x39, 0x85, 0x77, + 0x54, 0xa9, 0x3d, 0x5c, 0x5a, 0x54, 0xda, 0x87, 0x8d, 0x26, 0xe6, 0x41, 0x63, 0x75, 0x05, 0xc9, + 0x3a, 0x5f, 0x36, 0x39, 0x59, 0x90, 0x31, 0xac, 0xfe, 0xd7, 0xa2, 0x2d, 0x9a, 0xe1, 0xe2, 0x4d, + 0xa1, 0x66, 0x8b, 0xd2, 0x56, 0x84, 0x1d, 0x19, 0x35, 0x7b, 0xfb, 0x0e, 0x27, 0x1d, 0xcc, 0x78, + 0xd0, 0x49, 0x54, 0xc1, 0xe3, 0xbf, 0x78, 0x24, 0x12, 0x25, 0x87, 0xd8, 0x4f, 0x31, 0xa2, 0x69, + 0x98, 0xb5, 0x59, 0xdf, 0xcb, 0x60, 0x62, 0x9b, 0xd2, 0x08, 0xde, 0x07, 0xe5, 0x20, 0x0c, 0x53, + 0xcc, 0x98, 0xae, 0x55, 0xb5, 0xda, 0x8c, 0x0b, 0x07, 0x7d, 0x73, 0xee, 0x38, 0xe8, 0x44, 0xeb, + 0x96, 0x4a, 0x58, 0x5e, 0x5e, 0x02, 0xe7, 0xc0, 0x18, 0x09, 0xf5, 0xb1, 0xaa, 0x56, 0x9b, 0xf0, + 0xc6, 0x48, 0x08, 0xdf, 0x82, 0x99, 0x42, 0x4a, 0x1f, 0x97, 0xfd, 0xee, 0x79, 0xdf, 0x2c, 0x7d, + 0xe9, 0x9b, 0x77, 0x5b, 0x84, 0x1f, 0xf4, 0x9a, 0x36, 0xa2, 0x1d, 0xf5, 0xa1, 0xea, 0x51, 0x67, + 0x61, 0xdb, 0xe1, 0xc7, 0x09, 0x66, 0xf6, 0x33, 0x8c, 0x06, 0x7d, 0x73, 0x21, 0x53, 0x2b, 0x88, + 0x2c, 0xef, 0x9a, 0x14, 0x2e, 0x83, 0x29, 0x4e, 0xdb, 0x38, 0x7e, 0xa0, 0x4f, 0x08, 0x7a, 0x4f, + 0x45, 0x05, 0xde, 0xd0, 0x27, 0x87, 0xf0, 0x06, 0xec, 0x02, 0x88, 0x7a, 0x69, 0x8a, 0x63, 0xee, + 0xb3, 0x6e, 0xca, 0xfd, 0x24, 0x25, 0x08, 0xeb, 0x53, 0xd2, 0xda, 0xd3, 0x91, 0xad, 0x2d, 0x66, + 0xd6, 0x58, 0x42, 0x15, 0x93, 0xe5, 0x2d, 0x28, 0xfa, 0x9d, 0x6e, 0xca, 0xb7, 0x05, 0x04, 0x0f, + 0xc0, 0x6c, 0x2e, 0xc9, 0x09, 0x6a, 0xeb, 0x65, 0x29, 0xf6, 0x7c, 0x04, 0xb1, 0xad, 0x98, 0x0f, + 0xfa, 0xe6, 0x52, 0x26, 0x36, 0xcc, 0x65, 0x79, 0x15, 0x15, 0xee, 0x12, 0xd4, 0x86, 0xeb, 0x60, + 0x56, 0xa0, 0x3e, 0x4b, 0x02, 0x44, 0xe2, 0x96, 0x3e, 0x2d, 0x0e, 0xc2, 0xbd, 0x71, 0xdd, 0x3b, + 0x9c, 0xb5, 0xbc, 0x8a, 0x08, 0x77, 0xb2, 0x08, 0x9e, 0x6a, 0xe0, 0x56, 0x92, 0x62, 0x44, 0x18, + 0xa1, 0xb1, 0xbf, 0x1f, 0x20, 0x4e, 0x53, 0x3f, 0x50, 0x9f, 0xe5, 0xd3, 0x18, 0xeb, 0x33, 0xd2, + 0xf7, 0xeb, 0x91, 0x7d, 0xdf, 0xce, 0xb4, 0xff, 0x48, 0x6e, 0x79, 0x2b, 0x45, 0x7e, 0x53, 0xa6, + 0x37, 0xb2, 0xe9, 0xbd, 0x8c, 0x31, 0xdc, 0x03, 0xd3, 0xec, 0x5d, 0x90, 0xf8, 0xfb, 0x18, 0xeb, + 0x40, 0x9a, 0xd8, 0x18, 0xf9, 0xa4, 0xe6, 0xd5, 0x49, 0x29, 0x1e, 0xcb, 0x2b, 0x8b, 0xd7, 0x4d, + 0x8c, 0xe1, 0x11, 0xf8, 0x3f, 0x0a, 0x18, 0xf7, 0x8b, 0x7f, 0xca, 0xef, 0x25, 0x61, 0xc0, 0xb1, + 0x5e, 0xa9, 0x6a, 0xb5, 0xca, 0xda, 0xaa, 0x9d, 0xad, 0x98, 0x9d, 0xaf, 0x98, 0xbd, 0x9b, 0xaf, + 0x98, 0x5b, 0x13, 0x36, 0x06, 0x7d, 0xf3, 0xa6, 0xfa, 0x43, 0x7f, 0x45, 0x63, 0x9d, 0x7c, 0x35, + 0x35, 0x6f, 0x49, 0xe4, 0x5e, 0xe4, 0xa9, 0x57, 0x32, 0x03, 0xdf, 0x83, 0x79, 0x71, 0x45, 0xf8, + 0xc5, 0x0e, 0x32, 0x7d, 0xb6, 0x3a, 0x5e, 0xab, 0xac, 0x3d, 0xb1, 0xff, 0xe9, 0xba, 0xb0, 0xb7, + 0xf2, 0x46, 0x4f, 0xee, 0xae, 0x6b, 0x28, 0x3f, 0xcb, 0x6a, 0xe2, 0x3f, 0x93, 0x5b, 0xde, 0x9c, + 0x40, 0x8a, 0x26, 0xb6, 0xbe, 0xf8, 0xe1, 0xcc, 0x2c, 0x9d, 0x9e, 0x99, 0xa5, 0x4f, 0x1f, 0xeb, + 0x93, 0x62, 0xdd, 0xb7, 0xdc, 0xbd, 0xf3, 0x4b, 0x43, 0xbb, 0xb8, 0x34, 0xb4, 0x6f, 0x97, 0x86, + 0x76, 0x72, 0x65, 0x94, 0x2e, 0xae, 0x8c, 0xd2, 0xe7, 0x2b, 0xa3, 0xf4, 0xc6, 0x1d, 0x9a, 0xb5, + 0xb2, 0x57, 0x8f, 0x82, 0x26, 0xcb, 0x03, 0xe7, 0xb0, 0xf1, 0xc8, 0x39, 0xfa, 0xdd, 0x3d, 0xd3, + 0xa1, 0x21, 0x8e, 0x9a, 0x53, 0x72, 0x88, 0x0f, 0x7f, 0x04, 0x00, 0x00, 0xff, 0xff, 0x5f, 0xdd, + 0x26, 0x5b, 0x3a, 0x05, 0x00, 0x00, } func (m *Pool) Marshal() (dAtA []byte, err error) { @@ -158,6 +162,20 @@ func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.PoolIncentives) > 0 { + for iNdEx := len(m.PoolIncentives) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.PoolIncentives[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPool(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x62 + } + } n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastLiquidityUpdate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastLiquidityUpdate):]) if err1 != nil { return 0, err1 @@ -297,6 +315,12 @@ func (m *Pool) Size() (n int) { n += 1 + l + sovPool(uint64(l)) l = github_com_gogo_protobuf_types.SizeOfStdTime(m.LastLiquidityUpdate) n += 1 + l + sovPool(uint64(l)) + if len(m.PoolIncentives) > 0 { + for _, e := range m.PoolIncentives { + l = e.Size() + n += 1 + l + sovPool(uint64(l)) + } + } return n } @@ -672,6 +696,40 @@ func (m *Pool) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolIncentives", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPool + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PoolIncentives = append(m.PoolIncentives, types1.IncentiveRecord{}) + if err := m.PoolIncentives[len(m.PoolIncentives)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPool(dAtA[iNdEx:]) diff --git a/x/concentrated-liquidity/store.go b/x/concentrated-liquidity/store.go index b5d98f0ecbc..11b9af6a238 100644 --- a/x/concentrated-liquidity/store.go +++ b/x/concentrated-liquidity/store.go @@ -5,7 +5,6 @@ import ( "fmt" "strconv" "strings" - "time" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/gogo/protobuf/proto" @@ -102,75 +101,3 @@ func ParseFullPositionFromBytes(key, value []byte) (types.FullPositionByOwnerRes Liquidity: positionValue.Liquidity, }, nil } - -// ParseFullIncentiveRecordFromBz parses a IncentiveRecord from a byte array. -// Returns a struct containing the denom and min uptime associated with the incentive record. -// Returns an error if the byte array is empty. -// Returns an error if fails to parse. -func ParseIncentiveRecordFromBz(bz []byte) (incentiveRecord types.IncentiveRecord, err error) { - if len(bz) == 0 { - return types.IncentiveRecord{}, errors.New("incentive record not found") - } - err = proto.Unmarshal(bz, &incentiveRecord) - if err != nil { - return types.IncentiveRecord{}, err - } - - return incentiveRecord, nil -} - -// ParseIncentiveRecordFromBz parses an incentive record from a byte array. -// Returns a struct containing the state associated with the incentive. -// Returns an error if the byte array is empty. -// Returns an error if fails to parse. -func ParseFullIncentiveRecordFromBz(key []byte, value []byte) (incentiveRecord types.IncentiveRecord, err error) { - if len(key) == 0 { - return types.IncentiveRecord{}, errors.New("key not found") - } - if len(value) == 0 { - return types.IncentiveRecord{}, fmt.Errorf("value not found for key (%s)", value) - } - - keyStr := string(key) - - // These may include irrelevant parts of the prefix such as the module prefix. - incentiveRecordKeyComponents := strings.Split(keyStr, types.KeySeparator) - - // We only care about the last 3 components, which are: - // - pool id - // - incentive denom - // - min uptime - - relevantIncentiveKeyComponents := incentiveRecordKeyComponents[len(incentiveRecordKeyComponents)-3:] - - incentivePrefix := incentiveRecordKeyComponents[0] - if incentivePrefix != string(types.IncentivePrefix) { - return types.IncentiveRecord{}, fmt.Errorf("Wrong incentive prefix, got: %v, required %v", []byte(incentivePrefix), types.IncentivePrefix) - } - - poolId, err := strconv.ParseUint(relevantIncentiveKeyComponents[0], 10, 64) - if err != nil { - return types.IncentiveRecord{}, err - } - - incentiveDenom := relevantIncentiveKeyComponents[1] - - minUptime, err := strconv.ParseUint(relevantIncentiveKeyComponents[2], 10, 64) - if err != nil { - return types.IncentiveRecord{}, err - } - - incentiveValue, err := ParseIncentiveRecordFromBz(value) - if err != nil { - return types.IncentiveRecord{}, err - } - - return types.IncentiveRecord{ - PoolId: poolId, - IncentiveDenom: incentiveDenom, - RemainingAmount: incentiveValue.RemainingAmount, - EmissionRate: incentiveValue.EmissionRate, - StartTime: incentiveValue.StartTime, - MinUptime: time.Duration(minUptime), - }, nil -} diff --git a/x/concentrated-liquidity/types/errors.go b/x/concentrated-liquidity/types/errors.go index f128fdcc938..8c126372ef0 100644 --- a/x/concentrated-liquidity/types/errors.go +++ b/x/concentrated-liquidity/types/errors.go @@ -223,13 +223,3 @@ type PositionStillFrozenError struct { func (e PositionStillFrozenError) Error() string { return fmt.Sprintf("position is still frozen until %s", e.FrozenUntil) } - -type IncentiveRecordNotFoundError struct { - PoolId uint64 - IncentiveDenom string - MinUptime time.Duration -} - -func (e IncentiveRecordNotFoundError) Error() string { - return fmt.Sprintf("incentive record not found. pool id (%d), incentive denom (%s), minimum uptime (%s)", e.PoolId, e.IncentiveDenom, e.MinUptime.String()) -} diff --git a/x/concentrated-liquidity/types/incentive_record.pb.go b/x/concentrated-liquidity/types/incentive_record.pb.go index 3767d065026..f87edef6fc0 100644 --- a/x/concentrated-liquidity/types/incentive_record.pb.go +++ b/x/concentrated-liquidity/types/incentive_record.pb.go @@ -31,20 +31,19 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // IncentiveRecord represents an active perpetual incentive gauge for a pool type IncentiveRecord struct { - PoolId uint64 `protobuf:"varint,1,opt,name=poolId,proto3" json:"poolId,omitempty"` // incentive_denom is the denom of the token being distributed as part of this // incentive record - IncentiveDenom string `protobuf:"bytes,2,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` + IncentiveDenom string `protobuf:"bytes,1,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` // remaining_amount is the total amount of incentives to be distributed - RemainingAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=remaining_amount,json=remainingAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"remaining_amount" yaml:"remaining_amount"` + RemainingAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=remaining_amount,json=remainingAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"remaining_amount" yaml:"remaining_amount"` // emission_rate is the incentive emission rate per second - EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"swap_fee"` + EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"swap_fee"` // start_time is the time when the incentive starts distributing - StartTime time.Time `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` + StartTime time.Time `protobuf:"bytes,4,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` // min_uptime is the minimum uptime required for liquidity to qualify for this // incentive. It should be always be one of the supported uptimes in // types.SupportedUptimes - MinUptime time.Duration `protobuf:"bytes,6,opt,name=min_uptime,json=minUptime,proto3,stdduration" json:"min_uptime" yaml:"min_uptime"` + MinUptime time.Duration `protobuf:"bytes,5,opt,name=min_uptime,json=minUptime,proto3,stdduration" json:"min_uptime" yaml:"min_uptime"` } func (m *IncentiveRecord) Reset() { *m = IncentiveRecord{} } @@ -80,13 +79,6 @@ func (m *IncentiveRecord) XXX_DiscardUnknown() { var xxx_messageInfo_IncentiveRecord proto.InternalMessageInfo -func (m *IncentiveRecord) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - func (m *IncentiveRecord) GetIncentiveDenom() string { if m != nil { return m.IncentiveDenom @@ -117,36 +109,35 @@ func init() { } var fileDescriptor_9d38bf94e42ee434 = []byte{ - // 460 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0xcd, 0x8e, 0xd3, 0x30, - 0x18, 0x6c, 0xd8, 0xa5, 0xd2, 0x9a, 0x9f, 0x42, 0x84, 0x20, 0x5b, 0x89, 0xa4, 0x8a, 0x04, 0xf4, - 0xd2, 0x58, 0xe5, 0xe7, 0xc2, 0x6d, 0xab, 0x5e, 0x7a, 0x8d, 0x40, 0x20, 0x84, 0x14, 0x39, 0x89, - 0x1b, 0x2c, 0x62, 0x7f, 0x21, 0x76, 0x0a, 0x7d, 0x8b, 0x3d, 0xf2, 0x48, 0x7b, 0xdc, 0x23, 0xe2, - 0x50, 0x50, 0xfb, 0x06, 0xfb, 0x04, 0x28, 0x8e, 0x93, 0xad, 0x8a, 0x38, 0x70, 0x6a, 0x67, 0x32, - 0x33, 0xdf, 0xe7, 0xb1, 0xd1, 0x2b, 0x90, 0x1c, 0x24, 0x93, 0x38, 0x01, 0x91, 0x50, 0xa1, 0x4a, - 0xa2, 0x68, 0x3a, 0xc9, 0xd9, 0x97, 0x8a, 0xa5, 0x4c, 0xad, 0x31, 0xd3, 0x2c, 0x5b, 0xd1, 0xa8, - 0xa4, 0x09, 0x94, 0x69, 0x50, 0x94, 0xa0, 0xc0, 0x7e, 0x62, 0x6c, 0xc1, 0xbe, 0xad, 0x73, 0x05, - 0xab, 0x69, 0x4c, 0x15, 0x99, 0x0e, 0x4f, 0x13, 0xad, 0x8b, 0xb4, 0x09, 0x37, 0xa0, 0x49, 0x18, - 0x3e, 0xc8, 0x20, 0x83, 0x86, 0xaf, 0xff, 0x19, 0xd6, 0xcb, 0x00, 0xb2, 0x9c, 0x62, 0x8d, 0xe2, - 0x6a, 0x89, 0x15, 0xe3, 0x54, 0x2a, 0xc2, 0x0b, 0x23, 0x70, 0x0f, 0x05, 0x69, 0x55, 0x12, 0xc5, - 0x40, 0x34, 0xdf, 0xfd, 0xdd, 0x11, 0x1a, 0x2c, 0xda, 0x9d, 0x43, 0xbd, 0xb2, 0xfd, 0x10, 0xf5, - 0x0b, 0x80, 0x7c, 0x91, 0x3a, 0xd6, 0xc8, 0x1a, 0x1f, 0x87, 0x06, 0xd9, 0xcf, 0xd0, 0xe0, 0xfa, - 0x78, 0x29, 0x15, 0xc0, 0x9d, 0x1b, 0x23, 0x6b, 0x7c, 0x12, 0xde, 0xed, 0xe8, 0x79, 0xcd, 0xda, - 0x0a, 0xdd, 0x2b, 0x29, 0x27, 0x4c, 0x30, 0x91, 0x45, 0x84, 0x43, 0x25, 0x94, 0x73, 0x54, 0x2b, - 0x67, 0x8b, 0x8b, 0x8d, 0xd7, 0xfb, 0xb9, 0xf1, 0x9e, 0x66, 0x4c, 0x7d, 0xaa, 0xe2, 0x20, 0x01, - 0x6e, 0x8e, 0x69, 0x7e, 0x26, 0x32, 0xfd, 0x8c, 0xd5, 0xba, 0xa0, 0x32, 0x98, 0xd3, 0xe4, 0x6a, - 0xe3, 0x3d, 0x5a, 0x13, 0x9e, 0xbf, 0xf6, 0x0f, 0xf3, 0xfc, 0x70, 0xd0, 0x51, 0x67, 0x9a, 0xb1, - 0x97, 0xe8, 0x0e, 0xe5, 0x4c, 0x4a, 0x06, 0x22, 0xaa, 0xfb, 0x75, 0x8e, 0xf5, 0xc8, 0xb3, 0xff, - 0x1e, 0x39, 0x68, 0x46, 0xca, 0xaf, 0xa4, 0x88, 0x96, 0x94, 0xfa, 0xe1, 0xed, 0x36, 0x37, 0x24, - 0x8a, 0xda, 0xef, 0x11, 0x92, 0x8a, 0x94, 0x2a, 0xaa, 0xbb, 0x76, 0x6e, 0x8e, 0xac, 0xf1, 0xad, - 0xe7, 0xc3, 0xa0, 0xe9, 0x39, 0x68, 0x7b, 0x0e, 0xde, 0xb4, 0x17, 0x31, 0x7b, 0x5c, 0x2f, 0x70, - 0xb5, 0xf1, 0xee, 0x9b, 0xd8, 0xce, 0xeb, 0x9f, 0xff, 0xf2, 0xac, 0xf0, 0x44, 0x13, 0xb5, 0xdc, - 0x7e, 0x87, 0x10, 0x67, 0x22, 0xaa, 0x0a, 0x9d, 0xdc, 0xd7, 0xc9, 0xa7, 0x7f, 0x25, 0xcf, 0xcd, - 0x0d, 0x1e, 0x06, 0x5f, 0x5b, 0xfd, 0xef, 0x3a, 0x98, 0x33, 0xf1, 0x56, 0xe3, 0xd9, 0xc7, 0x8b, - 0xad, 0x6b, 0x5d, 0x6e, 0x5d, 0xeb, 0xf7, 0xd6, 0xb5, 0xce, 0x77, 0x6e, 0xef, 0x72, 0xe7, 0xf6, - 0x7e, 0xec, 0xdc, 0xde, 0x87, 0xd9, 0x5e, 0x2b, 0xe6, 0x8d, 0x4e, 0x72, 0x12, 0xcb, 0x16, 0xe0, - 0xd5, 0xf4, 0x25, 0xfe, 0xf6, 0xaf, 0xd7, 0xae, 0x5b, 0x8b, 0xfb, 0x7a, 0xb5, 0x17, 0x7f, 0x02, - 0x00, 0x00, 0xff, 0xff, 0xb1, 0xa4, 0x92, 0xf5, 0x1c, 0x03, 0x00, 0x00, + // 447 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0x4f, 0x8f, 0x94, 0x30, + 0x18, 0xc6, 0xc1, 0x55, 0x93, 0xad, 0x7f, 0x50, 0x62, 0x22, 0x3b, 0x89, 0xb0, 0x21, 0x51, 0xf7, + 0x32, 0x6d, 0xc6, 0x3f, 0x17, 0x6f, 0x4b, 0xe6, 0xb2, 0x57, 0xa2, 0xd1, 0x18, 0x13, 0x52, 0xa0, + 0x83, 0x8d, 0xb4, 0x45, 0x5a, 0x46, 0xe7, 0x5b, 0xec, 0xd1, 0x8f, 0xb4, 0x89, 0x97, 0x3d, 0x1a, + 0x0f, 0x68, 0x66, 0xbe, 0xc1, 0x7e, 0x02, 0x43, 0x29, 0xcc, 0x64, 0x8c, 0x07, 0x4f, 0xf0, 0x3e, + 0xbc, 0xcf, 0xef, 0x7d, 0xfb, 0x50, 0xf0, 0x52, 0x48, 0x26, 0x24, 0x95, 0x28, 0x13, 0x3c, 0x23, + 0x5c, 0xd5, 0x58, 0x91, 0x7c, 0x5a, 0xd2, 0xcf, 0x0d, 0xcd, 0xa9, 0x5a, 0x21, 0xaa, 0x55, 0xba, + 0x24, 0x49, 0x4d, 0x32, 0x51, 0xe7, 0xb0, 0xaa, 0x85, 0x12, 0xee, 0x63, 0x63, 0x83, 0xbb, 0xb6, + 0xd1, 0x05, 0x97, 0xb3, 0x94, 0x28, 0x3c, 0x9b, 0x1c, 0x65, 0xba, 0x2f, 0xd1, 0x26, 0xd4, 0x17, + 0x3d, 0x61, 0xf2, 0xa0, 0x10, 0x85, 0xe8, 0xf5, 0xee, 0xcd, 0xa8, 0x41, 0x21, 0x44, 0x51, 0x12, + 0xa4, 0xab, 0xb4, 0x59, 0x20, 0x45, 0x19, 0x91, 0x0a, 0xb3, 0xca, 0x34, 0xf8, 0xfb, 0x0d, 0x79, + 0x53, 0x63, 0x45, 0x05, 0xef, 0xbf, 0x87, 0xdf, 0x0f, 0x80, 0x73, 0x36, 0xec, 0x1c, 0xeb, 0x95, + 0xdd, 0xa7, 0xc0, 0xd9, 0x1e, 0x23, 0x27, 0x5c, 0x30, 0xcf, 0x3e, 0xb6, 0x4f, 0x0e, 0xe3, 0xbb, + 0xa3, 0x3c, 0xef, 0x54, 0x57, 0x81, 0x7b, 0x35, 0x61, 0x98, 0x72, 0xca, 0x8b, 0x04, 0x33, 0xd1, + 0x70, 0xe5, 0x5d, 0xeb, 0x3a, 0xa3, 0xb3, 0x8b, 0x36, 0xb0, 0x7e, 0xb6, 0xc1, 0x93, 0x82, 0xaa, + 0x8f, 0x4d, 0x0a, 0x33, 0xc1, 0xcc, 0x71, 0xcc, 0x63, 0x2a, 0xf3, 0x4f, 0x48, 0xad, 0x2a, 0x22, + 0xe1, 0x9c, 0x64, 0x57, 0x6d, 0xf0, 0x70, 0x85, 0x59, 0xf9, 0x2a, 0xdc, 0xe7, 0x85, 0xb1, 0x33, + 0x4a, 0xa7, 0x5a, 0x71, 0x17, 0xe0, 0x0e, 0x61, 0x54, 0x4a, 0x2a, 0x78, 0xd2, 0xe5, 0xe8, 0x1d, + 0xe8, 0x91, 0xa7, 0xff, 0x3d, 0xd2, 0xe9, 0x47, 0xca, 0x2f, 0xb8, 0x4a, 0x16, 0x84, 0x84, 0xf1, + 0xed, 0x81, 0x1b, 0x63, 0x45, 0xdc, 0x77, 0x00, 0x48, 0x85, 0x6b, 0x95, 0x74, 0x99, 0x7a, 0xd7, + 0x8f, 0xed, 0x93, 0x5b, 0xcf, 0x26, 0xb0, 0xcf, 0x13, 0x0e, 0x79, 0xc2, 0xd7, 0x43, 0xe0, 0xd1, + 0xa3, 0x6e, 0x81, 0xab, 0x36, 0xb8, 0x6f, 0xb0, 0xa3, 0x37, 0x3c, 0xff, 0x15, 0xd8, 0xf1, 0xa1, + 0x16, 0xba, 0x76, 0xf7, 0x2d, 0x00, 0x8c, 0xf2, 0xa4, 0xa9, 0x34, 0xf9, 0x86, 0x26, 0x1f, 0xfd, + 0x45, 0x9e, 0x9b, 0x3f, 0xb5, 0x0f, 0xde, 0x5a, 0xc3, 0x6f, 0x1a, 0xcc, 0x28, 0x7f, 0xa3, 0xeb, + 0xe8, 0xc3, 0xc5, 0xda, 0xb7, 0x2f, 0xd7, 0xbe, 0xfd, 0x7b, 0xed, 0xdb, 0xe7, 0x1b, 0xdf, 0xba, + 0xdc, 0xf8, 0xd6, 0x8f, 0x8d, 0x6f, 0xbd, 0x8f, 0x76, 0x52, 0x31, 0x77, 0x71, 0x5a, 0xe2, 0x54, + 0x0e, 0x05, 0x5a, 0xce, 0x5e, 0xa0, 0xaf, 0xff, 0xba, 0xd5, 0x3a, 0xb5, 0xf4, 0xa6, 0x5e, 0xed, + 0xf9, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4f, 0x18, 0x98, 0xbc, 0x04, 0x03, 0x00, 0x00, } func (m *IncentiveRecord) Marshal() (dAtA []byte, err error) { @@ -176,7 +167,7 @@ func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= n1 i = encodeVarintIncentiveRecord(dAtA, i, uint64(n1)) i-- - dAtA[i] = 0x32 + dAtA[i] = 0x2a n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) if err2 != nil { return 0, err2 @@ -184,7 +175,7 @@ func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= n2 i = encodeVarintIncentiveRecord(dAtA, i, uint64(n2)) i-- - dAtA[i] = 0x2a + dAtA[i] = 0x22 { size := m.EmissionRate.Size() i -= size @@ -194,7 +185,7 @@ func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintIncentiveRecord(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a { size := m.RemainingAmount.Size() i -= size @@ -204,18 +195,13 @@ func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintIncentiveRecord(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 if len(m.IncentiveDenom) > 0 { i -= len(m.IncentiveDenom) copy(dAtA[i:], m.IncentiveDenom) i = encodeVarintIncentiveRecord(dAtA, i, uint64(len(m.IncentiveDenom))) i-- - dAtA[i] = 0x12 - } - if m.PoolId != 0 { - i = encodeVarintIncentiveRecord(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -237,9 +223,6 @@ func (m *IncentiveRecord) Size() (n int) { } var l int _ = l - if m.PoolId != 0 { - n += 1 + sovIncentiveRecord(uint64(m.PoolId)) - } l = len(m.IncentiveDenom) if l > 0 { n += 1 + l + sovIncentiveRecord(uint64(l)) @@ -291,25 +274,6 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowIncentiveRecord - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field IncentiveDenom", wireType) } @@ -341,7 +305,7 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { } m.IncentiveDenom = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field RemainingAmount", wireType) } @@ -375,7 +339,7 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field EmissionRate", wireType) } @@ -409,7 +373,7 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) } @@ -442,7 +406,7 @@ func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 6: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field MinUptime", wireType) } diff --git a/x/concentrated-liquidity/types/keys.go b/x/concentrated-liquidity/types/keys.go index 5d5f7038fe9..d07d654761b 100644 --- a/x/concentrated-liquidity/types/keys.go +++ b/x/concentrated-liquidity/types/keys.go @@ -20,10 +20,9 @@ const ( // Key prefixes var ( - TickPrefix = []byte{0x01} - PositionPrefix = []byte{0x02} - PoolPrefix = []byte{0x03} - IncentivePrefix = []byte{0x04} + TickPrefix = []byte{0x01} + PositionPrefix = []byte{0x02} + PoolPrefix = []byte{0x03} ) // TickIndexToBytes converts a tick index to a byte slice. Negative tick indexes @@ -88,11 +87,3 @@ func KeyUserPositions(addr sdk.AccAddress) []byte { func KeyPool(poolId uint64) []byte { return []byte(fmt.Sprintf("%s%d", PoolPrefix, poolId)) } - -func KeyIncentiveRecord(poolId uint64, denom string, minUptime time.Duration) []byte { - return []byte(fmt.Sprintf("%s%s%d%s%s%s%d", IncentivePrefix, KeySeparator, poolId, KeySeparator, denom, KeySeparator, uint64(minUptime))) -} - -func KeyPoolIncentiveRecords(poolId uint64) []byte { - return []byte(fmt.Sprintf("%s%s%d", IncentivePrefix, KeySeparator, poolId)) -} diff --git a/x/concentrated-liquidity/types/pool.go b/x/concentrated-liquidity/types/pool.go index d6808514069..6829b4d5f58 100644 --- a/x/concentrated-liquidity/types/pool.go +++ b/x/concentrated-liquidity/types/pool.go @@ -20,9 +20,11 @@ type ConcentratedPoolExtension interface { GetTickSpacing() uint64 GetLiquidity() sdk.Dec GetLastLiquidityUpdate() time.Time + GetPoolIncentives() []IncentiveRecord SetCurrentSqrtPrice(newSqrtPrice sdk.Dec) SetCurrentTick(newTick sdk.Int) SetLastLiquidityUpdate(newTime time.Time) + SetPoolIncentives(updatedRecords []IncentiveRecord) UpdateLiquidity(newLiquidity sdk.Dec) ApplySwap(newLiquidity sdk.Dec, newCurrentTick sdk.Int, newCurrentSqrtPrice sdk.Dec) error From ad3938fdad842a31a44ecb265f12ed96c20c5e22 Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 13 Feb 2023 06:00:00 -0800 Subject: [PATCH 060/136] set incentive records in new position tests --- x/concentrated-liquidity/position.go | 3 ++- x/concentrated-liquidity/position_test.go | 11 ++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index b9f6d0edb69..455530f5a89 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -36,7 +36,8 @@ func (k Keeper) getOrInitPosition( // initOrUpdatePosition checks to see if the specified owner has an existing position at the given tick range. // If a position is not present, it initializes the position with the provided liquidity delta. -// If a position is present, it combines the existing liquidity in that position with the provided liquidity delta. +// If a position is present, it combines the existing liquidity in that position with the provided liquidity delta. It also +// bumps up all uptime accumulators to current time, including the ones the new position isn't eligible for. func (k Keeper) initOrUpdatePosition( ctx sdk.Context, poolId uint64, diff --git a/x/concentrated-liquidity/position_test.go b/x/concentrated-liquidity/position_test.go index b5fcedefadc..327cb2a4655 100644 --- a/x/concentrated-liquidity/position_test.go +++ b/x/concentrated-liquidity/position_test.go @@ -14,7 +14,8 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { validPoolId = 1 invalidPoolId = 2 ) - defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + // defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + defaultIncentiveRecords := []types.IncentiveRecord{incentiveRecordOne, incentiveRecordTwo, incentiveRecordThree, incentiveRecordFour} type param struct { poolId uint64 lowerTick int64 @@ -29,6 +30,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { param param positionExists bool timeElapsedSinceInit time.Duration + incentiveRecords []types.IncentiveRecord expectedLiquidity sdk.Dec expectedErr error }{ @@ -41,9 +43,11 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { liquidityDelta: DefaultLiquidityAmt, }, timeElapsedSinceInit: time.Hour, + incentiveRecords: defaultIncentiveRecords, positionExists: false, expectedLiquidity: DefaultLiquidityAmt, }, + /* { name: "Update position from -50 to 50 that already contains DefaultLiquidityAmt liquidity with DefaultLiquidityAmt more liquidity", param: param{ @@ -89,6 +93,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { positionExists: false, expectedErr: types.NegativeLiquidityError{Liquidity: DefaultLiquidityAmt.Neg()}, }, + */ } for _, test := range tests { @@ -114,7 +119,8 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { s.Require().Equal(getExpectedUptimes().emptyExpectedAccumValues, initUptimeAccumValues) } - // TODO: implement setIncentiveRecord(takes in array of IncentiveRecords) & set to test.poolIncentiveRecords + // Set incentives for pool to ensure accumulators work correctly + s.App.ConcentratedLiquidityKeeper.SetMultipleIncentiveRecords(s.Ctx, test.incentiveRecords) // If positionExists set, initialize the specified position with defaultLiquidityAmt preexistingLiquidity := sdk.ZeroDec() @@ -210,7 +216,6 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { if test.positionExists { // if positionExists: timeElapsed / test.param.liquidityDelta (or defaultLiquidityAmt if we make that change) // TODO: - // - incentive records are set (will very likely need to replace old get/set fns since they don't touch state) // - implemented uptimeGrowthToValueGrowth helper (returns DECCOINS, see use below) // - implemented getQualifyingUptimes(frozenUntil) which tells us which of these to populate From 3859c0bb7178b3ff027cdd52010c9577673af83a Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 13 Feb 2023 06:02:11 -0800 Subject: [PATCH 061/136] fix merge conflicts --- x/concentrated-liquidity/types/errors.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x/concentrated-liquidity/types/errors.go b/x/concentrated-liquidity/types/errors.go index fa06712a8e2..daf824c767c 100644 --- a/x/concentrated-liquidity/types/errors.go +++ b/x/concentrated-liquidity/types/errors.go @@ -232,6 +232,8 @@ type IncentiveRecordNotFoundError struct { func (e IncentiveRecordNotFoundError) Error() string { return fmt.Sprintf("incentive record not found. pool id (%d), incentive denom (%s), minimum uptime (%s)", e.PoolId, e.IncentiveDenom, e.MinUptime.String()) +} + type QueryRangeUnsupportedError struct { RequestedRange sdk.Int MaxRange sdk.Int From deaf70c18fc96d2e9a7e560347a7f4e8ac32ff26 Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 13 Feb 2023 07:17:17 -0800 Subject: [PATCH 062/136] add check for init position record values --- x/concentrated-liquidity/position_test.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/x/concentrated-liquidity/position_test.go b/x/concentrated-liquidity/position_test.go index 327cb2a4655..c7883fd1d6f 100644 --- a/x/concentrated-liquidity/position_test.go +++ b/x/concentrated-liquidity/position_test.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/osmosis-labs/osmosis/osmoutils/accum" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" ) @@ -14,7 +15,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { validPoolId = 1 invalidPoolId = 2 ) - // defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) defaultIncentiveRecords := []types.IncentiveRecord{incentiveRecordOne, incentiveRecordTwo, incentiveRecordThree, incentiveRecordFour} type param struct { poolId uint64 @@ -59,6 +60,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { positionExists: true, expectedLiquidity: DefaultLiquidityAmt.Add(DefaultLiquidityAmt), }, + */ { name: "Update position from -50 to 50 that already contains DefaultLiquidityAmt liquidity with DefaultLiquidityAmt more liquidity with an hour freeze duration", param: param{ @@ -71,6 +73,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { positionExists: true, expectedLiquidity: DefaultLiquidityAmt.Add(DefaultLiquidityAmt), }, + /* { name: "Init position for non-existing pool", param: param{ @@ -203,13 +206,17 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { s.Require().NoError(err) if test.param.frozenUntil.Sub(s.Ctx.BlockTime()) >= uptime { s.Require().True(recordExists) + + // Ensure position's record is set to accum's current value (i.e. position + // init of update resets its uptime) + positionRecord, err := accum.GetPosition(uptimeAccums[uptimeIndex], positionName) + s.Require().NoError(err) + posInitAccumValue := positionRecord.InitAccumValue + s.Require().Equal(uptimeAccums[uptimeIndex].GetValue(), posInitAccumValue) } else { s.Require().False(recordExists) } - // TODO: ensure record's init value is accum's current value (requires public GetPosition or GetPositionValue) - // TODO: ensureLastLiquidityUpdate time is moved up to now - // TODO: consider abstracting this whole thing below into a test helper // Ensure uptime accumulator has been moved up by the correct amount and related incentive record has been deducted newUptimeAccumValues, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulatorValues(s.Ctx, test.param.poolId) From 2661c584e1793c367486890e941be796c5b967cb Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 13 Feb 2023 11:37:09 -0800 Subject: [PATCH 063/136] fix and finalize uptime accum position tests --- x/concentrated-liquidity/position_test.go | 108 +++++++++++----------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/x/concentrated-liquidity/position_test.go b/x/concentrated-liquidity/position_test.go index c7883fd1d6f..190b6fd76a9 100644 --- a/x/concentrated-liquidity/position_test.go +++ b/x/concentrated-liquidity/position_test.go @@ -6,6 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/osmosis-labs/osmosis/osmoutils/accum" + cl "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" ) @@ -17,6 +18,8 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { ) defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) defaultIncentiveRecords := []types.IncentiveRecord{incentiveRecordOne, incentiveRecordTwo, incentiveRecordThree, incentiveRecordFour} + supportedUptimes := types.SupportedUptimes + emptyAccumValues := getExpectedUptimes().emptyExpectedAccumValues type param struct { poolId uint64 lowerTick int64 @@ -48,7 +51,6 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { positionExists: false, expectedLiquidity: DefaultLiquidityAmt, }, - /* { name: "Update position from -50 to 50 that already contains DefaultLiquidityAmt liquidity with DefaultLiquidityAmt more liquidity", param: param{ @@ -60,7 +62,6 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { positionExists: true, expectedLiquidity: DefaultLiquidityAmt.Add(DefaultLiquidityAmt), }, - */ { name: "Update position from -50 to 50 that already contains DefaultLiquidityAmt liquidity with DefaultLiquidityAmt more liquidity with an hour freeze duration", param: param{ @@ -70,10 +71,11 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { frozenUntil: defaultFrozenUntil, liquidityDelta: DefaultLiquidityAmt, }, + timeElapsedSinceInit: time.Hour, + incentiveRecords: defaultIncentiveRecords, positionExists: true, expectedLiquidity: DefaultLiquidityAmt.Add(DefaultLiquidityAmt), }, - /* { name: "Init position for non-existing pool", param: param{ @@ -96,7 +98,6 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { positionExists: false, expectedErr: types.NegativeLiquidityError{Liquidity: DefaultLiquidityAmt.Neg()}, }, - */ } for _, test := range tests { @@ -105,7 +106,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { s.Setup() // Set blocktime to fixed UTC value for consistency - s.Ctx = s.Ctx.WithBlockTime(time.Unix(0, 0).UTC()) + s.Ctx = s.Ctx.WithBlockTime(time.Unix(1, 1).UTC()) // Create a default CL pool clPool := s.PrepareConcentratedPool() @@ -195,72 +196,71 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { // Check that the initialized or updated position matches our expectation s.Require().Equal(test.expectedLiquidity, positionInfo.Liquidity) - // Check that the relevant uptime accumulators were properly checkpointed - positionName := string(types.KeyFullPosition(validPoolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.frozenUntil)) - uptimeAccums, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulators(s.Ctx, test.param.poolId) + // ---Tests for ensuring uptime accumulators behaved as expected--- + + // Get updated accumulators and accum values + newUptimeAccums, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulators(s.Ctx, test.param.poolId) s.Require().NoError(err) + newUptimeAccumValues, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulatorValues(s.Ctx, test.param.poolId) + s.Require().NoError(err) + + // Setup for checks + actualUptimeAccumDelta, expectedUptimeAccumValueGrowth, expectedIncentiveRecords, expectedGrowthCurAccum := emptyAccumValues, emptyAccumValues, test.incentiveRecords, sdk.DecCoins{} + freezePeriod := test.param.frozenUntil.Sub(s.Ctx.BlockTime()) + timeElapsedSec := sdk.NewDec(int64(test.timeElapsedSinceInit)).Quo(sdk.NewDec(10e8)) + positionName := string(types.KeyFullPosition(validPoolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.frozenUntil)) + + // Loop through each supported uptime for pool and ensure that: + // 1. Position is properly updated on it + // 2. Accum value has changed by the correct amount + for uptimeIndex, uptime := range supportedUptimes { - // If frozen for more than a specific uptime's period, the record should exist - for uptimeIndex, uptime := range types.SupportedUptimes { - recordExists, err := uptimeAccums[uptimeIndex].HasPosition(positionName) + // Position-related checks + + // If frozen for more than a specific uptime's period, the record should exist + recordExists, err := newUptimeAccums[uptimeIndex].HasPosition(positionName) s.Require().NoError(err) - if test.param.frozenUntil.Sub(s.Ctx.BlockTime()) >= uptime { + if freezePeriod >= uptime { s.Require().True(recordExists) - // Ensure position's record is set to accum's current value (i.e. position - // init of update resets its uptime) - positionRecord, err := accum.GetPosition(uptimeAccums[uptimeIndex], positionName) + // Ensure position's record has correct values + positionRecord, err := accum.GetPosition(newUptimeAccums[uptimeIndex], positionName) s.Require().NoError(err) - posInitAccumValue := positionRecord.InitAccumValue - s.Require().Equal(uptimeAccums[uptimeIndex].GetValue(), posInitAccumValue) + s.Require().Equal(newUptimeAccums[uptimeIndex].GetValue(), positionRecord.InitAccumValue) + s.Require().Equal(test.expectedLiquidity, positionRecord.NumShares) } else { s.Require().False(recordExists) } - // TODO: consider abstracting this whole thing below into a test helper - // Ensure uptime accumulator has been moved up by the correct amount and related incentive record has been deducted - newUptimeAccumValues, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulatorValues(s.Ctx, test.param.poolId) + // Accumulator value related checks + if test.positionExists { - // if positionExists: timeElapsed / test.param.liquidityDelta (or defaultLiquidityAmt if we make that change) - // TODO: - // - implemented uptimeGrowthToValueGrowth helper (returns DECCOINS, see use below) - // - implemented getQualifyingUptimes(frozenUntil) which tells us which of these to populate - - /* uncomment when above TODOs are completed - - // Uptime growth should be the same for all qualifying uptimes since there is only one position - uptimeGrowthForQualifying := test.param.liquidityDelta.QuoInt64(int64(test.timeElapsedSinceInit)) - - // Uptime accumulators only grow in proportion to the incentives being distributed - uptimeAccumValueGrowth := uptimeGrowthToValueGrowth(uptimeGrowth sdk.Dec, incentiveRecords []types.IncentiveRecord) - - // Might even be good to have a "populateDecCoins" helper that takes in one value and indices to add it to, but do that later - qualifyingUptimes := getQualifyingUptimes(test.param.frozenUntil) - - // If there are no incentive records, we expect this to be unchanged/empty - expectedUptimeGrowthValues := initUpinitUptimeAccumValues - if len(incentiveRecords) > 0 { - for i, _ := range initUpinitUptimeAccumValues { - if strings.Contains(qualifyingUptimes.String(), i.String()) { - expectedUptimeGrowthValues[i] = expectedUptimeGrowthValues[i].Add(uptimeAccumValueGrowth) - } - // Otherwise it remains unchanged - } + // Track how much the current uptime accum has grown by + actualUptimeAccumDelta[uptimeIndex] = newUptimeAccumValues[uptimeIndex].Sub(initUptimeAccumValues[uptimeIndex]) + if timeElapsedSec.GT(sdk.ZeroDec()) { + expectedGrowthCurAccum, expectedIncentiveRecords, err = cl.CalcAccruedIncentivesForAccum(s.Ctx, uptime, test.param.liquidityDelta, timeElapsedSec, expectedIncentiveRecords) + s.Require().NoError(err) + expectedUptimeAccumValueGrowth[uptimeIndex] = expectedGrowthCurAccum } - */ - - // Check here that incentive records have been charged (using chargeIncentive to set expected vals) } else { - // if no position init, should be empty + // if no position init, should remain empty s.Require().NoError(err) - s.Require().Equal(initUptimeAccumValues, newUptimeAccumValues) + s.Require().Equal(initUptimeAccumValues[uptimeIndex], newUptimeAccumValues[uptimeIndex]) } + } + + // Ensure uptime accumulators have grown by the expected amount + s.Require().Equal(expectedUptimeAccumValueGrowth, actualUptimeAccumDelta) - // Future test cases: - // - init liq qualifying for diff uptimes - // - init liq across multiple positions - // - multiple positions back to back (updateUptimeAccumsToNow does check this though) + // Ensure incentive records have been properly updated in state. Note that we do a two-way contains check since records + // get reordered lexicographically by denom in state. + actualIncentiveRecords, err := s.App.ConcentratedLiquidityKeeper.GetAllIncentiveRecordsForPool(s.Ctx, test.param.poolId) + s.Require().NoError(err) + for i := range expectedIncentiveRecords { + s.Require().Contains(expectedIncentiveRecords, actualIncentiveRecords[i]) + s.Require().Contains(actualIncentiveRecords, expectedIncentiveRecords[i]) } + }) } } From 4c7f17803272b6111c35fbde2c264c11dc287e27 Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 13 Feb 2023 11:53:44 -0800 Subject: [PATCH 064/136] fix go mod for e2e --- go.mod | 2 +- go.sum | 4 ++-- go.work.sum | 7 ++++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index f8ae6d6de50..a350045e5ea 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/ory/dockertest/v3 v3.9.1 github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 - github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230202172735-45df290354da + github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 diff --git a/go.sum b/go.sum index 4ac24b29720..dc07737d1c9 100644 --- a/go.sum +++ b/go.sum @@ -864,8 +864,8 @@ github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 h1:Ylmch github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3/go.mod h1:lV6KnqXYD/ayTe7310MHtM3I2q8Z6bBfMAi+bhwPYtI= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 h1:+EbINXzHQyDtHje2CND357A22H2zUpceTtwJClC9IAM= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260/go.mod h1:KrzYoNtnWUH75rj1XAsSR4nymlHFU7jeVOx7/1KMe0k= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230202172735-45df290354da h1:LMGHxYmP+kWexaKttI1cI8T72JPDyljkD6lCr/1jqGg= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230202172735-45df290354da/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a h1:iak0C103qoiYVVxzvMTo+bOD8tLC/jZ2RPhbKMS5t9Q= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 h1:Ov+gyEBpU2hJkLIFAHCcQZwehCSCXFNYzqQY1zJqSXk= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8/go.mod h1:Kh2V4fLvLM4/EagRX53CYDJnILAz9NzCCETKXoH/sno= github.com/osmosis-labs/wasmd v0.29.2-0.20221222131554-7c8ea36a6e30 h1:6uMi7HhPSwvKKU7j5NqljseFTEz4I7qHr+IPnnn42Ck= diff --git a/go.work.sum b/go.work.sum index d6fc8942981..04ffc80a7f4 100644 --- a/go.work.sum +++ b/go.work.sum @@ -387,6 +387,7 @@ contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EU contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= +filippo.io/edwards25519 v1.0.0-beta.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= @@ -540,6 +541,7 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IU github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-metrics v0.3.11/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 h1:BUAU3CGlLvorLI26FmByPp2eC2qla6E1Tw+scpcg/to= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a h1:pv34s756C4pEXnjgPfGYgdhg/ZdajGhyOvzx8k+23nw= @@ -1152,6 +1154,7 @@ github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpT github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c/go.mod h1:fHzc09UnyJyqyW+bFuq864eh+wC7dj65aXmXLRe5to0= +github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87/go.mod h1:XGsKKeXxeRr95aEOgipvluMPlgjr7dGlk9ZTWOjcUcg= github.com/holiman/uint256 v1.1.1 h1:4JywC80b+/hSfljFlEBLHrrh+CIONLDz9NuFl0af4Mw= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= @@ -1260,6 +1263,7 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743 h1:143Bb8f8DuGWck/xpNUOckBVYfFbBTnLevfRZ1aVVqo= github.com/lightstep/lightstep-tracer-go v0.18.1 h1:vi1F1IQ8N7hNWytK9DpJsUfQhGuNSc19z330K6vl4zk= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= @@ -1428,6 +1432,7 @@ github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je4 github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.20.0/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= github.com/onsi/gomega v1.22.0/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= @@ -1661,7 +1666,6 @@ github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 h1:gIlAHnH1 github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 h1:njlZPzLwU639dk2kqnCPPv+wNjq7Xb6EfUxe/oX0/NM= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/strangelove-ventures/packet-forward-middleware/v4 v4.0.4/go.mod h1:AG8F5pdk3x1h7PlRvPoMem3623W+w8HJHrWYkVJ51kk= github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e h1:mOtuXaRAbVZsxAHVdPR3IjfmN8T1h2iczJLynhLybf8= @@ -1974,6 +1978,7 @@ golang.org/x/net v0.0.0-20220726230323-06994584191e/go.mod h1:AaygXjzTFtRAg2ttMY golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221017152216-f25eb7ecb193/go.mod h1:RpDiru2p0u2F0lLpEoqnP2+7xs0ifAuOcJ442g6GU2s= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= From a6365392f67c8adcc3f39c5c74f0b1691c63bb37 Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 13 Feb 2023 12:08:28 -0800 Subject: [PATCH 065/136] clean up diff --- x/concentrated-liquidity/tick.go | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index d1ed52ccded..37bc5f4d13a 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -60,34 +60,13 @@ func (k Keeper) crossTick(ctx sdk.Context, poolId uint64, tickIndex int64) (liqu return sdk.Dec{}, err } - feeAccum, err := k.getFeeAccumulator(ctx, poolId) + accum, err := k.getFeeAccumulator(ctx, poolId) if err != nil { return sdk.Dec{}, err } // subtract tick's fee growth outside from current fee accumulator - tickInfo.FeeGrowthOutside = feeAccum.GetValue().Sub(tickInfo.FeeGrowthOutside) - - /* Uncomment when TODOs below are implemented - uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) - if err != nil { - return sdk.Dec{}, err - } - */ - - // TODO: update global accums to now before uptime outside changes - // k.updateUptimeAccumulatorsToNow(ctx, poolId) - // TODO: test - - // TODO: initialize tick-level uptime trackers when initTick - // for each supported uptime, subtract tick's uptime growth outside from the respective uptime accumulator - /* - for uptimeId, uptimeAccum := range uptimeAccums { - curUptimeTracker := tickInfo.UptimeTrackers[uptimeId] - curUptimeTracker.UptimeGrowthOutside = uptimeAccum.GetValue().Sub(curUptimeTracker.UptimeGrowthOutside) - } - */ - + tickInfo.FeeGrowthOutside = accum.GetValue().Sub(tickInfo.FeeGrowthOutside) k.SetTickInfo(ctx, poolId, tickIndex, tickInfo) return tickInfo.LiquidityNet, nil From ee5c2c6fb1946daa56061cc87323c9b3bd8abc2c Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 13 Feb 2023 12:13:48 -0800 Subject: [PATCH 066/136] add err check to accum update --- x/concentrated-liquidity/position.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 455530f5a89..0a89532e499 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -69,7 +69,10 @@ func (k Keeper) initOrUpdatePosition( // We update accumulators _prior_ to any position-related updates to ensure // past rewards aren't distributed to new liquidity. We also update pool's // LastLiquidityUpdate here. - k.updateUptimeAccumulatorsToNow(ctx, poolId) + err = k.updateUptimeAccumulatorsToNow(ctx, poolId) + if err != nil { + return err + } // Create records for relevant uptime accumulators here. uptimeAccumulators, err := k.getUptimeAccumulators(ctx, poolId) From 5407223a3e12b1849e8bb20534f878971e3b3036 Mon Sep 17 00:00:00 2001 From: alpo Date: Wed, 15 Feb 2023 18:12:21 -0800 Subject: [PATCH 067/136] fix rounding error --- x/concentrated-liquidity/incentives.go | 2 +- x/concentrated-liquidity/incentives_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index cb31d798e59..c3c179e0ab0 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -193,7 +193,7 @@ func calcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, q // Incentives to emit per unit of qualifying liquidity = total emitted / qualifying liquidity // Note that we truncate to ensure we do not overdistribute incentives - incentivesPerLiquidity := totalEmittedAmount.Quo(qualifyingLiquidity) + incentivesPerLiquidity := totalEmittedAmount.QuoTruncate(qualifyingLiquidity) emittedIncentivesPerLiquidity := sdk.NewDecCoinFromDec(incentiveRecord.IncentiveDenom, incentivesPerLiquidity) // Ensure that we only emit if there are enough incentives remaining to be emitted diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index eec6b21845c..17b18cd4105 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -122,7 +122,7 @@ func wrapUptimeTrackers(accumValues []sdk.DecCoins) []model.UptimeTracker { func expectedIncentives(denom string, rate sdk.Dec, timeElapsed time.Duration, qualifyingLiquidity sdk.Dec) sdk.DecCoin { timeInSec := sdk.NewDec(int64(timeElapsed)).Quo(sdk.MustNewDecFromStr("1000000000")) - amount := rate.Mul(timeInSec).Quo(qualifyingLiquidity) + amount := rate.Mul(timeInSec).QuoTruncate(qualifyingLiquidity) return sdk.NewDecCoinFromDec(denom, amount) } From 83bd08fdaafd175d985edcbce328bd1f17d87df5 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 16 Feb 2023 15:19:46 -0800 Subject: [PATCH 068/136] implement tick init uptime tracker logic --- x/concentrated-liquidity/tick.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index 37bc5f4d13a..8e113521477 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -91,7 +91,18 @@ func (k Keeper) getTickInfo(ctx sdk.Context, poolId uint64, tickIndex int64) (ti return tickStruct, err } - return model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: initialFeeGrowthOutside}, nil + // We also initialize the uptime trackers for the new tick + globaUptimeAccumValues, err := k.getUptimeAccumulatorValues(ctx, poolId) + if err != nil { + return tickStruct, err + } + + initialUptimeTrackers := []model.UptimeTracker{} + for _, uptimeValue := range globaUptimeAccumValues { + initialUptimeTrackers = append(initialUptimeTrackers, model.UptimeTracker{UptimeGrowthOutside: uptimeValue}) + } + + return model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: initialFeeGrowthOutside, UptimeTrackers: initialUptimeTrackers}, nil } if err != nil { return tickStruct, err From acd94eba3a2eed1ed3d8ff5a121b72ace824d358 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 16 Feb 2023 15:23:56 -0800 Subject: [PATCH 069/136] fix test compatibility --- x/concentrated-liquidity/tick_test.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/x/concentrated-liquidity/tick_test.go b/x/concentrated-liquidity/tick_test.go index 4d829bb7031..619535d2c76 100644 --- a/x/concentrated-liquidity/tick_test.go +++ b/x/concentrated-liquidity/tick_test.go @@ -286,6 +286,8 @@ func (s *KeeperTestSuite) TestInitOrUpdateTick() { func (s *KeeperTestSuite) TestGetTickInfo() { var ( preInitializedTickIndex = DefaultCurrTick.Int64() + 2 + expectedUptimes = getExpectedUptimes() + emptyUptimeTrackers = wrapUptimeTrackers(expectedUptimes.emptyExpectedAccumValues) ) tests := []struct { @@ -299,22 +301,22 @@ func (s *KeeperTestSuite) TestGetTickInfo() { name: "Get tick info on existing pool and existing tick", poolToGet: validPoolId, tickToGet: preInitializedTickIndex, - // Note that FeeGrowthOutside is not updated. - expectedTickInfo: model.TickInfo{LiquidityGross: DefaultLiquidityAmt, LiquidityNet: DefaultLiquidityAmt.Neg()}, + // Note that FeeGrowthOutside and UptimeGrowthOutside(s) are not updated. + expectedTickInfo: model.TickInfo{LiquidityGross: DefaultLiquidityAmt, LiquidityNet: DefaultLiquidityAmt.Neg(), UptimeTrackers: emptyUptimeTrackers}, }, { name: "Get tick info on existing pool with no existing tick (cur pool tick > tick)", poolToGet: validPoolId, tickToGet: DefaultCurrTick.Int64() + 1, - // Note that FeeGrowthOutside is not initialized. - expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec()}, + // Note that FeeGrowthOutside and UptimeGrowthOutside(s) are not initialized. + expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), UptimeTrackers: emptyUptimeTrackers}, }, { name: "Get tick info on existing pool with no existing tick (cur pool tick == tick), initialized fee growth outside", poolToGet: validPoolId, tickToGet: DefaultCurrTick.Int64(), - // Note that FeeGrowthOutside is initialized. - expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: sdk.NewDecCoins(oneEth)}, + // Note that FeeGrowthOutside and UptimeGrowthOutside(s) are initialized. + expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: sdk.NewDecCoins(oneEth), UptimeTrackers: emptyUptimeTrackers}, }, { name: "Get tick info on a non-existing pool with no existing tick", From dde309a0af069f9f3d7065c58961889ba4e1568a Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 16 Feb 2023 15:28:34 -0800 Subject: [PATCH 070/136] implement fix for global accums falling out of sync before tick init --- x/concentrated-liquidity/tick.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index 8e113521477..200f6ab9945 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -91,7 +91,12 @@ func (k Keeper) getTickInfo(ctx sdk.Context, poolId uint64, tickIndex int64) (ti return tickStruct, err } - // We also initialize the uptime trackers for the new tick + // Sync global uptime accumulators to ensure the uptime tracker init values are up to date. + if err := k.updateUptimeAccumulatorsToNow(ctx, poolId); err != nil { + return tickStruct, err + } + + // Initialize uptime trackers for the new tick to current global uptime accum values. globaUptimeAccumValues, err := k.getUptimeAccumulatorValues(ctx, poolId) if err != nil { return tickStruct, err From cc21105ce7880c27222a1d56671bf60e80d46835 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 16 Feb 2023 15:59:46 -0800 Subject: [PATCH 071/136] add tests to ensure uptime trackers are initialized properly --- x/concentrated-liquidity/incentives_test.go | 18 ++++++++++++++++ x/concentrated-liquidity/tick_test.go | 23 +++++++++++++++++---- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index f440fe1db11..72b9040f201 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -139,6 +139,24 @@ func chargeIncentive(incentiveRecord types.IncentiveRecord, timeElapsed time.Dur return incentiveRecord } +func addToUptimeAccums(ctx sdk.Context, clPool types.ConcentratedPoolExtension, clKeeper *cl.Keeper, addValues []sdk.DecCoins) error { + poolUptimeAccumulators, err := clKeeper.GetUptimeAccumulators(ctx, clPool.GetId()) + if err != nil { + return err + } + + for uptimeIndex, uptimeAccum := range poolUptimeAccumulators { + uptimeAccum.AddToAccumulator(addValues[uptimeIndex]) + } + + err = clKeeper.SetPool(ctx, clPool) + if err != nil { + return err + } + + return nil +} + func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulators() { // We expect there to be len(types.SupportedUptimes) number of initialized accumulators // for a successful pool creation. We calculate this upfront to ensure test compatibility diff --git a/x/concentrated-liquidity/tick_test.go b/x/concentrated-liquidity/tick_test.go index 619535d2c76..52d2237589a 100644 --- a/x/concentrated-liquidity/tick_test.go +++ b/x/concentrated-liquidity/tick_test.go @@ -288,12 +288,14 @@ func (s *KeeperTestSuite) TestGetTickInfo() { preInitializedTickIndex = DefaultCurrTick.Int64() + 2 expectedUptimes = getExpectedUptimes() emptyUptimeTrackers = wrapUptimeTrackers(expectedUptimes.emptyExpectedAccumValues) + varyingTokensAndDenoms = wrapUptimeTrackers(expectedUptimes.varyingTokensMultiDenom) ) tests := []struct { name string poolToGet uint64 tickToGet int64 + preInitUptimeAccumValues []sdk.DecCoins expectedTickInfo model.TickInfo expectedErr error }{ @@ -304,6 +306,14 @@ func (s *KeeperTestSuite) TestGetTickInfo() { // Note that FeeGrowthOutside and UptimeGrowthOutside(s) are not updated. expectedTickInfo: model.TickInfo{LiquidityGross: DefaultLiquidityAmt, LiquidityNet: DefaultLiquidityAmt.Neg(), UptimeTrackers: emptyUptimeTrackers}, }, + { + name: "Get tick info on existing pool and existing tick with nonzero global uptime accums", + poolToGet: validPoolId, + tickToGet: preInitializedTickIndex, + preInitUptimeAccumValues: expectedUptimes.varyingTokensMultiDenom, + // Note that FeeGrowthOutside is not updated, but UptimeGrowthOutsides are. + expectedTickInfo: model.TickInfo{LiquidityGross: DefaultLiquidityAmt, LiquidityNet: DefaultLiquidityAmt.Neg(), UptimeTrackers: varyingTokensAndDenoms}, + }, { name: "Get tick info on existing pool with no existing tick (cur pool tick > tick)", poolToGet: validPoolId, @@ -332,10 +342,15 @@ func (s *KeeperTestSuite) TestGetTickInfo() { s.Setup() // Create a default CL pool - s.PrepareConcentratedPool() + clPool := s.PrepareConcentratedPool() + clKeeper := s.App.ConcentratedLiquidityKeeper + + if test.preInitUptimeAccumValues != nil { + addToUptimeAccums(s.Ctx, clPool, clKeeper, test.preInitUptimeAccumValues) + } // Set up an initialized tick - err := s.App.ConcentratedLiquidityKeeper.InitOrUpdateTick(s.Ctx, validPoolId, DefaultCurrTick.Int64(), preInitializedTickIndex, DefaultLiquidityAmt, true) + err := clKeeper.InitOrUpdateTick(s.Ctx, validPoolId, DefaultCurrTick.Int64(), preInitializedTickIndex, DefaultLiquidityAmt, true) s.Require().NoError(err) // Charge fee to make sure that the global fee accumulator is always updated. @@ -343,11 +358,11 @@ func (s *KeeperTestSuite) TestGetTickInfo() { if test.poolToGet == validPoolId { s.SetupDefaultPosition(test.poolToGet) } - err = s.App.ConcentratedLiquidityKeeper.ChargeFee(s.Ctx, validPoolId, oneEth) + err = clKeeper.ChargeFee(s.Ctx, validPoolId, oneEth) s.Require().NoError(err) // System under test - tickInfo, err := s.App.ConcentratedLiquidityKeeper.GetTickInfo(s.Ctx, test.poolToGet, test.tickToGet) + tickInfo, err := clKeeper.GetTickInfo(s.Ctx, test.poolToGet, test.tickToGet) if test.expectedErr != nil { s.Require().Error(err) s.Require().ErrorAs(err, &test.expectedErr) From 5fe763c7ab58935d49ac60a65aed5e6268353f9d Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 16 Feb 2023 17:04:16 -0800 Subject: [PATCH 072/136] add comment for new helper --- x/concentrated-liquidity/incentives_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 72b9040f201..5bb8ac8209a 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -139,6 +139,7 @@ func chargeIncentive(incentiveRecord types.IncentiveRecord, timeElapsed time.Dur return incentiveRecord } +// Helper for adding a predetermined amount to each global uptime accum in clPool func addToUptimeAccums(ctx sdk.Context, clPool types.ConcentratedPoolExtension, clKeeper *cl.Keeper, addValues []sdk.DecCoins) error { poolUptimeAccumulators, err := clKeeper.GetUptimeAccumulators(ctx, clPool.GetId()) if err != nil { From 10919f45d827b3ea9bccc095a2e4583ddd50025c Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 16 Feb 2023 22:39:08 -0800 Subject: [PATCH 073/136] add core logic --- x/concentrated-liquidity/tick.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index 200f6ab9945..cd5f405794c 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -60,13 +60,30 @@ func (k Keeper) crossTick(ctx sdk.Context, poolId uint64, tickIndex int64) (liqu return sdk.Dec{}, err } - accum, err := k.getFeeAccumulator(ctx, poolId) + feeAccum, err := k.getFeeAccumulator(ctx, poolId) if err != nil { return sdk.Dec{}, err } // subtract tick's fee growth outside from current fee accumulator - tickInfo.FeeGrowthOutside = accum.GetValue().Sub(tickInfo.FeeGrowthOutside) + tickInfo.FeeGrowthOutside = feeAccum.GetValue().Sub(tickInfo.FeeGrowthOutside) + + uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) + if err != nil { + return sdk.Dec{}, err + } + + // Uupdate global accums to now before uptime outside changes + if err := k.updateUptimeAccumulatorsToNow(ctx, poolId); err != nil { + return sdk.Dec{}, err + } + + // For each supported uptime, subtract tick's uptime growth outside from the respective uptime accumulator + for uptimeId, uptimeAccum := range uptimeAccums { + curUptimeTracker := tickInfo.UptimeTrackers[uptimeId] + curUptimeTracker.UptimeGrowthOutside = uptimeAccum.GetValue().Sub(curUptimeTracker.UptimeGrowthOutside) + } + k.SetTickInfo(ctx, poolId, tickIndex, tickInfo) return tickInfo.LiquidityNet, nil From a16a58b1e4ab85efe439664a748c97a6bda9d66c Mon Sep 17 00:00:00 2001 From: alpo Date: Sun, 19 Feb 2023 17:48:34 -0800 Subject: [PATCH 074/136] go mod tidy --- go.sum | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/go.sum b/go.sum index 68f08a9a853..dc07737d1c9 100644 --- a/go.sum +++ b/go.sum @@ -864,10 +864,8 @@ github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 h1:Ylmch github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3/go.mod h1:lV6KnqXYD/ayTe7310MHtM3I2q8Z6bBfMAi+bhwPYtI= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 h1:+EbINXzHQyDtHje2CND357A22H2zUpceTtwJClC9IAM= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260/go.mod h1:KrzYoNtnWUH75rj1XAsSR4nymlHFU7jeVOx7/1KMe0k= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230202172735-45df290354da h1:LMGHxYmP+kWexaKttI1cI8T72JPDyljkD6lCr/1jqGg= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230202172735-45df290354da/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230209003939-0f6a3636b356 h1:PY0WzTqli5OeA25BHjv+QSSRNA3MUGGwIS+H7XjH/Cs= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230209003939-0f6a3636b356/go.mod h1:03hogkymr7XTTvBKTJfL2R2ZYcFXiCcM7Pvv7CAZ9ME= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a h1:iak0C103qoiYVVxzvMTo+bOD8tLC/jZ2RPhbKMS5t9Q= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 h1:Ov+gyEBpU2hJkLIFAHCcQZwehCSCXFNYzqQY1zJqSXk= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8/go.mod h1:Kh2V4fLvLM4/EagRX53CYDJnILAz9NzCCETKXoH/sno= github.com/osmosis-labs/wasmd v0.29.2-0.20221222131554-7c8ea36a6e30 h1:6uMi7HhPSwvKKU7j5NqljseFTEz4I7qHr+IPnnn42Ck= From 586e7bdccec9b97a4f6f20de4cadf827d86502c9 Mon Sep 17 00:00:00 2001 From: alpo Date: Sun, 19 Feb 2023 17:58:38 -0800 Subject: [PATCH 075/136] fix conflicts --- go.mod | 4 ++-- go.sum | 4 ++-- go.work.sum | 4 +--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 74f70c29208..26d3621af53 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/CosmWasm/wasmd v0.30.0 github.com/cosmos/cosmos-proto v1.0.0-alpha8 - github.com/cosmos/cosmos-sdk v0.46.10 + github.com/cosmos/cosmos-sdk v0.46.8 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/ibc-go/v4 v4.3.0 github.com/gogo/protobuf v1.3.3 @@ -19,7 +19,7 @@ require ( github.com/ory/dockertest/v3 v3.9.1 github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 - github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a + github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230202172735-45df290354da github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 diff --git a/go.sum b/go.sum index dc07737d1c9..4ac24b29720 100644 --- a/go.sum +++ b/go.sum @@ -864,8 +864,8 @@ github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 h1:Ylmch github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3/go.mod h1:lV6KnqXYD/ayTe7310MHtM3I2q8Z6bBfMAi+bhwPYtI= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 h1:+EbINXzHQyDtHje2CND357A22H2zUpceTtwJClC9IAM= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260/go.mod h1:KrzYoNtnWUH75rj1XAsSR4nymlHFU7jeVOx7/1KMe0k= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a h1:iak0C103qoiYVVxzvMTo+bOD8tLC/jZ2RPhbKMS5t9Q= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230202172735-45df290354da h1:LMGHxYmP+kWexaKttI1cI8T72JPDyljkD6lCr/1jqGg= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230202172735-45df290354da/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 h1:Ov+gyEBpU2hJkLIFAHCcQZwehCSCXFNYzqQY1zJqSXk= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8/go.mod h1:Kh2V4fLvLM4/EagRX53CYDJnILAz9NzCCETKXoH/sno= github.com/osmosis-labs/wasmd v0.29.2-0.20221222131554-7c8ea36a6e30 h1:6uMi7HhPSwvKKU7j5NqljseFTEz4I7qHr+IPnnn42Ck= diff --git a/go.work.sum b/go.work.sum index 351d7464aa8..fdb7be0a737 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1480,7 +1480,7 @@ github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTm github.com/openzipkin/zipkin-go v0.2.5 h1:UwtQQx2pyPIgWYHRg+epgdx1/HnBQTgN3/oIYEJTQzU= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230202172735-45df290354da/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI= github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= @@ -2453,5 +2453,3 @@ sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4= -github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= From efe299ca44e004b87dae31445f9108f01c60620f Mon Sep 17 00:00:00 2001 From: alpo Date: Sun, 19 Feb 2023 18:04:47 -0800 Subject: [PATCH 076/136] fix e2e --- go.mod | 2 +- go.sum | 4 ++-- go.work.sum | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 26d3621af53..0aec5ff474c 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/ory/dockertest/v3 v3.9.1 github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 - github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230202172735-45df290354da + github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 diff --git a/go.sum b/go.sum index 4ac24b29720..dc07737d1c9 100644 --- a/go.sum +++ b/go.sum @@ -864,8 +864,8 @@ github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 h1:Ylmch github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3/go.mod h1:lV6KnqXYD/ayTe7310MHtM3I2q8Z6bBfMAi+bhwPYtI= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 h1:+EbINXzHQyDtHje2CND357A22H2zUpceTtwJClC9IAM= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260/go.mod h1:KrzYoNtnWUH75rj1XAsSR4nymlHFU7jeVOx7/1KMe0k= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230202172735-45df290354da h1:LMGHxYmP+kWexaKttI1cI8T72JPDyljkD6lCr/1jqGg= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230202172735-45df290354da/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a h1:iak0C103qoiYVVxzvMTo+bOD8tLC/jZ2RPhbKMS5t9Q= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 h1:Ov+gyEBpU2hJkLIFAHCcQZwehCSCXFNYzqQY1zJqSXk= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8/go.mod h1:Kh2V4fLvLM4/EagRX53CYDJnILAz9NzCCETKXoH/sno= github.com/osmosis-labs/wasmd v0.29.2-0.20221222131554-7c8ea36a6e30 h1:6uMi7HhPSwvKKU7j5NqljseFTEz4I7qHr+IPnnn42Ck= diff --git a/go.work.sum b/go.work.sum index fdb7be0a737..04ffc80a7f4 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1480,7 +1480,7 @@ github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTm github.com/openzipkin/zipkin-go v0.2.5 h1:UwtQQx2pyPIgWYHRg+epgdx1/HnBQTgN3/oIYEJTQzU= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230202172735-45df290354da/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI= github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= From 4df25258b73cd3af7bbb6146fa9317a842d3bf3f Mon Sep 17 00:00:00 2001 From: alpo Date: Sun, 19 Feb 2023 18:32:31 -0800 Subject: [PATCH 077/136] update go mod --- go.mod | 4 ++-- go.sum | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 0aec5ff474c..2593f468689 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/CosmWasm/wasmd v0.30.0 github.com/cosmos/cosmos-proto v1.0.0-alpha8 - github.com/cosmos/cosmos-sdk v0.46.8 + github.com/cosmos/cosmos-sdk v0.46.10 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/ibc-go/v4 v4.3.0 github.com/gogo/protobuf v1.3.3 @@ -19,7 +19,7 @@ require ( github.com/ory/dockertest/v3 v3.9.1 github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 - github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a + github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230220020447-efe299ca44e0 github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 diff --git a/go.sum b/go.sum index dc07737d1c9..71df74c4604 100644 --- a/go.sum +++ b/go.sum @@ -864,8 +864,8 @@ github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 h1:Ylmch github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3/go.mod h1:lV6KnqXYD/ayTe7310MHtM3I2q8Z6bBfMAi+bhwPYtI= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 h1:+EbINXzHQyDtHje2CND357A22H2zUpceTtwJClC9IAM= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260/go.mod h1:KrzYoNtnWUH75rj1XAsSR4nymlHFU7jeVOx7/1KMe0k= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a h1:iak0C103qoiYVVxzvMTo+bOD8tLC/jZ2RPhbKMS5t9Q= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230205215450-2961572f877a/go.mod h1:iD6Wq2g6bEIG51uohesQXUXCKadW3yqjCkIk1uPhCNE= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230220020447-efe299ca44e0 h1:IFNAXHnGoardt/1RQd1efwM/22GUtwJLhR1qQFZKsh4= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230220020447-efe299ca44e0/go.mod h1:/WgLS5/cEgBnR/C6pLQjujGceD/G5i0jDsEEeqvIpgI= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 h1:Ov+gyEBpU2hJkLIFAHCcQZwehCSCXFNYzqQY1zJqSXk= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8/go.mod h1:Kh2V4fLvLM4/EagRX53CYDJnILAz9NzCCETKXoH/sno= github.com/osmosis-labs/wasmd v0.29.2-0.20221222131554-7c8ea36a6e30 h1:6uMi7HhPSwvKKU7j5NqljseFTEz4I7qHr+IPnnn42Ck= From 736820bbb816490d56b8bd3fb8cd6e581499c55d Mon Sep 17 00:00:00 2001 From: alpo Date: Sun, 19 Feb 2023 23:10:40 -0800 Subject: [PATCH 078/136] fix and further test tick init logic --- x/concentrated-liquidity/tick.go | 6 ++-- x/concentrated-liquidity/tick_test.go | 44 +++++++++++++++++++-------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index 4d5494a04bc..5c7063776c8 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -100,14 +100,14 @@ func (k Keeper) getTickInfo(ctx sdk.Context, poolId uint64, tickIndex int64) (ti } // Initialize uptime trackers for the new tick to current global uptime accum values. - globaUptimeAccumValues, err := k.getUptimeAccumulatorValues(ctx, poolId) + valuesToAdd, err := k.getInitialUptimeGrowthOutsidesForTick(ctx, poolId, tickIndex) if err != nil { return tickStruct, err } initialUptimeTrackers := []model.UptimeTracker{} - for _, uptimeValue := range globaUptimeAccumValues { - initialUptimeTrackers = append(initialUptimeTrackers, model.UptimeTracker{UptimeGrowthOutside: uptimeValue}) + for _, uptimeTrackerValue := range valuesToAdd { + initialUptimeTrackers = append(initialUptimeTrackers, model.UptimeTracker{UptimeGrowthOutside: uptimeTrackerValue}) } return model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: initialFeeGrowthOutside, UptimeTrackers: initialUptimeTrackers}, nil diff --git a/x/concentrated-liquidity/tick_test.go b/x/concentrated-liquidity/tick_test.go index 33c547ad4b0..bbc55a78b40 100644 --- a/x/concentrated-liquidity/tick_test.go +++ b/x/concentrated-liquidity/tick_test.go @@ -298,18 +298,18 @@ func (s *KeeperTestSuite) TestInitOrUpdateTick() { func (s *KeeperTestSuite) TestGetTickInfo() { var ( preInitializedTickIndex = DefaultCurrTick.Int64() + 2 - expectedUptimes = getExpectedUptimes() - emptyUptimeTrackers = wrapUptimeTrackers(expectedUptimes.emptyExpectedAccumValues) - varyingTokensAndDenoms = wrapUptimeTrackers(expectedUptimes.varyingTokensMultiDenom) + expectedUptimes = getExpectedUptimes() + emptyUptimeTrackers = wrapUptimeTrackers(expectedUptimes.emptyExpectedAccumValues) + varyingTokensAndDenoms = wrapUptimeTrackers(expectedUptimes.varyingTokensMultiDenom) ) tests := []struct { - name string - poolToGet uint64 - tickToGet int64 + name string + poolToGet uint64 + tickToGet int64 preInitUptimeAccumValues []sdk.DecCoins - expectedTickInfo model.TickInfo - expectedErr error + expectedTickInfo model.TickInfo + expectedErr error }{ { name: "Get tick info on existing pool and existing tick", @@ -319,12 +319,30 @@ func (s *KeeperTestSuite) TestGetTickInfo() { expectedTickInfo: model.TickInfo{LiquidityGross: DefaultLiquidityAmt, LiquidityNet: DefaultLiquidityAmt.Neg(), UptimeTrackers: emptyUptimeTrackers}, }, { - name: "Get tick info on existing pool and existing tick with nonzero global uptime accums", - poolToGet: validPoolId, - tickToGet: preInitializedTickIndex, + name: "Get tick info on existing pool and existing tick with init but zero global uptime accums", + poolToGet: validPoolId, + tickToGet: preInitializedTickIndex, preInitUptimeAccumValues: expectedUptimes.varyingTokensMultiDenom, // Note that FeeGrowthOutside is not updated, but UptimeGrowthOutsides are. - expectedTickInfo: model.TickInfo{LiquidityGross: DefaultLiquidityAmt, LiquidityNet: DefaultLiquidityAmt.Neg(), UptimeTrackers: varyingTokensAndDenoms}, + // We expect uptime trackers to be initialized to global uptime accums since tick >= active tick + expectedTickInfo: model.TickInfo{LiquidityGross: DefaultLiquidityAmt, LiquidityNet: DefaultLiquidityAmt.Neg(), UptimeTrackers: emptyUptimeTrackers}, + }, + { + name: "Get tick info on existing pool and existing tick with nonzero global uptime accums", + poolToGet: validPoolId, + tickToGet: preInitializedTickIndex - 3, + preInitUptimeAccumValues: expectedUptimes.varyingTokensMultiDenom, + // Note that FeeGrowthOutside is not updated, but UptimeGrowthOutsides are. + // We expect uptime trackers to be initialized to zero since tick < active tick + expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: sdk.NewDecCoins(oneEth), UptimeTrackers: varyingTokensAndDenoms}, + }, + { + name: "Get tick info for active tick on existing pool with existing tick", + poolToGet: validPoolId, + tickToGet: DefaultCurrTick.Int64(), + preInitUptimeAccumValues: expectedUptimes.varyingTokensMultiDenom, + // Uptime trackers are set to global since tickToGet >= current tick + expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: sdk.NewDecCoins(oneEth), UptimeTrackers: varyingTokensAndDenoms}, }, { name: "Get tick info on existing pool with no existing tick (cur pool tick > tick)", @@ -381,6 +399,7 @@ func (s *KeeperTestSuite) TestGetTickInfo() { s.Require().Equal(model.TickInfo{}, tickInfo) } else { s.Require().NoError(err) + clPool, err = clKeeper.GetPoolById(s.Ctx, validPoolId) s.Require().Equal(test.expectedTickInfo, tickInfo) } }) @@ -651,7 +670,6 @@ func (s *KeeperTestSuite) TestValidateTickRangeIsValid() { expectedError: types.InvalidTickError{Tick: DefaultMinTick - 2, IsLower: false, MinTick: DefaultMinTick, MaxTick: DefaultMaxTick}, }, { - name: "upper tick is greater than max tick", lowerTick: 2, upperTick: DefaultMaxTick + 2, From ea20428d67b5a55b233a1756a9b9bedc0419ed6c Mon Sep 17 00:00:00 2001 From: alpo Date: Tue, 21 Feb 2023 19:30:15 -0800 Subject: [PATCH 079/136] remove redundant values from incentive record state --- ...cord.proto => incentive_record_body.proto} | 25 +- .../osmosis/concentrated-liquidity/pool.proto | 1 - x/concentrated-liquidity/incentives.go | 20 +- x/concentrated-liquidity/model/pool.pb.go | 80 ++- x/concentrated-liquidity/store.go | 18 +- .../types/incentive_record.go | 30 + .../types/incentive_record.pb.go | 582 ------------------ .../types/incentive_record_body.pb.go | 436 +++++++++++++ 8 files changed, 535 insertions(+), 657 deletions(-) rename proto/osmosis/concentrated-liquidity/{incentive_record.proto => incentive_record_body.proto} (57%) create mode 100644 x/concentrated-liquidity/types/incentive_record.go delete mode 100644 x/concentrated-liquidity/types/incentive_record.pb.go create mode 100644 x/concentrated-liquidity/types/incentive_record_body.pb.go diff --git a/proto/osmosis/concentrated-liquidity/incentive_record.proto b/proto/osmosis/concentrated-liquidity/incentive_record_body.proto similarity index 57% rename from proto/osmosis/concentrated-liquidity/incentive_record.proto rename to proto/osmosis/concentrated-liquidity/incentive_record_body.proto index b1b9674c18a..8cde39e4dd2 100644 --- a/proto/osmosis/concentrated-liquidity/incentive_record.proto +++ b/proto/osmosis/concentrated-liquidity/incentive_record_body.proto @@ -8,41 +8,26 @@ import "google/protobuf/duration.proto"; option go_package = "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types"; -// IncentiveRecord represents an active perpetual incentive gauge for a pool -message IncentiveRecord { - uint64 poolId = 1; - - // incentive_denom is the denom of the token being distributed as part of this - // incentive record - string incentive_denom = 2; - +// IncentiveRecordBody represents an active perpetual incentive gauge for a pool +message IncentiveRecordBody { // remaining_amount is the total amount of incentives to be distributed - string remaining_amount = 3 [ + string remaining_amount = 1 [ (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.moretags) = "yaml:\"remaining_amount\"", (gogoproto.nullable) = false ]; // emission_rate is the incentive emission rate per second - string emission_rate = 4 [ + string emission_rate = 2 [ (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.moretags) = "yaml:\"swap_fee\"", (gogoproto.nullable) = false ]; // start_time is the time when the incentive starts distributing - google.protobuf.Timestamp start_time = 5 [ + google.protobuf.Timestamp start_time = 3 [ (gogoproto.nullable) = false, (gogoproto.stdtime) = true, (gogoproto.moretags) = "yaml:\"start_time\"" ]; - - // min_uptime is the minimum uptime required for liquidity to qualify for this - // incentive. It should be always be one of the supported uptimes in - // types.SupportedUptimes - google.protobuf.Duration min_uptime = 6 [ - (gogoproto.nullable) = false, - (gogoproto.stdduration) = true, - (gogoproto.moretags) = "yaml:\"min_uptime\"" - ]; } \ No newline at end of file diff --git a/proto/osmosis/concentrated-liquidity/pool.proto b/proto/osmosis/concentrated-liquidity/pool.proto index 3d6e1c24e82..7f9928c870b 100644 --- a/proto/osmosis/concentrated-liquidity/pool.proto +++ b/proto/osmosis/concentrated-liquidity/pool.proto @@ -8,7 +8,6 @@ package osmosis.concentratedliquidity.v1beta1; import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; -import "osmosis/concentrated-liquidity/incentive_record.proto"; option go_package = "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model"; diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 7eb809fb2ba..a2dd059b7db 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -224,7 +224,12 @@ func calcAccruedIncentivesForAccum(ctx sdk.Context, accumUptime time.Duration, q func (k Keeper) setIncentiveRecord(ctx sdk.Context, incentiveRecord types.IncentiveRecord) { store := ctx.KVStore(k.storeKey) key := types.KeyIncentiveRecord(incentiveRecord.PoolId, incentiveRecord.IncentiveDenom, incentiveRecord.MinUptime) - osmoutils.MustSet(store, key, &incentiveRecord) + incentiveRecordBody := types.IncentiveRecordBody{ + RemainingAmount: incentiveRecord.RemainingAmount, + EmissionRate: incentiveRecord.EmissionRate, + StartTime: incentiveRecord.StartTime, + } + osmoutils.MustSet(store, key, &incentiveRecordBody) } // nolint: unused @@ -238,10 +243,10 @@ func (k Keeper) setMultipleIncentiveRecords(ctx sdk.Context, incentiveRecords [] // GetIncentiveRecord gets the incentive record corresponding to the passed in values from store func (k Keeper) GetIncentiveRecord(ctx sdk.Context, poolId uint64, denom string, minUptime time.Duration) (types.IncentiveRecord, error) { store := ctx.KVStore(k.storeKey) - incentiveStruct := types.IncentiveRecord{} + incentiveBodyStruct := types.IncentiveRecordBody{} key := types.KeyIncentiveRecord(poolId, denom, minUptime) - found, err := osmoutils.Get(store, key, &incentiveStruct) + found, err := osmoutils.Get(store, key, &incentiveBodyStruct) if err != nil { return types.IncentiveRecord{}, err } @@ -250,7 +255,14 @@ func (k Keeper) GetIncentiveRecord(ctx sdk.Context, poolId uint64, denom string, return types.IncentiveRecord{}, types.IncentiveRecordNotFoundError{PoolId: poolId, IncentiveDenom: denom, MinUptime: minUptime} } - return incentiveStruct, nil + return types.IncentiveRecord{ + PoolId: poolId, + IncentiveDenom: denom, + MinUptime: minUptime, + RemainingAmount: incentiveBodyStruct.RemainingAmount, + EmissionRate: incentiveBodyStruct.EmissionRate, + StartTime: incentiveBodyStruct.StartTime, + }, nil } // GetAllIncentiveRecordsForPool gets all the incentive records for poolId diff --git a/x/concentrated-liquidity/model/pool.pb.go b/x/concentrated-liquidity/model/pool.pb.go index abdc73e85e6..630bfdefc9f 100644 --- a/x/concentrated-liquidity/model/pool.pb.go +++ b/x/concentrated-liquidity/model/pool.pb.go @@ -16,7 +16,6 @@ import ( proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" io "io" math "math" math_bits "math/bits" @@ -96,46 +95,45 @@ func init() { } var fileDescriptor_3526ea5373d96c9a = []byte{ - // 617 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0xcd, 0x4e, 0xdb, 0x4c, - 0x14, 0x8d, 0xf9, 0x20, 0xc0, 0x04, 0xf1, 0xc1, 0xd0, 0x1f, 0x83, 0xda, 0x18, 0x59, 0x6d, 0x95, - 0x4a, 0x8d, 0xdd, 0xf4, 0x67, 0xc3, 0x8e, 0xb4, 0x45, 0x42, 0xaa, 0x54, 0x64, 0x68, 0x17, 0x15, - 0x92, 0x3b, 0x19, 0x0f, 0x61, 0x14, 0xdb, 0xe3, 0xcc, 0x4c, 0x28, 0xbc, 0x41, 0x97, 0x2c, 0x59, - 0xf2, 0x10, 0x7d, 0x08, 0xd4, 0x15, 0xcb, 0xaa, 0x0b, 0xb7, 0x22, 0x6f, 0x10, 0xa9, 0xfb, 0xca, - 0xe3, 0xb1, 0xc9, 0xa2, 0x3f, 0xca, 0xca, 0x73, 0xef, 0xb9, 0xf7, 0x9c, 0x73, 0x3d, 0x73, 0xc1, - 0x43, 0x26, 0x22, 0x26, 0xa8, 0x70, 0x31, 0x8b, 0x31, 0x89, 0x25, 0x47, 0x92, 0x04, 0xcd, 0x90, - 0xf6, 0x07, 0x34, 0xa0, 0xf2, 0xc4, 0x4d, 0x18, 0x0b, 0x9d, 0x84, 0x33, 0xc9, 0xe0, 0x7d, 0x5d, - 0xea, 0x8c, 0x97, 0x96, 0x95, 0xce, 0x51, 0xab, 0x43, 0x24, 0x6a, 0xad, 0xad, 0x62, 0x55, 0xe7, - 0xab, 0x26, 0x37, 0x0f, 0x72, 0x86, 0xb5, 0x1b, 0x5d, 0xd6, 0x65, 0x79, 0x3e, 0x3b, 0xe9, 0xac, - 0xd5, 0x65, 0xac, 0x1b, 0x12, 0x57, 0x45, 0x9d, 0xc1, 0x81, 0x2b, 0x69, 0x44, 0x84, 0x44, 0x51, - 0xa2, 0x0b, 0x9e, 0xff, 0xc3, 0x23, 0x55, 0x59, 0x7a, 0x44, 0x7c, 0x4e, 0x30, 0xe3, 0x41, 0xde, - 0x66, 0xff, 0xac, 0x82, 0xe9, 0x1d, 0xc6, 0x42, 0xf8, 0x08, 0xcc, 0xa2, 0x20, 0xe0, 0x44, 0x08, - 0xd3, 0x58, 0x37, 0x1a, 0xf3, 0x6d, 0x38, 0x4a, 0xad, 0xc5, 0x13, 0x14, 0x85, 0x1b, 0xb6, 0x06, - 0x6c, 0xaf, 0x28, 0x81, 0x8b, 0x60, 0x8a, 0x06, 0xe6, 0xd4, 0xba, 0xd1, 0x98, 0xf6, 0xa6, 0x68, - 0x00, 0x3f, 0x80, 0xf9, 0x52, 0xca, 0xfc, 0x4f, 0xf5, 0xb7, 0x2f, 0x52, 0xab, 0xf2, 0x2d, 0xb5, - 0x1e, 0x74, 0xa9, 0x3c, 0x1c, 0x74, 0x1c, 0xcc, 0x22, 0x3d, 0xa8, 0xfe, 0x34, 0x45, 0xd0, 0x73, - 0xe5, 0x49, 0x42, 0x84, 0xf3, 0x92, 0xe0, 0x51, 0x6a, 0x2d, 0xe5, 0x6a, 0x25, 0x91, 0xed, 0x5d, - 0x93, 0xc2, 0x5b, 0xa0, 0x2a, 0x59, 0x8f, 0xc4, 0x8f, 0xcd, 0xe9, 0x8c, 0xde, 0xd3, 0x51, 0x99, - 0x6f, 0x99, 0x33, 0x63, 0xf9, 0x16, 0xec, 0x03, 0x88, 0x07, 0x9c, 0x93, 0x58, 0xfa, 0xa2, 0xcf, - 0xa5, 0x9f, 0x70, 0x8a, 0x89, 0x59, 0x55, 0xd6, 0x5e, 0x4c, 0x6c, 0x6d, 0x39, 0xb7, 0x26, 0x12, - 0xa6, 0x99, 0x6c, 0x6f, 0x49, 0xd3, 0xef, 0xf6, 0xb9, 0xdc, 0xc9, 0x52, 0xf0, 0x10, 0x2c, 0x14, - 0x92, 0x92, 0xe2, 0x9e, 0x39, 0xab, 0xc4, 0x5e, 0x4d, 0x20, 0xb6, 0x1d, 0xcb, 0x51, 0x6a, 0xad, - 0xe4, 0x62, 0xe3, 0x5c, 0xb6, 0x57, 0xd3, 0xe1, 0x1e, 0xc5, 0x3d, 0xb8, 0x01, 0x16, 0xb2, 0xac, - 0x2f, 0x12, 0x84, 0x69, 0xdc, 0x35, 0xe7, 0xb2, 0x8b, 0x68, 0xdf, 0xbe, 0xee, 0x1d, 0x47, 0x6d, - 0xaf, 0x96, 0x85, 0xbb, 0x79, 0x04, 0xcf, 0x0c, 0x70, 0x37, 0xe1, 0x04, 0x53, 0x41, 0x59, 0xec, - 0x1f, 0x20, 0x2c, 0x19, 0xf7, 0x91, 0x1e, 0xcb, 0x67, 0x31, 0x31, 0xe7, 0x95, 0xef, 0x77, 0x13, - 0xfb, 0xbe, 0x97, 0x6b, 0xff, 0x95, 0xdc, 0xf6, 0x56, 0x4b, 0x7c, 0x4b, 0xc1, 0x9b, 0xf9, 0xdf, - 0x7b, 0x13, 0x13, 0xb8, 0x0f, 0xe6, 0xc4, 0x47, 0x94, 0xf8, 0x07, 0x84, 0x98, 0x40, 0x99, 0xd8, - 0x9c, 0xf8, 0xa6, 0xfe, 0xd7, 0x37, 0xa5, 0x79, 0x6c, 0x6f, 0x36, 0x3b, 0x6e, 0x11, 0x02, 0x8f, - 0xc1, 0xcd, 0x10, 0x09, 0xe9, 0x97, 0x6f, 0xca, 0x1f, 0x24, 0x01, 0x92, 0xc4, 0xac, 0xad, 0x1b, - 0x8d, 0xda, 0x93, 0x35, 0x27, 0x5f, 0x31, 0xa7, 0x58, 0x31, 0x67, 0xaf, 0x58, 0xb1, 0x76, 0x23, - 0xb3, 0x31, 0x4a, 0xad, 0x3b, 0xfa, 0x85, 0xfe, 0x8e, 0xc6, 0x3e, 0xfd, 0x6e, 0x19, 0xde, 0x4a, - 0x86, 0xbd, 0x2e, 0xa0, 0xb7, 0x0a, 0xd9, 0x58, 0xfe, 0x74, 0x6e, 0x55, 0xce, 0xce, 0xad, 0xca, - 0x97, 0xcf, 0xcd, 0x99, 0x6c, 0xdb, 0xb6, 0xdb, 0xfb, 0x17, 0x57, 0x75, 0xe3, 0xf2, 0xaa, 0x6e, - 0xfc, 0xb8, 0xaa, 0x1b, 0xa7, 0xc3, 0x7a, 0xe5, 0x72, 0x58, 0xaf, 0x7c, 0x1d, 0xd6, 0x2b, 0xef, - 0xdb, 0x63, 0xa3, 0xea, 0x9d, 0x6e, 0x86, 0xa8, 0x23, 0x8a, 0xc0, 0x3d, 0x6a, 0x3d, 0x73, 0x8f, - 0xff, 0xb4, 0xe6, 0x11, 0x0b, 0x48, 0xd8, 0xa9, 0xaa, 0x19, 0x9e, 0xfe, 0x0a, 0x00, 0x00, 0xff, - 0xff, 0x83, 0x74, 0xf1, 0xd0, 0xb9, 0x04, 0x00, 0x00, + // 603 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x4f, 0x4f, 0xd4, 0x4e, + 0x18, 0x6e, 0xf9, 0xc1, 0x02, 0xb3, 0x84, 0x1f, 0x0c, 0xfe, 0x29, 0x44, 0x5b, 0xd2, 0xa8, 0x59, + 0x13, 0xb7, 0x75, 0xd5, 0x13, 0x37, 0xaa, 0x92, 0x90, 0x98, 0x48, 0x0a, 0x7a, 0x30, 0x24, 0x75, + 0x76, 0x3a, 0x94, 0xc9, 0xb6, 0x9d, 0x6e, 0x67, 0x16, 0xe1, 0x1b, 0x78, 0xe4, 0xc8, 0x91, 0x0f, + 0xe1, 0x87, 0x20, 0x9e, 0x38, 0x1a, 0x0f, 0xd5, 0xec, 0x7e, 0x83, 0x4d, 0xbc, 0x9b, 0xb6, 0xd3, + 0xb2, 0x07, 0x35, 0xd9, 0x53, 0xe7, 0x79, 0x9f, 0x77, 0x9e, 0xf7, 0x99, 0xbe, 0xf3, 0x0e, 0x78, + 0xcc, 0x78, 0xc4, 0x38, 0xe5, 0x36, 0x66, 0x31, 0x26, 0xb1, 0x48, 0x91, 0x20, 0x7e, 0x3b, 0xa4, + 0xfd, 0x01, 0xf5, 0xa9, 0x38, 0xb3, 0x13, 0xc6, 0x42, 0x2b, 0x49, 0x99, 0x60, 0xf0, 0xa1, 0x4c, + 0xb5, 0x26, 0x53, 0xeb, 0x4c, 0xeb, 0xa4, 0xd3, 0x25, 0x02, 0x75, 0x36, 0xd6, 0x71, 0x91, 0xe7, + 0x15, 0x9b, 0xec, 0x12, 0x94, 0x0a, 0x1b, 0xb7, 0x02, 0x16, 0xb0, 0x32, 0x9e, 0xaf, 0x64, 0xd4, + 0x08, 0x18, 0x0b, 0x42, 0x62, 0x17, 0xa8, 0x3b, 0x38, 0xb2, 0x05, 0x8d, 0x08, 0x17, 0x28, 0x4a, + 0xca, 0x04, 0xf3, 0x57, 0x03, 0xcc, 0xee, 0x31, 0x16, 0xc2, 0x27, 0x60, 0x1e, 0xf9, 0x7e, 0x4a, + 0x38, 0xd7, 0xd4, 0x4d, 0xb5, 0xb5, 0xe8, 0xc0, 0x71, 0x66, 0x2c, 0x9f, 0xa1, 0x28, 0xdc, 0x32, + 0x25, 0x61, 0xba, 0x55, 0x0a, 0x5c, 0x06, 0x33, 0xd4, 0xd7, 0x66, 0x36, 0xd5, 0xd6, 0xac, 0x3b, + 0x43, 0x7d, 0xf8, 0x11, 0x2c, 0xd6, 0x6e, 0xb5, 0xff, 0x8a, 0xfd, 0xce, 0x55, 0x66, 0x28, 0xdf, + 0x33, 0xe3, 0x51, 0x40, 0xc5, 0xf1, 0xa0, 0x6b, 0x61, 0x16, 0x49, 0xc7, 0xf2, 0xd3, 0xe6, 0x7e, + 0xcf, 0x16, 0x67, 0x09, 0xe1, 0xd6, 0x2b, 0x82, 0xc7, 0x99, 0xb1, 0x52, 0x56, 0xab, 0x85, 0x4c, + 0xf7, 0x46, 0x14, 0xde, 0x01, 0x0d, 0xc1, 0x7a, 0x24, 0x7e, 0xaa, 0xcd, 0xe6, 0xf2, 0xae, 0x44, + 0x75, 0xbc, 0xa3, 0xcd, 0x4d, 0xc4, 0x3b, 0xb0, 0x0f, 0x20, 0x1e, 0xa4, 0x29, 0x89, 0x85, 0xc7, + 0xfb, 0xa9, 0xf0, 0x92, 0x94, 0x62, 0xa2, 0x35, 0x0a, 0x6b, 0x2f, 0xa7, 0xb6, 0xb6, 0x5a, 0x5a, + 0xe3, 0x09, 0x93, 0x4a, 0xa6, 0xbb, 0x22, 0xe5, 0xf7, 0xfb, 0xa9, 0xd8, 0xcb, 0x43, 0xf0, 0x18, + 0x2c, 0x55, 0x25, 0x05, 0xc5, 0x3d, 0x6d, 0xbe, 0x28, 0xf6, 0x7a, 0x8a, 0x62, 0xbb, 0xb1, 0x18, + 0x67, 0xc6, 0x5a, 0x59, 0x6c, 0x52, 0xcb, 0x74, 0x9b, 0x12, 0x1e, 0x50, 0xdc, 0x83, 0x5b, 0x60, + 0x29, 0x8f, 0x7a, 0x3c, 0x41, 0x98, 0xc6, 0x81, 0xb6, 0x90, 0x37, 0xc2, 0xb9, 0x7b, 0xb3, 0x77, + 0x92, 0x35, 0xdd, 0x66, 0x0e, 0xf7, 0x4b, 0x04, 0x2f, 0x54, 0x70, 0x3f, 0x49, 0x09, 0xa6, 0x9c, + 0xb2, 0xd8, 0x3b, 0x42, 0x58, 0xb0, 0xd4, 0x43, 0xf2, 0x58, 0x1e, 0x8b, 0x89, 0xb6, 0x58, 0xf8, + 0x7e, 0x3f, 0xb5, 0xef, 0x07, 0x65, 0xed, 0x7f, 0x8a, 0x9b, 0xee, 0x7a, 0xcd, 0xef, 0x14, 0xf4, + 0x76, 0xf9, 0xf7, 0xde, 0xc6, 0x04, 0x1e, 0x82, 0x05, 0xfe, 0x09, 0x25, 0xde, 0x11, 0x21, 0x1a, + 0x28, 0x4c, 0x6c, 0x4f, 0xdd, 0xa9, 0xff, 0x65, 0xa7, 0xa4, 0x8e, 0xe9, 0xce, 0xe7, 0xcb, 0x1d, + 0x42, 0xe0, 0x29, 0xb8, 0x1d, 0x22, 0x2e, 0xbc, 0xfa, 0x4e, 0x79, 0x83, 0xc4, 0x47, 0x82, 0x68, + 0xcd, 0x4d, 0xb5, 0xd5, 0x7c, 0xb6, 0x61, 0x95, 0xb3, 0x62, 0x55, 0xb3, 0x62, 0x1d, 0x54, 0xb3, + 0xe2, 0xb4, 0x72, 0x1b, 0xe3, 0xcc, 0xb8, 0x27, 0x6f, 0xe8, 0x9f, 0x64, 0xcc, 0xf3, 0x1f, 0x86, + 0xea, 0xae, 0xe5, 0xdc, 0x9b, 0x8a, 0x7a, 0x57, 0x30, 0x5b, 0xab, 0x9f, 0x2f, 0x0d, 0xe5, 0xe2, + 0xd2, 0x50, 0xbe, 0x7e, 0x69, 0xcf, 0xe5, 0xd3, 0xb6, 0xeb, 0x1c, 0x5e, 0x0d, 0x75, 0xf5, 0x7a, + 0xa8, 0xab, 0x3f, 0x87, 0xba, 0x7a, 0x3e, 0xd2, 0x95, 0xeb, 0x91, 0xae, 0x7c, 0x1b, 0xe9, 0xca, + 0x07, 0x67, 0xe2, 0xa8, 0xf2, 0x55, 0x68, 0x87, 0xa8, 0xcb, 0x2b, 0x60, 0x9f, 0x74, 0x5e, 0xd8, + 0xa7, 0x7f, 0x7b, 0x53, 0x22, 0xe6, 0x93, 0xb0, 0xdb, 0x28, 0xce, 0xf0, 0xfc, 0x77, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x25, 0x8f, 0x73, 0x4f, 0x82, 0x04, 0x00, 0x00, } func (m *Pool) Marshal() (dAtA []byte, err error) { diff --git a/x/concentrated-liquidity/store.go b/x/concentrated-liquidity/store.go index b5d98f0ecbc..81467ff485f 100644 --- a/x/concentrated-liquidity/store.go +++ b/x/concentrated-liquidity/store.go @@ -107,16 +107,16 @@ func ParseFullPositionFromBytes(key, value []byte) (types.FullPositionByOwnerRes // Returns a struct containing the denom and min uptime associated with the incentive record. // Returns an error if the byte array is empty. // Returns an error if fails to parse. -func ParseIncentiveRecordFromBz(bz []byte) (incentiveRecord types.IncentiveRecord, err error) { +func ParseIncentiveRecordBodyFromBz(bz []byte) (incentiveRecordBody types.IncentiveRecordBody, err error) { if len(bz) == 0 { - return types.IncentiveRecord{}, errors.New("incentive record not found") + return types.IncentiveRecordBody{}, errors.New("incentive record not found") } - err = proto.Unmarshal(bz, &incentiveRecord) + err = proto.Unmarshal(bz, &incentiveRecordBody) if err != nil { - return types.IncentiveRecord{}, err + return types.IncentiveRecordBody{}, err } - return incentiveRecord, nil + return incentiveRecordBody, nil } // ParseIncentiveRecordFromBz parses an incentive record from a byte array. @@ -160,7 +160,7 @@ func ParseFullIncentiveRecordFromBz(key []byte, value []byte) (incentiveRecord t return types.IncentiveRecord{}, err } - incentiveValue, err := ParseIncentiveRecordFromBz(value) + incentiveBody, err := ParseIncentiveRecordBodyFromBz(value) if err != nil { return types.IncentiveRecord{}, err } @@ -168,9 +168,9 @@ func ParseFullIncentiveRecordFromBz(key []byte, value []byte) (incentiveRecord t return types.IncentiveRecord{ PoolId: poolId, IncentiveDenom: incentiveDenom, - RemainingAmount: incentiveValue.RemainingAmount, - EmissionRate: incentiveValue.EmissionRate, - StartTime: incentiveValue.StartTime, + RemainingAmount: incentiveBody.RemainingAmount, + EmissionRate: incentiveBody.EmissionRate, + StartTime: incentiveBody.StartTime, MinUptime: time.Duration(minUptime), }, nil } diff --git a/x/concentrated-liquidity/types/incentive_record.go b/x/concentrated-liquidity/types/incentive_record.go new file mode 100644 index 00000000000..e2d0a4119e6 --- /dev/null +++ b/x/concentrated-liquidity/types/incentive_record.go @@ -0,0 +1,30 @@ +package types + +import ( + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// IncentiveRecord is the high-level struct we use to deal with an independent incentive being distributed on a pool. +// Note that PoolId, Denom, and MinUptime are included in the key so we avoid storing them in state, hence the distinction +// between IncentiveRecord and IncentiveRecordBody. +type IncentiveRecord struct { + PoolId uint64 + + // incentive_denom is the denom of the token being distributed as part of this incentive record + IncentiveDenom string + + // remaining_amount is the total amount of incentives to be distributed + RemainingAmount sdk.Dec + + // emission_rate is the incentive emission rate per second + EmissionRate sdk.Dec + + // start_time is the time when the incentive starts distributing + StartTime time.Time + + // min_uptime is the minimum uptime required for liquidity to qualify for this incentive. + // It should be always be one of the supported uptimes in types.SupportedUptimes + MinUptime time.Duration +} diff --git a/x/concentrated-liquidity/types/incentive_record.pb.go b/x/concentrated-liquidity/types/incentive_record.pb.go deleted file mode 100644 index 3767d065026..00000000000 --- a/x/concentrated-liquidity/types/incentive_record.pb.go +++ /dev/null @@ -1,582 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: osmosis/concentrated-liquidity/incentive_record.proto - -package types - -import ( - fmt "fmt" - _ "github.com/cosmos/cosmos-proto" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - _ "github.com/gogo/protobuf/types" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - io "io" - math "math" - math_bits "math/bits" - time "time" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf -var _ = time.Kitchen - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// IncentiveRecord represents an active perpetual incentive gauge for a pool -type IncentiveRecord struct { - PoolId uint64 `protobuf:"varint,1,opt,name=poolId,proto3" json:"poolId,omitempty"` - // incentive_denom is the denom of the token being distributed as part of this - // incentive record - IncentiveDenom string `protobuf:"bytes,2,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` - // remaining_amount is the total amount of incentives to be distributed - RemainingAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=remaining_amount,json=remainingAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"remaining_amount" yaml:"remaining_amount"` - // emission_rate is the incentive emission rate per second - EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"swap_fee"` - // start_time is the time when the incentive starts distributing - StartTime time.Time `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` - // min_uptime is the minimum uptime required for liquidity to qualify for this - // incentive. It should be always be one of the supported uptimes in - // types.SupportedUptimes - MinUptime time.Duration `protobuf:"bytes,6,opt,name=min_uptime,json=minUptime,proto3,stdduration" json:"min_uptime" yaml:"min_uptime"` -} - -func (m *IncentiveRecord) Reset() { *m = IncentiveRecord{} } -func (m *IncentiveRecord) String() string { return proto.CompactTextString(m) } -func (*IncentiveRecord) ProtoMessage() {} -func (*IncentiveRecord) Descriptor() ([]byte, []int) { - return fileDescriptor_9d38bf94e42ee434, []int{0} -} -func (m *IncentiveRecord) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *IncentiveRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_IncentiveRecord.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *IncentiveRecord) XXX_Merge(src proto.Message) { - xxx_messageInfo_IncentiveRecord.Merge(m, src) -} -func (m *IncentiveRecord) XXX_Size() int { - return m.Size() -} -func (m *IncentiveRecord) XXX_DiscardUnknown() { - xxx_messageInfo_IncentiveRecord.DiscardUnknown(m) -} - -var xxx_messageInfo_IncentiveRecord proto.InternalMessageInfo - -func (m *IncentiveRecord) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -func (m *IncentiveRecord) GetIncentiveDenom() string { - if m != nil { - return m.IncentiveDenom - } - return "" -} - -func (m *IncentiveRecord) GetStartTime() time.Time { - if m != nil { - return m.StartTime - } - return time.Time{} -} - -func (m *IncentiveRecord) GetMinUptime() time.Duration { - if m != nil { - return m.MinUptime - } - return 0 -} - -func init() { - proto.RegisterType((*IncentiveRecord)(nil), "osmosis.concentratedliquidity.v1beta1.IncentiveRecord") -} - -func init() { - proto.RegisterFile("osmosis/concentrated-liquidity/incentive_record.proto", fileDescriptor_9d38bf94e42ee434) -} - -var fileDescriptor_9d38bf94e42ee434 = []byte{ - // 460 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0xcd, 0x8e, 0xd3, 0x30, - 0x18, 0x6c, 0xd8, 0xa5, 0xd2, 0x9a, 0x9f, 0x42, 0x84, 0x20, 0x5b, 0x89, 0xa4, 0x8a, 0x04, 0xf4, - 0xd2, 0x58, 0xe5, 0xe7, 0xc2, 0x6d, 0xab, 0x5e, 0x7a, 0x8d, 0x40, 0x20, 0x84, 0x14, 0x39, 0x89, - 0x1b, 0x2c, 0x62, 0x7f, 0x21, 0x76, 0x0a, 0x7d, 0x8b, 0x3d, 0xf2, 0x48, 0x7b, 0xdc, 0x23, 0xe2, - 0x50, 0x50, 0xfb, 0x06, 0xfb, 0x04, 0x28, 0x8e, 0x93, 0xad, 0x8a, 0x38, 0x70, 0x6a, 0x67, 0x32, - 0x33, 0xdf, 0xe7, 0xb1, 0xd1, 0x2b, 0x90, 0x1c, 0x24, 0x93, 0x38, 0x01, 0x91, 0x50, 0xa1, 0x4a, - 0xa2, 0x68, 0x3a, 0xc9, 0xd9, 0x97, 0x8a, 0xa5, 0x4c, 0xad, 0x31, 0xd3, 0x2c, 0x5b, 0xd1, 0xa8, - 0xa4, 0x09, 0x94, 0x69, 0x50, 0x94, 0xa0, 0xc0, 0x7e, 0x62, 0x6c, 0xc1, 0xbe, 0xad, 0x73, 0x05, - 0xab, 0x69, 0x4c, 0x15, 0x99, 0x0e, 0x4f, 0x13, 0xad, 0x8b, 0xb4, 0x09, 0x37, 0xa0, 0x49, 0x18, - 0x3e, 0xc8, 0x20, 0x83, 0x86, 0xaf, 0xff, 0x19, 0xd6, 0xcb, 0x00, 0xb2, 0x9c, 0x62, 0x8d, 0xe2, - 0x6a, 0x89, 0x15, 0xe3, 0x54, 0x2a, 0xc2, 0x0b, 0x23, 0x70, 0x0f, 0x05, 0x69, 0x55, 0x12, 0xc5, - 0x40, 0x34, 0xdf, 0xfd, 0xdd, 0x11, 0x1a, 0x2c, 0xda, 0x9d, 0x43, 0xbd, 0xb2, 0xfd, 0x10, 0xf5, - 0x0b, 0x80, 0x7c, 0x91, 0x3a, 0xd6, 0xc8, 0x1a, 0x1f, 0x87, 0x06, 0xd9, 0xcf, 0xd0, 0xe0, 0xfa, - 0x78, 0x29, 0x15, 0xc0, 0x9d, 0x1b, 0x23, 0x6b, 0x7c, 0x12, 0xde, 0xed, 0xe8, 0x79, 0xcd, 0xda, - 0x0a, 0xdd, 0x2b, 0x29, 0x27, 0x4c, 0x30, 0x91, 0x45, 0x84, 0x43, 0x25, 0x94, 0x73, 0x54, 0x2b, - 0x67, 0x8b, 0x8b, 0x8d, 0xd7, 0xfb, 0xb9, 0xf1, 0x9e, 0x66, 0x4c, 0x7d, 0xaa, 0xe2, 0x20, 0x01, - 0x6e, 0x8e, 0x69, 0x7e, 0x26, 0x32, 0xfd, 0x8c, 0xd5, 0xba, 0xa0, 0x32, 0x98, 0xd3, 0xe4, 0x6a, - 0xe3, 0x3d, 0x5a, 0x13, 0x9e, 0xbf, 0xf6, 0x0f, 0xf3, 0xfc, 0x70, 0xd0, 0x51, 0x67, 0x9a, 0xb1, - 0x97, 0xe8, 0x0e, 0xe5, 0x4c, 0x4a, 0x06, 0x22, 0xaa, 0xfb, 0x75, 0x8e, 0xf5, 0xc8, 0xb3, 0xff, - 0x1e, 0x39, 0x68, 0x46, 0xca, 0xaf, 0xa4, 0x88, 0x96, 0x94, 0xfa, 0xe1, 0xed, 0x36, 0x37, 0x24, - 0x8a, 0xda, 0xef, 0x11, 0x92, 0x8a, 0x94, 0x2a, 0xaa, 0xbb, 0x76, 0x6e, 0x8e, 0xac, 0xf1, 0xad, - 0xe7, 0xc3, 0xa0, 0xe9, 0x39, 0x68, 0x7b, 0x0e, 0xde, 0xb4, 0x17, 0x31, 0x7b, 0x5c, 0x2f, 0x70, - 0xb5, 0xf1, 0xee, 0x9b, 0xd8, 0xce, 0xeb, 0x9f, 0xff, 0xf2, 0xac, 0xf0, 0x44, 0x13, 0xb5, 0xdc, - 0x7e, 0x87, 0x10, 0x67, 0x22, 0xaa, 0x0a, 0x9d, 0xdc, 0xd7, 0xc9, 0xa7, 0x7f, 0x25, 0xcf, 0xcd, - 0x0d, 0x1e, 0x06, 0x5f, 0x5b, 0xfd, 0xef, 0x3a, 0x98, 0x33, 0xf1, 0x56, 0xe3, 0xd9, 0xc7, 0x8b, - 0xad, 0x6b, 0x5d, 0x6e, 0x5d, 0xeb, 0xf7, 0xd6, 0xb5, 0xce, 0x77, 0x6e, 0xef, 0x72, 0xe7, 0xf6, - 0x7e, 0xec, 0xdc, 0xde, 0x87, 0xd9, 0x5e, 0x2b, 0xe6, 0x8d, 0x4e, 0x72, 0x12, 0xcb, 0x16, 0xe0, - 0xd5, 0xf4, 0x25, 0xfe, 0xf6, 0xaf, 0xd7, 0xae, 0x5b, 0x8b, 0xfb, 0x7a, 0xb5, 0x17, 0x7f, 0x02, - 0x00, 0x00, 0xff, 0xff, 0xb1, 0xa4, 0x92, 0xf5, 0x1c, 0x03, 0x00, 0x00, -} - -func (m *IncentiveRecord) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *IncentiveRecord) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *IncentiveRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - n1, err1 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MinUptime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime):]) - if err1 != nil { - return 0, err1 - } - i -= n1 - i = encodeVarintIncentiveRecord(dAtA, i, uint64(n1)) - i-- - dAtA[i] = 0x32 - n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) - if err2 != nil { - return 0, err2 - } - i -= n2 - i = encodeVarintIncentiveRecord(dAtA, i, uint64(n2)) - i-- - dAtA[i] = 0x2a - { - size := m.EmissionRate.Size() - i -= size - if _, err := m.EmissionRate.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintIncentiveRecord(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size := m.RemainingAmount.Size() - i -= size - if _, err := m.RemainingAmount.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintIncentiveRecord(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if len(m.IncentiveDenom) > 0 { - i -= len(m.IncentiveDenom) - copy(dAtA[i:], m.IncentiveDenom) - i = encodeVarintIncentiveRecord(dAtA, i, uint64(len(m.IncentiveDenom))) - i-- - dAtA[i] = 0x12 - } - if m.PoolId != 0 { - i = encodeVarintIncentiveRecord(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintIncentiveRecord(dAtA []byte, offset int, v uint64) int { - offset -= sovIncentiveRecord(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *IncentiveRecord) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolId != 0 { - n += 1 + sovIncentiveRecord(uint64(m.PoolId)) - } - l = len(m.IncentiveDenom) - if l > 0 { - n += 1 + l + sovIncentiveRecord(uint64(l)) - } - l = m.RemainingAmount.Size() - n += 1 + l + sovIncentiveRecord(uint64(l)) - l = m.EmissionRate.Size() - n += 1 + l + sovIncentiveRecord(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) - n += 1 + l + sovIncentiveRecord(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime) - n += 1 + l + sovIncentiveRecord(uint64(l)) - return n -} - -func sovIncentiveRecord(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozIncentiveRecord(x uint64) (n int) { - return sovIncentiveRecord(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *IncentiveRecord) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowIncentiveRecord - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: IncentiveRecord: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: IncentiveRecord: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowIncentiveRecord - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IncentiveDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowIncentiveRecord - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthIncentiveRecord - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthIncentiveRecord - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.IncentiveDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RemainingAmount", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowIncentiveRecord - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthIncentiveRecord - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthIncentiveRecord - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.RemainingAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EmissionRate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowIncentiveRecord - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthIncentiveRecord - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthIncentiveRecord - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.EmissionRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowIncentiveRecord - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthIncentiveRecord - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthIncentiveRecord - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinUptime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowIncentiveRecord - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthIncentiveRecord - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthIncentiveRecord - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.MinUptime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipIncentiveRecord(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthIncentiveRecord - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipIncentiveRecord(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowIncentiveRecord - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowIncentiveRecord - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowIncentiveRecord - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthIncentiveRecord - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupIncentiveRecord - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthIncentiveRecord - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthIncentiveRecord = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowIncentiveRecord = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupIncentiveRecord = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/concentrated-liquidity/types/incentive_record_body.pb.go b/x/concentrated-liquidity/types/incentive_record_body.pb.go new file mode 100644 index 00000000000..af2ec8a5034 --- /dev/null +++ b/x/concentrated-liquidity/types/incentive_record_body.pb.go @@ -0,0 +1,436 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: osmosis/concentrated-liquidity/incentive_record_body.proto + +package types + +import ( + fmt "fmt" + _ "github.com/cosmos/cosmos-proto" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + _ "github.com/gogo/protobuf/types" + github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" + io "io" + math "math" + math_bits "math/bits" + time "time" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf +var _ = time.Kitchen + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// IncentiveRecordBody represents an active perpetual incentive gauge for a pool +type IncentiveRecordBody struct { + // remaining_amount is the total amount of incentives to be distributed + RemainingAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=remaining_amount,json=remainingAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"remaining_amount" yaml:"remaining_amount"` + // emission_rate is the incentive emission rate per second + EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"swap_fee"` + // start_time is the time when the incentive starts distributing + StartTime time.Time `protobuf:"bytes,3,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` +} + +func (m *IncentiveRecordBody) Reset() { *m = IncentiveRecordBody{} } +func (m *IncentiveRecordBody) String() string { return proto.CompactTextString(m) } +func (*IncentiveRecordBody) ProtoMessage() {} +func (*IncentiveRecordBody) Descriptor() ([]byte, []int) { + return fileDescriptor_7c5b8f6c55afc93c, []int{0} +} +func (m *IncentiveRecordBody) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IncentiveRecordBody) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_IncentiveRecordBody.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *IncentiveRecordBody) XXX_Merge(src proto.Message) { + xxx_messageInfo_IncentiveRecordBody.Merge(m, src) +} +func (m *IncentiveRecordBody) XXX_Size() int { + return m.Size() +} +func (m *IncentiveRecordBody) XXX_DiscardUnknown() { + xxx_messageInfo_IncentiveRecordBody.DiscardUnknown(m) +} + +var xxx_messageInfo_IncentiveRecordBody proto.InternalMessageInfo + +func (m *IncentiveRecordBody) GetStartTime() time.Time { + if m != nil { + return m.StartTime + } + return time.Time{} +} + +func init() { + proto.RegisterType((*IncentiveRecordBody)(nil), "osmosis.concentratedliquidity.v1beta1.IncentiveRecordBody") +} + +func init() { + proto.RegisterFile("osmosis/concentrated-liquidity/incentive_record_body.proto", fileDescriptor_7c5b8f6c55afc93c) +} + +var fileDescriptor_7c5b8f6c55afc93c = []byte{ + // 400 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0x41, 0x8b, 0x9b, 0x40, + 0x18, 0xd5, 0x14, 0x0a, 0xb1, 0x2d, 0x69, 0x6d, 0xa1, 0x69, 0xa0, 0x1a, 0x84, 0x96, 0x5c, 0x32, + 0x43, 0xda, 0x9e, 0x72, 0x8b, 0xf4, 0x92, 0xab, 0xf4, 0x50, 0x4a, 0x41, 0x46, 0x9d, 0xd8, 0xa1, + 0x8e, 0x9f, 0x75, 0xc6, 0x74, 0xfd, 0x17, 0xf9, 0x59, 0xb9, 0x2c, 0xe4, 0xb8, 0xec, 0xc1, 0x5d, + 0x92, 0x7f, 0x90, 0x5f, 0xb0, 0x38, 0x6a, 0x08, 0x81, 0x3d, 0xec, 0x49, 0xbf, 0xe7, 0x7b, 0xef, + 0x7b, 0x3e, 0x3e, 0x63, 0x0e, 0x82, 0x83, 0x60, 0x02, 0x87, 0x90, 0x86, 0x34, 0x95, 0x39, 0x91, + 0x34, 0x9a, 0x26, 0xec, 0x5f, 0xc1, 0x22, 0x26, 0x4b, 0xcc, 0x14, 0xca, 0xd6, 0xd4, 0xcf, 0x69, + 0x08, 0x79, 0xe4, 0x07, 0x10, 0x95, 0x28, 0xcb, 0x41, 0x82, 0xf9, 0xa9, 0xd5, 0xa2, 0x73, 0xed, + 0x49, 0x8a, 0xd6, 0xb3, 0x80, 0x4a, 0x32, 0x1b, 0x7d, 0x08, 0x15, 0xcf, 0x57, 0x22, 0xdc, 0x0c, + 0x8d, 0xc3, 0xe8, 0x5d, 0x0c, 0x31, 0x34, 0x78, 0xfd, 0xd6, 0xa2, 0x76, 0x0c, 0x10, 0x27, 0x14, + 0xab, 0x29, 0x28, 0x56, 0x58, 0x32, 0x4e, 0x85, 0x24, 0x3c, 0x6b, 0x09, 0xd6, 0x25, 0x21, 0x2a, + 0x72, 0x22, 0x19, 0xa4, 0xcd, 0x77, 0xe7, 0xba, 0x67, 0xbc, 0x5d, 0x76, 0xc1, 0x3d, 0x95, 0xdb, + 0x85, 0xa8, 0x34, 0xa5, 0xf1, 0x3a, 0xa7, 0x9c, 0xb0, 0x94, 0xa5, 0xb1, 0x4f, 0x38, 0x14, 0xa9, + 0x1c, 0xea, 0x63, 0x7d, 0xd2, 0x77, 0x97, 0xdb, 0xca, 0xd6, 0x6e, 0x2b, 0xfb, 0x73, 0xcc, 0xe4, + 0x9f, 0x22, 0x40, 0x21, 0xf0, 0x36, 0x69, 0xfb, 0x98, 0x8a, 0xe8, 0x2f, 0x96, 0x65, 0x46, 0x05, + 0xfa, 0x4e, 0xc3, 0x63, 0x65, 0xbf, 0x2f, 0x09, 0x4f, 0xe6, 0xce, 0xa5, 0x9f, 0xe3, 0x0d, 0x4e, + 0xd0, 0x42, 0x21, 0xe6, 0xca, 0x78, 0x45, 0x39, 0x13, 0x82, 0x41, 0xea, 0xd7, 0x15, 0x0d, 0x7b, + 0x6a, 0xe5, 0xe2, 0xc9, 0x2b, 0x07, 0xcd, 0x4a, 0xf1, 0x9f, 0x64, 0xfe, 0x8a, 0x52, 0xc7, 0x7b, + 0xd9, 0xf9, 0x7a, 0x44, 0x52, 0xf3, 0xa7, 0x61, 0x08, 0x49, 0x72, 0xe9, 0xd7, 0x75, 0x0d, 0x9f, + 0x8d, 0xf5, 0xc9, 0x8b, 0x2f, 0x23, 0xd4, 0x54, 0x85, 0xba, 0xaa, 0xd0, 0x8f, 0xae, 0x4b, 0xf7, + 0x63, 0x1d, 0xe0, 0x58, 0xd9, 0x6f, 0x5a, 0xdb, 0x93, 0xd6, 0xd9, 0xdc, 0xd9, 0xba, 0xd7, 0x57, + 0x40, 0x4d, 0x77, 0x7f, 0x6f, 0xf7, 0x96, 0xbe, 0xdb, 0x5b, 0xfa, 0xfd, 0xde, 0xd2, 0x37, 0x07, + 0x4b, 0xdb, 0x1d, 0x2c, 0xed, 0xe6, 0x60, 0x69, 0xbf, 0xdc, 0xb3, 0xf0, 0xed, 0x35, 0x4c, 0x13, + 0x12, 0x88, 0x6e, 0xc0, 0xeb, 0xd9, 0x37, 0x7c, 0xf5, 0xd8, 0x71, 0xa9, 0x9f, 0x0b, 0x9e, 0xab, + 0x6c, 0x5f, 0x1f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x26, 0x08, 0xc0, 0xe3, 0x8b, 0x02, 0x00, 0x00, +} + +func (m *IncentiveRecordBody) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IncentiveRecordBody) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *IncentiveRecordBody) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + if err1 != nil { + return 0, err1 + } + i -= n1 + i = encodeVarintIncentiveRecordBody(dAtA, i, uint64(n1)) + i-- + dAtA[i] = 0x1a + { + size := m.EmissionRate.Size() + i -= size + if _, err := m.EmissionRate.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintIncentiveRecordBody(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size := m.RemainingAmount.Size() + i -= size + if _, err := m.RemainingAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintIncentiveRecordBody(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func encodeVarintIncentiveRecordBody(dAtA []byte, offset int, v uint64) int { + offset -= sovIncentiveRecordBody(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *IncentiveRecordBody) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.RemainingAmount.Size() + n += 1 + l + sovIncentiveRecordBody(uint64(l)) + l = m.EmissionRate.Size() + n += 1 + l + sovIncentiveRecordBody(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) + n += 1 + l + sovIncentiveRecordBody(uint64(l)) + return n +} + +func sovIncentiveRecordBody(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozIncentiveRecordBody(x uint64) (n int) { + return sovIncentiveRecordBody(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *IncentiveRecordBody) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentiveRecordBody + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IncentiveRecordBody: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IncentiveRecordBody: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RemainingAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentiveRecordBody + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthIncentiveRecordBody + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthIncentiveRecordBody + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.RemainingAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EmissionRate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentiveRecordBody + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthIncentiveRecordBody + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthIncentiveRecordBody + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.EmissionRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowIncentiveRecordBody + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthIncentiveRecordBody + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthIncentiveRecordBody + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipIncentiveRecordBody(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthIncentiveRecordBody + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipIncentiveRecordBody(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowIncentiveRecordBody + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowIncentiveRecordBody + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowIncentiveRecordBody + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthIncentiveRecordBody + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupIncentiveRecordBody + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthIncentiveRecordBody + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthIncentiveRecordBody = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowIncentiveRecordBody = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupIncentiveRecordBody = fmt.Errorf("proto: unexpected end of group") +) From 3738f83eb8c89deda0b2a0b074bb32938df6d7ed Mon Sep 17 00:00:00 2001 From: alpo Date: Tue, 21 Feb 2023 19:44:05 -0800 Subject: [PATCH 080/136] cleanup from review --- x/concentrated-liquidity/incentives_test.go | 1 + x/concentrated-liquidity/position_test.go | 9 ++------- x/concentrated-liquidity/store.go | 4 ++-- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index f440fe1db11..3a58bec4891 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -645,6 +645,7 @@ func (s *KeeperTestSuite) TestIncentiveRecordsSetAndGet() { // Ensure records for other pool remain unchanged poolTwoRecord, err := clKeeper.GetIncentiveRecord(s.Ctx, clPoolTwo.GetId(), incentiveRecordOne.IncentiveDenom, incentiveRecordOne.MinUptime) s.Require().Error(err) + s.Require().ErrorIs(err, types.IncentiveRecordNotFoundError{PoolId: clPoolTwo.GetId(), IncentiveDenom: incentiveRecordOne.IncentiveDenom, MinUptime: incentiveRecordOne.MinUptime}) s.Require().Equal(types.IncentiveRecord{}, poolTwoRecord) allRecordsPoolTwo, err := clKeeper.GetAllIncentiveRecordsForPool(s.Ctx, clPoolTwo.GetId()) s.Require().NoError(err) diff --git a/x/concentrated-liquidity/position_test.go b/x/concentrated-liquidity/position_test.go index 190b6fd76a9..25d3f3cfe57 100644 --- a/x/concentrated-liquidity/position_test.go +++ b/x/concentrated-liquidity/position_test.go @@ -135,7 +135,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, test.param.poolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.liquidityDelta, test.param.frozenUntil) s.Require().NoError(err) - preexistingLiquidity = DefaultLiquidityAmt + preexistingLiquidity = test.param.liquidityDelta // Since this is the pool's initial liquidity, uptime accums should not have increased in value newUptimeAccumValues, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulatorValues(s.Ctx, test.param.poolId) @@ -244,7 +244,6 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { } } else { // if no position init, should remain empty - s.Require().NoError(err) s.Require().Equal(initUptimeAccumValues[uptimeIndex], newUptimeAccumValues[uptimeIndex]) } } @@ -256,11 +255,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { // get reordered lexicographically by denom in state. actualIncentiveRecords, err := s.App.ConcentratedLiquidityKeeper.GetAllIncentiveRecordsForPool(s.Ctx, test.param.poolId) s.Require().NoError(err) - for i := range expectedIncentiveRecords { - s.Require().Contains(expectedIncentiveRecords, actualIncentiveRecords[i]) - s.Require().Contains(actualIncentiveRecords, expectedIncentiveRecords[i]) - } - + s.Require().ElementsMatch(expectedIncentiveRecords, actualIncentiveRecords) }) } } diff --git a/x/concentrated-liquidity/store.go b/x/concentrated-liquidity/store.go index 81467ff485f..be150a243d6 100644 --- a/x/concentrated-liquidity/store.go +++ b/x/concentrated-liquidity/store.go @@ -103,7 +103,7 @@ func ParseFullPositionFromBytes(key, value []byte) (types.FullPositionByOwnerRes }, nil } -// ParseFullIncentiveRecordFromBz parses a IncentiveRecord from a byte array. +// ParseIncentiveRecordBodyFromBz parses an IncentiveRecord from a byte array. // Returns a struct containing the denom and min uptime associated with the incentive record. // Returns an error if the byte array is empty. // Returns an error if fails to parse. @@ -119,7 +119,7 @@ func ParseIncentiveRecordBodyFromBz(bz []byte) (incentiveRecordBody types.Incent return incentiveRecordBody, nil } -// ParseIncentiveRecordFromBz parses an incentive record from a byte array. +// ParseFullIncentiveRecordFromBz parses an incentive record from a byte array. // Returns a struct containing the state associated with the incentive. // Returns an error if the byte array is empty. // Returns an error if fails to parse. From a607e480468dd6173e8d0ae83b518189e7cf13e9 Mon Sep 17 00:00:00 2001 From: alpo Date: Tue, 21 Feb 2023 20:04:59 -0800 Subject: [PATCH 081/136] comment cleanup --- x/concentrated-liquidity/tick.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index 5c7063776c8..76443938788 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -99,7 +99,7 @@ func (k Keeper) getTickInfo(ctx sdk.Context, poolId uint64, tickIndex int64) (ti return tickStruct, err } - // Initialize uptime trackers for the new tick to current global uptime accum values. + // Initialize uptime trackers for the new tick to the appropriate starting values. valuesToAdd, err := k.getInitialUptimeGrowthOutsidesForTick(ctx, poolId, tickIndex) if err != nil { return tickStruct, err From bbd6e49cfad6395252f7fbb6f97226f2277634bd Mon Sep 17 00:00:00 2001 From: alpo Date: Wed, 22 Feb 2023 21:49:10 -0800 Subject: [PATCH 082/136] set up cross tick tests --- x/concentrated-liquidity/tick_test.go | 38 ++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/tick_test.go b/x/concentrated-liquidity/tick_test.go index 52d2237589a..2e462c1be21 100644 --- a/x/concentrated-liquidity/tick_test.go +++ b/x/concentrated-liquidity/tick_test.go @@ -378,12 +378,18 @@ func (s *KeeperTestSuite) TestGetTickInfo() { func (s *KeeperTestSuite) TestCrossTick() { var ( preInitializedTickIndex = DefaultCurrTick.Int64() - 2 + expectedUptimes = getExpectedUptimes() + // emptyUptimeTrackers = wrapUptimeTrackers(expectedUptimes.emptyExpectedAccumValues) + // varyingTokensAndDenoms = wrapUptimeTrackers(expectedUptimes.varyingTokensMultiDenom) ) tests := []struct { name string poolToGet uint64 tickToGet int64 + initGlobalUptimeAccumValues []sdk.DecCoins + globalUptimeAccumDelta []sdk.DecCoins + expectedUptimeTrackers []model.UptimeTracker expectedLiquidityDelta sdk.Dec expectedTickFeeGrowthOutside sdk.DecCoins expectedErr bool @@ -392,6 +398,11 @@ func (s *KeeperTestSuite) TestCrossTick() { name: "Get tick info on existing pool and existing tick", poolToGet: validPoolId, tickToGet: preInitializedTickIndex, + // Global uptime accums remain unchanged after tick init + initGlobalUptimeAccumValues: expectedUptimes.varyingTokensMultiDenom, + globalUptimeAccumDelta: expectedUptimes.emptyExpectedAccumValues, + + // expectedUptimeTrackers: , expectedLiquidityDelta: DefaultLiquidityAmt.Neg(), expectedTickFeeGrowthOutside: DefaultFeeAccumCoins, }, @@ -401,6 +412,14 @@ func (s *KeeperTestSuite) TestCrossTick() { tickToGet: preInitializedTickIndex, expectedErr: true, }, + + // TODO: test with empty accums + + // TODO: test with varying accums + + // TODO: test with same accums + + // TODO: test with tick above vs. below for all of above } for _, test := range tests { @@ -409,7 +428,7 @@ func (s *KeeperTestSuite) TestCrossTick() { s.Setup() // Create a default CL pool - s.PrepareConcentratedPool() + clPool := s.PrepareConcentratedPool() if test.poolToGet == validPoolId { s.FundAcc(s.TestAccs[0], sdk.NewCoins(sdk.NewCoin("ETH", sdk.NewInt(10000000000000)), sdk.NewCoin("USDC", sdk.NewInt(1000000000000)))) @@ -422,10 +441,20 @@ func (s *KeeperTestSuite) TestCrossTick() { err := s.App.ConcentratedLiquidityKeeper.ChargeFee(s.Ctx, validPoolId, defaultAccumCoins) s.Require().NoError(err) + // Initialize global uptime accums + if test.initGlobalUptimeAccumValues != nil { + addToUptimeAccums(s.Ctx, clPool, s.App.ConcentratedLiquidityKeeper, test.initGlobalUptimeAccumValues) + } + // Set up an initialized tick err = s.App.ConcentratedLiquidityKeeper.InitOrUpdateTick(s.Ctx, validPoolId, DefaultCurrTick.Int64(), preInitializedTickIndex, DefaultLiquidityAmt, true) s.Require().NoError(err) + // Update global uptime accums for edge case testing + if test.globalUptimeAccumDelta != nil { + addToUptimeAccums(s.Ctx, clPool, s.App.ConcentratedLiquidityKeeper, test.globalUptimeAccumDelta) + } + // update the fee accumulator so that we have accum value > tick fee growth value // now we have 100 foo coins inside the pool accumulator err = s.App.ConcentratedLiquidityKeeper.ChargeFee(s.Ctx, validPoolId, defaultAccumCoins) @@ -439,6 +468,8 @@ func (s *KeeperTestSuite) TestCrossTick() { s.Require().NoError(err) s.Require().Equal(test.expectedLiquidityDelta, liquidityDelta) + // fee-related tests + // now check if fee accumulator has been properly updated accum, err := s.App.ConcentratedLiquidityKeeper.GetFeeAccumulator(s.Ctx, test.poolToGet) s.Require().NoError(err) @@ -450,6 +481,11 @@ func (s *KeeperTestSuite) TestCrossTick() { tickInfo, err := s.App.ConcentratedLiquidityKeeper.GetTickInfo(s.Ctx, test.poolToGet, preInitializedTickIndex) s.Require().NoError(err) s.Require().Equal(test.expectedTickFeeGrowthOutside, tickInfo.FeeGrowthOutside) + + // incentive-related tests + + // ensure tick being entered has properly updated uptime trackers + // TODO: add test.expectedUptimeTrackers } }) } From bba3209b1a19122c3fe5e1f167db14c21ac2b178 Mon Sep 17 00:00:00 2001 From: alpo Date: Wed, 22 Feb 2023 23:30:51 -0800 Subject: [PATCH 083/136] add further tests --- x/concentrated-liquidity/incentives_test.go | 29 +++--- x/concentrated-liquidity/tick.go | 7 +- x/concentrated-liquidity/tick_test.go | 101 ++++++++++++++------ 3 files changed, 90 insertions(+), 47 deletions(-) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index ff802279cbc..ea6c78d7dd5 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -83,12 +83,13 @@ var ( ) type ExpectedUptimes struct { - emptyExpectedAccumValues []sdk.DecCoins - hundredTokensSingleDenom []sdk.DecCoins - hundredTokensMultiDenom []sdk.DecCoins - twoHundredTokensMultiDenom []sdk.DecCoins - varyingTokensSingleDenom []sdk.DecCoins - varyingTokensMultiDenom []sdk.DecCoins + emptyExpectedAccumValues []sdk.DecCoins + hundredTokensSingleDenom []sdk.DecCoins + hundredTokensMultiDenom []sdk.DecCoins + twoHundredTokensMultiDenom []sdk.DecCoins + threeHundredTokensMultiDenom []sdk.DecCoins + varyingTokensSingleDenom []sdk.DecCoins + varyingTokensMultiDenom []sdk.DecCoins } // getExpectedUptimes returns a base set of expected values for testing based on the number @@ -96,18 +97,20 @@ type ExpectedUptimes struct { // of incentives-related tests if the supported uptimes are ever changed. func getExpectedUptimes() ExpectedUptimes { expUptimes := ExpectedUptimes{ - emptyExpectedAccumValues: []sdk.DecCoins{}, - hundredTokensSingleDenom: []sdk.DecCoins{}, - hundredTokensMultiDenom: []sdk.DecCoins{}, - twoHundredTokensMultiDenom: []sdk.DecCoins{}, - varyingTokensSingleDenom: []sdk.DecCoins{}, - varyingTokensMultiDenom: []sdk.DecCoins{}, + emptyExpectedAccumValues: []sdk.DecCoins{}, + hundredTokensSingleDenom: []sdk.DecCoins{}, + hundredTokensMultiDenom: []sdk.DecCoins{}, + twoHundredTokensMultiDenom: []sdk.DecCoins{}, + threeHundredTokensMultiDenom: []sdk.DecCoins{}, + varyingTokensSingleDenom: []sdk.DecCoins{}, + varyingTokensMultiDenom: []sdk.DecCoins{}, } for i := range types.SupportedUptimes { expUptimes.emptyExpectedAccumValues = append(expUptimes.emptyExpectedAccumValues, cl.EmptyCoins) expUptimes.hundredTokensSingleDenom = append(expUptimes.hundredTokensSingleDenom, sdk.NewDecCoins(cl.HundredFooCoins)) expUptimes.hundredTokensMultiDenom = append(expUptimes.hundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins, cl.HundredBarCoins)) expUptimes.twoHundredTokensMultiDenom = append(expUptimes.twoHundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(cl.HundredFooCoins), cl.HundredBarCoins.Add(cl.HundredBarCoins))) + expUptimes.threeHundredTokensMultiDenom = append(expUptimes.threeHundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(cl.HundredFooCoins).Add(cl.HundredFooCoins), cl.HundredBarCoins.Add(cl.HundredBarCoins).Add(cl.HundredBarCoins))) expUptimes.varyingTokensSingleDenom = append(expUptimes.varyingTokensSingleDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(sdk.NewDecCoin("foo", sdk.NewInt(int64(i)))))) expUptimes.varyingTokensMultiDenom = append(expUptimes.varyingTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(sdk.NewDecCoin("foo", sdk.NewInt(int64(i)))), cl.HundredBarCoins.Add(sdk.NewDecCoin("bar", sdk.NewInt(int64(i*3)))))) } @@ -140,7 +143,7 @@ func chargeIncentive(incentiveRecord types.IncentiveRecord, timeElapsed time.Dur } // Helper for adding a predetermined amount to each global uptime accum in clPool -func addToUptimeAccums(ctx sdk.Context, clPool types.ConcentratedPoolExtension, clKeeper *cl.Keeper, addValues []sdk.DecCoins) error { +func addToUptimeAccums(ctx sdk.Context, clPool types.ConcentratedPoolExtension, clKeeper *cl.Keeper, addValues []sdk.DecCoins) error { poolUptimeAccumulators, err := clKeeper.GetUptimeAccumulators(ctx, clPool.GetId()) if err != nil { return err diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index 301f18c4872..bf746a316a7 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -76,15 +76,16 @@ func (k Keeper) crossTick(ctx sdk.Context, poolId uint64, tickIndex int64, swapS return sdk.Dec{}, err } - // Uupdate global accums to now before uptime outside changes + // Update global accums to now before uptime outside changes if err := k.updateUptimeAccumulatorsToNow(ctx, poolId); err != nil { return sdk.Dec{}, err } // For each supported uptime, subtract tick's uptime growth outside from the respective uptime accumulator + // This is functionally equivalent to "flipping" the trackers once the tick is crossed + updatedUptimeTrackers := tickInfo.UptimeTrackers for uptimeId, uptimeAccum := range uptimeAccums { - curUptimeTracker := tickInfo.UptimeTrackers[uptimeId] - curUptimeTracker.UptimeGrowthOutside = uptimeAccum.GetValue().Sub(curUptimeTracker.UptimeGrowthOutside) + updatedUptimeTrackers[uptimeId].UptimeGrowthOutside = uptimeAccum.GetValue().Sub(updatedUptimeTrackers[uptimeId].UptimeGrowthOutside) } k.SetTickInfo(ctx, poolId, tickIndex, tickInfo) diff --git a/x/concentrated-liquidity/tick_test.go b/x/concentrated-liquidity/tick_test.go index a2cc16bdaaf..a11f1911d1e 100644 --- a/x/concentrated-liquidity/tick_test.go +++ b/x/concentrated-liquidity/tick_test.go @@ -409,59 +409,101 @@ func (s *KeeperTestSuite) TestGetTickInfo() { func (s *KeeperTestSuite) TestCrossTick() { var ( preInitializedTickIndex = DefaultCurrTick.Int64() - 2 - expectedUptimes = getExpectedUptimes() - // emptyUptimeTrackers = wrapUptimeTrackers(expectedUptimes.emptyExpectedAccumValues) - // varyingTokensAndDenoms = wrapUptimeTrackers(expectedUptimes.varyingTokensMultiDenom) + expectedUptimes = getExpectedUptimes() + emptyUptimeTrackers = wrapUptimeTrackers(expectedUptimes.emptyExpectedAccumValues) defaultAdditiveFee = sdk.NewDecCoinFromDec(USDC, sdk.NewDec(1000)) ) tests := []struct { name string poolToGet uint64 + preInitializedTickIndex int64 tickToGet int64 - initGlobalUptimeAccumValues []sdk.DecCoins - globalUptimeAccumDelta []sdk.DecCoins - expectedUptimeTrackers []model.UptimeTracker + initGlobalUptimeAccumValues []sdk.DecCoins + globalUptimeAccumDelta []sdk.DecCoins + expectedUptimeTrackers []model.UptimeTracker additiveFee sdk.DecCoin expectedLiquidityDelta sdk.Dec expectedTickFeeGrowthOutside sdk.DecCoins expectedErr bool }{ { - name: "Get tick info on existing pool and existing tick", + name: "Get tick info on existing pool and existing tick below current tick (nonzero uptime trackers)", + poolToGet: validPoolId, + preInitializedTickIndex: preInitializedTickIndex, + tickToGet: preInitializedTickIndex, + additiveFee: defaultAdditiveFee, + // Global uptime accums remain unchanged after tick init + initGlobalUptimeAccumValues: expectedUptimes.twoHundredTokensMultiDenom, + globalUptimeAccumDelta: expectedUptimes.hundredTokensMultiDenom, + // We expect new uptime trackers to be new global - init global + // This is because we init them to twoHundredTokensMultiDenom and then add hundredTokensMultiDenom, + // so when we cross the tick and "flip" it, we expect threeHundredTokensMultiDenom - twoHundredTokensMultiDenom + expectedUptimeTrackers: wrapUptimeTrackers(expectedUptimes.hundredTokensMultiDenom), + expectedLiquidityDelta: DefaultLiquidityAmt.Neg(), + expectedTickFeeGrowthOutside: DefaultFeeAccumCoins.Add(defaultAdditiveFee), + }, + { + name: "Get tick info on existing pool and existing tick below current tick (nil uptime trackers)", poolToGet: validPoolId, + preInitializedTickIndex: preInitializedTickIndex, tickToGet: preInitializedTickIndex, - // Global uptime accums remain unchanged after tick init - initGlobalUptimeAccumValues: expectedUptimes.varyingTokensMultiDenom, - globalUptimeAccumDelta: expectedUptimes.emptyExpectedAccumValues, - // expectedUptimeTrackers: , additiveFee: defaultAdditiveFee, + expectedUptimeTrackers: emptyUptimeTrackers, + expectedLiquidityDelta: DefaultLiquidityAmt.Neg(), + expectedTickFeeGrowthOutside: DefaultFeeAccumCoins.Add(defaultAdditiveFee), + }, + { + name: "Get tick info on existing pool and existing tick above current tick (nonzero uptime trackers)", + poolToGet: validPoolId, + preInitializedTickIndex: preInitializedTickIndex, + tickToGet: DefaultCurrTick.Int64() + 1, + additiveFee: defaultAdditiveFee, + // Global uptime accums remain unchanged after tick init + initGlobalUptimeAccumValues: expectedUptimes.twoHundredTokensMultiDenom, + globalUptimeAccumDelta: expectedUptimes.hundredTokensMultiDenom, + // We expect new uptime trackers to be equal to new global + // This is because we init them to zero (since target tick is above current tick), + // so when we cross the tick and "flip" it, we expect it to be the global value - 0 = global value. + expectedUptimeTrackers: wrapUptimeTrackers(expectedUptimes.threeHundredTokensMultiDenom), + expectedLiquidityDelta: sdk.ZeroDec(), + expectedTickFeeGrowthOutside: DefaultFeeAccumCoins.Add(defaultAdditiveFee).Add(DefaultFeeAccumCoins...), + }, + { + // Note that this test case covers technically undefined behavior (crossing into the current tick). + name: "Get tick info on existing pool and existing tick at current tick (nonzero uptime trackers)", + poolToGet: validPoolId, + preInitializedTickIndex: DefaultCurrTick.Int64(), + tickToGet: DefaultCurrTick.Int64(), + additiveFee: defaultAdditiveFee, + // Global uptime accums remain unchanged after tick init + initGlobalUptimeAccumValues: expectedUptimes.twoHundredTokensMultiDenom, + globalUptimeAccumDelta: expectedUptimes.hundredTokensMultiDenom, + // We expect new uptime trackers to be new global - init global + // This is because we init them to twoHundredTokensMultiDenom and then add hundredTokensMultiDenom, + // so when we cross the tick and "flip" it, we expect threeHundredTokensMultiDenom - twoHundredTokensMultiDenom + expectedUptimeTrackers: wrapUptimeTrackers(expectedUptimes.hundredTokensMultiDenom), expectedLiquidityDelta: DefaultLiquidityAmt.Neg(), expectedTickFeeGrowthOutside: DefaultFeeAccumCoins.Add(defaultAdditiveFee), }, { name: "twice the default additive fee", poolToGet: validPoolId, + preInitializedTickIndex: preInitializedTickIndex, tickToGet: preInitializedTickIndex, additiveFee: defaultAdditiveFee.Add(defaultAdditiveFee), + expectedUptimeTrackers: emptyUptimeTrackers, expectedLiquidityDelta: DefaultLiquidityAmt.Neg(), expectedTickFeeGrowthOutside: DefaultFeeAccumCoins.Add(defaultAdditiveFee.Add(defaultAdditiveFee)), }, { - name: "Try invalid tick", - poolToGet: 2, - tickToGet: preInitializedTickIndex, - additiveFee: defaultAdditiveFee, - expectedErr: true, + name: "Try invalid tick", + poolToGet: 2, + preInitializedTickIndex: preInitializedTickIndex, + tickToGet: preInitializedTickIndex, + additiveFee: defaultAdditiveFee, + expectedErr: true, }, - - // TODO: test with empty accums - - // TODO: test with varying accums - - // TODO: test with same accums - - // TODO: test with tick above vs. below for all of above } for _, test := range tests { @@ -471,6 +513,7 @@ func (s *KeeperTestSuite) TestCrossTick() { // Create a default CL pool clPool := s.PrepareConcentratedPool() + clPool.SetCurrentTick(DefaultCurrTick) if test.poolToGet == validPoolId { s.FundAcc(s.TestAccs[0], sdk.NewCoins(sdk.NewCoin("ETH", sdk.NewInt(10000000000000)), sdk.NewCoin("USDC", sdk.NewInt(1000000000000)))) @@ -489,7 +532,7 @@ func (s *KeeperTestSuite) TestCrossTick() { } // Set up an initialized tick - err = s.App.ConcentratedLiquidityKeeper.InitOrUpdateTick(s.Ctx, validPoolId, DefaultCurrTick.Int64(), preInitializedTickIndex, DefaultLiquidityAmt, true) + err = s.App.ConcentratedLiquidityKeeper.InitOrUpdateTick(s.Ctx, validPoolId, DefaultCurrTick.Int64(), test.preInitializedTickIndex, DefaultLiquidityAmt, true) s.Require().NoError(err) // Update global uptime accums for edge case testing @@ -510,8 +553,6 @@ func (s *KeeperTestSuite) TestCrossTick() { s.Require().NoError(err) s.Require().Equal(test.expectedLiquidityDelta, liquidityDelta) - // fee-related tests - // now check if fee accumulator has been properly updated accum, err := s.App.ConcentratedLiquidityKeeper.GetFeeAccumulator(s.Ctx, test.poolToGet) s.Require().NoError(err) @@ -520,14 +561,12 @@ func (s *KeeperTestSuite) TestCrossTick() { s.Require().Equal(accum.GetValue(), sdk.NewDecCoins(defaultAccumCoins).MulDec(sdk.NewDec(2))) // check if the tick fee growth outside has been correctly subtracted - tickInfo, err := s.App.ConcentratedLiquidityKeeper.GetTickInfo(s.Ctx, test.poolToGet, preInitializedTickIndex) + tickInfo, err := s.App.ConcentratedLiquidityKeeper.GetTickInfo(s.Ctx, test.poolToGet, test.tickToGet) s.Require().NoError(err) s.Require().Equal(test.expectedTickFeeGrowthOutside, tickInfo.FeeGrowthOutside) - // incentive-related tests - // ensure tick being entered has properly updated uptime trackers - // TODO: add test.expectedUptimeTrackers + s.Require().Equal(test.expectedUptimeTrackers, tickInfo.UptimeTrackers) } }) } From 1d208be8061f5867bfedb6dc7e8e0e11c8ad409b Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 23 Feb 2023 07:09:14 -0800 Subject: [PATCH 084/136] test and comment cleanup --- x/concentrated-liquidity/incentives_test.go | 9 ++------- x/concentrated-liquidity/tick_test.go | 8 ++++---- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index ff802279cbc..4eac4a3dfd4 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -140,8 +140,8 @@ func chargeIncentive(incentiveRecord types.IncentiveRecord, timeElapsed time.Dur } // Helper for adding a predetermined amount to each global uptime accum in clPool -func addToUptimeAccums(ctx sdk.Context, clPool types.ConcentratedPoolExtension, clKeeper *cl.Keeper, addValues []sdk.DecCoins) error { - poolUptimeAccumulators, err := clKeeper.GetUptimeAccumulators(ctx, clPool.GetId()) +func addToUptimeAccums(ctx sdk.Context, poolId uint64, clKeeper *cl.Keeper, addValues []sdk.DecCoins) error { + poolUptimeAccumulators, err := clKeeper.GetUptimeAccumulators(ctx, poolId) if err != nil { return err } @@ -150,11 +150,6 @@ func addToUptimeAccums(ctx sdk.Context, clPool types.ConcentratedPoolExtension, uptimeAccum.AddToAccumulator(addValues[uptimeIndex]) } - err = clKeeper.SetPool(ctx, clPool) - if err != nil { - return err - } - return nil } diff --git a/x/concentrated-liquidity/tick_test.go b/x/concentrated-liquidity/tick_test.go index bbc55a78b40..f2f974c9368 100644 --- a/x/concentrated-liquidity/tick_test.go +++ b/x/concentrated-liquidity/tick_test.go @@ -324,7 +324,7 @@ func (s *KeeperTestSuite) TestGetTickInfo() { tickToGet: preInitializedTickIndex, preInitUptimeAccumValues: expectedUptimes.varyingTokensMultiDenom, // Note that FeeGrowthOutside is not updated, but UptimeGrowthOutsides are. - // We expect uptime trackers to be initialized to global uptime accums since tick >= active tick + // We expect uptime trackers to be initialized to zero since tick > active tick expectedTickInfo: model.TickInfo{LiquidityGross: DefaultLiquidityAmt, LiquidityNet: DefaultLiquidityAmt.Neg(), UptimeTrackers: emptyUptimeTrackers}, }, { @@ -333,7 +333,7 @@ func (s *KeeperTestSuite) TestGetTickInfo() { tickToGet: preInitializedTickIndex - 3, preInitUptimeAccumValues: expectedUptimes.varyingTokensMultiDenom, // Note that FeeGrowthOutside is not updated, but UptimeGrowthOutsides are. - // We expect uptime trackers to be initialized to zero since tick < active tick + // We expect uptime trackers to be initialized to global accums since tick <= active tick expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: sdk.NewDecCoins(oneEth), UptimeTrackers: varyingTokensAndDenoms}, }, { @@ -341,7 +341,7 @@ func (s *KeeperTestSuite) TestGetTickInfo() { poolToGet: validPoolId, tickToGet: DefaultCurrTick.Int64(), preInitUptimeAccumValues: expectedUptimes.varyingTokensMultiDenom, - // Uptime trackers are set to global since tickToGet >= current tick + // Uptime trackers are set to global since tickToGet <= current tick expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: sdk.NewDecCoins(oneEth), UptimeTrackers: varyingTokensAndDenoms}, }, { @@ -376,7 +376,7 @@ func (s *KeeperTestSuite) TestGetTickInfo() { clKeeper := s.App.ConcentratedLiquidityKeeper if test.preInitUptimeAccumValues != nil { - addToUptimeAccums(s.Ctx, clPool, clKeeper, test.preInitUptimeAccumValues) + addToUptimeAccums(s.Ctx, clPool.GetId(), clKeeper, test.preInitUptimeAccumValues) } // Set up an initialized tick From 2c0076afdafcf738a10c923c917ad8ca8e896ce9 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 23 Feb 2023 08:26:08 -0800 Subject: [PATCH 085/136] implement core logic --- osmoutils/coin_helper.go | 19 +++++++- x/concentrated-liquidity/incentives.go | 60 ++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/osmoutils/coin_helper.go b/osmoutils/coin_helper.go index 07c802c162f..571706d304c 100644 --- a/osmoutils/coin_helper.go +++ b/osmoutils/coin_helper.go @@ -1,6 +1,10 @@ package osmoutils -import sdk "github.com/cosmos/cosmos-sdk/types" +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" +) // TODO: Get this into the SDK https://github.com/cosmos/cosmos-sdk/issues/12538 func CoinsDenoms(coins sdk.Coins) []string { @@ -25,3 +29,16 @@ func MinCoins(coinsA sdk.Coins, coinsB sdk.Coins) sdk.Coins { } return resCoins } + +func SubDecCoinArrays(decCoinsArrayA []sdk.DecCoins, decCoinsArrayB []sdk.DecCoins) ([]sdk.DecCoins, error) { + if len(decCoinsArrayA) != len(decCoinsArrayB) { + return []sdk.DecCoins{}, fmt.Errorf("DecCoin arrays must be of equal length to be subtracted") + } + + finalDecCoinArray := []sdk.DecCoins{} + for i := range decCoinsArrayA { + finalDecCoinArray = append(finalDecCoinArray, decCoinsArrayA[i].Sub(decCoinsArrayB[i])) + } + + return finalDecCoinArray, nil +} diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index a2dd059b7db..eba77fb897a 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -10,6 +10,7 @@ import ( "github.com/osmosis-labs/osmosis/osmoutils" "github.com/osmosis-labs/osmosis/osmoutils/accum" + "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" ) @@ -36,6 +37,16 @@ func getUptimeAccumulatorName(poolId uint64, uptimeIndex uint64) string { return strings.Join([]string{uptimeAccumPrefix, poolIdStr, uptimeIndexStr}, "/") } +// getUptimeTrackerValues extracts the values of an array of uptime trackers +func getUptimeTrackerValues(uptimeTrackers []model.UptimeTracker) []sdk.DecCoins { + trackerValues := []sdk.DecCoins{} + for _, uptimeTracker := range uptimeTrackers { + trackerValues = append(trackerValues, uptimeTracker.UptimeGrowthOutside) + } + + return trackerValues +} + // nolint: unused // getUptimeAccumulators gets the uptime accumulator objects for the given poolId // Returns error if accumulator for the given poolId does not exist. @@ -270,3 +281,52 @@ func (k Keeper) GetIncentiveRecord(ctx sdk.Context, poolId uint64, denom string, func (k Keeper) GetAllIncentiveRecordsForPool(ctx sdk.Context, poolId uint64) ([]types.IncentiveRecord, error) { return osmoutils.GatherValuesFromStorePrefixWithKeyParser(ctx.KVStore(k.storeKey), types.KeyPoolIncentiveRecords(poolId), ParseFullIncentiveRecordFromBz) } + +// UptimeGrowthInsideRange returns the uptime growth within the given tick range for all supported uptimes +func (k Keeper) UptimeGrowthInsideRange(ctx sdk.Context, poolId uint64, currentTick int64, lowerTick int64, upperTick int64) ([]sdk.DecCoins, error) { + globalUptimeValues, err := k.getUptimeAccumulatorValues(ctx, poolId) + if err != nil { + return []sdk.DecCoins{}, err + } + + lowerTickInfo, err := k.getTickInfo(ctx, poolId, lowerTick) + if err != nil { + return []sdk.DecCoins{}, err + } + + upperTickInfo, err := k.getTickInfo(ctx, poolId, upperTick) + if err != nil { + return []sdk.DecCoins{}, err + } + + if currentTick < lowerTick { + // If current tick is below range, we subtract uptime growth of upper tick from that of lower tick + return osmoutils.SubDecCoinArrays(getUptimeTrackerValues(lowerTickInfo.UptimeTrackers), getUptimeTrackerValues(upperTickInfo.UptimeTrackers)) + } else if currentTick < upperTick { + // If current tick is within range, we subtract uptime growth of lower and upper tick from global growth + globalMinusUpper, err := osmoutils.SubDecCoinArrays(globalUptimeValues, getUptimeTrackerValues(upperTickInfo.UptimeTrackers)) + if err != nil { + return []sdk.DecCoins{}, err + } + + return osmoutils.SubDecCoinArrays(globalMinusUpper, getUptimeTrackerValues(lowerTickInfo.UptimeTrackers)) + } else { + // If current tick is above range, we subtract uptime growth of lower tick from that of upper tick + return osmoutils.SubDecCoinArrays(getUptimeTrackerValues(upperTickInfo.UptimeTrackers), getUptimeTrackerValues(lowerTickInfo.UptimeTrackers)) + } +} + +// UptimeGrowthOutsideRange returns the uptime growth outside the given tick range for all supported uptimes +func (k Keeper) UptimeGrowthOutsideRange(ctx sdk.Context, poolId uint64, currentTick int64, lowerTick int64, upperTick int64) ([]sdk.DecCoins, error) { + globalUptimeValues, err := k.getUptimeAccumulatorValues(ctx, poolId) + if err != nil { + return []sdk.DecCoins{}, err + } + + uptimeGrowthInside, err := k.UptimeGrowthInsideRange(ctx, poolId, currentTick, lowerTick, upperTick) + if err != nil { + return []sdk.DecCoins{}, err + } + + return osmoutils.SubDecCoinArrays(globalUptimeValues, uptimeGrowthInside) +} \ No newline at end of file From 37bc26b735458f8f077692b594ffc589318145d3 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 23 Feb 2023 08:31:43 -0800 Subject: [PATCH 086/136] update osmoutils go mod and remove curTick as fn param --- go.mod | 2 +- go.sum | 4 ++-- x/concentrated-liquidity/incentives.go | 13 ++++++++++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 44629d8be74..068cdd8c1c1 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/ory/dockertest/v3 v3.9.1 github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 - github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230220020447-efe299ca44e0 + github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230223162608-2c0076afdafc github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 diff --git a/go.sum b/go.sum index 1ca2c1cd412..3ac21f6714e 100644 --- a/go.sum +++ b/go.sum @@ -861,8 +861,8 @@ github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 h1:Ylmch github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3/go.mod h1:lV6KnqXYD/ayTe7310MHtM3I2q8Z6bBfMAi+bhwPYtI= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 h1:+EbINXzHQyDtHje2CND357A22H2zUpceTtwJClC9IAM= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260/go.mod h1:KrzYoNtnWUH75rj1XAsSR4nymlHFU7jeVOx7/1KMe0k= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230220020447-efe299ca44e0 h1:IFNAXHnGoardt/1RQd1efwM/22GUtwJLhR1qQFZKsh4= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230220020447-efe299ca44e0/go.mod h1:/WgLS5/cEgBnR/C6pLQjujGceD/G5i0jDsEEeqvIpgI= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230223162608-2c0076afdafc h1:pT+1g6yADNZFuuCUTfrOTm0DCmQ40NSmCJDE42C5674= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230223162608-2c0076afdafc/go.mod h1:fHfEDIHu347XE+64DISa7LJ5OOWpubz+6H28huZ90fo= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 h1:Ov+gyEBpU2hJkLIFAHCcQZwehCSCXFNYzqQY1zJqSXk= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8/go.mod h1:Kh2V4fLvLM4/EagRX53CYDJnILAz9NzCCETKXoH/sno= github.com/osmosis-labs/wasmd v0.29.2-0.20221222131554-7c8ea36a6e30 h1:6uMi7HhPSwvKKU7j5NqljseFTEz4I7qHr+IPnnn42Ck= diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index eba77fb897a..81007f1a2a2 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -283,12 +283,19 @@ func (k Keeper) GetAllIncentiveRecordsForPool(ctx sdk.Context, poolId uint64) ([ } // UptimeGrowthInsideRange returns the uptime growth within the given tick range for all supported uptimes -func (k Keeper) UptimeGrowthInsideRange(ctx sdk.Context, poolId uint64, currentTick int64, lowerTick int64, upperTick int64) ([]sdk.DecCoins, error) { +func (k Keeper) UptimeGrowthInsideRange(ctx sdk.Context, poolId uint64, lowerTick int64, upperTick int64) ([]sdk.DecCoins, error) { globalUptimeValues, err := k.getUptimeAccumulatorValues(ctx, poolId) if err != nil { return []sdk.DecCoins{}, err } + pool, err := k.getPoolById(ctx, poolId) + if err != nil { + return []sdk.DecCoins{}, err + } + + currentTick := pool.GetCurrentTick().Int64() + lowerTickInfo, err := k.getTickInfo(ctx, poolId, lowerTick) if err != nil { return []sdk.DecCoins{}, err @@ -317,13 +324,13 @@ func (k Keeper) UptimeGrowthInsideRange(ctx sdk.Context, poolId uint64, currentT } // UptimeGrowthOutsideRange returns the uptime growth outside the given tick range for all supported uptimes -func (k Keeper) UptimeGrowthOutsideRange(ctx sdk.Context, poolId uint64, currentTick int64, lowerTick int64, upperTick int64) ([]sdk.DecCoins, error) { +func (k Keeper) UptimeGrowthOutsideRange(ctx sdk.Context, poolId uint64, lowerTick int64, upperTick int64) ([]sdk.DecCoins, error) { globalUptimeValues, err := k.getUptimeAccumulatorValues(ctx, poolId) if err != nil { return []sdk.DecCoins{}, err } - uptimeGrowthInside, err := k.UptimeGrowthInsideRange(ctx, poolId, currentTick, lowerTick, upperTick) + uptimeGrowthInside, err := k.UptimeGrowthInsideRange(ctx, poolId, lowerTick, upperTick) if err != nil { return []sdk.DecCoins{}, err } From 49dc498ad3b4b4dcfbc30c4da16a55c1a4ab0c86 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 23 Feb 2023 10:48:44 -0800 Subject: [PATCH 087/136] thorough tests for new functionality --- x/concentrated-liquidity/fees_test.go | 18 +- x/concentrated-liquidity/incentives.go | 12 +- x/concentrated-liquidity/incentives_test.go | 657 +++++++++++++++++++- x/concentrated-liquidity/keeper_test.go | 4 +- 4 files changed, 675 insertions(+), 16 deletions(-) diff --git a/x/concentrated-liquidity/fees_test.go b/x/concentrated-liquidity/fees_test.go index 484d6484b1f..ccdeb5a358a 100644 --- a/x/concentrated-liquidity/fees_test.go +++ b/x/concentrated-liquidity/fees_test.go @@ -16,8 +16,10 @@ import ( cltypes "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" ) -const NoUSDCExpected = "" -const NoETHExpected = "" +const ( + NoUSDCExpected = "" + NoETHExpected = "" +) // fields used to identify a fee position. type positionIdentifiers struct { @@ -178,6 +180,8 @@ func (s *KeeperTestSuite) TestGetFeeGrowthOutside() { defaultUpperTickIndex := int64(5) defaultLowerTickIndex := int64(3) + emptyUptimeTrackers := wrapUptimeTrackers(getExpectedUptimes().emptyExpectedAccumValues) + tests := map[string]feeGrowthOutsideTest{ // imagine single swap over entire position // crossing left > right and stopping above upper tick @@ -316,8 +320,8 @@ func (s *KeeperTestSuite) TestGetFeeGrowthOutside() { pool = s.PrepareConcentratedPool() currentTick := pool.GetCurrentTick().Int64() - s.initializeTick(s.Ctx, currentTick, tc.lowerTick, defaultInitialLiquidity, tc.lowerTickFeeGrowthOutside, false) - s.initializeTick(s.Ctx, currentTick, tc.upperTick, defaultInitialLiquidity, tc.upperTickFeeGrowthOutside, true) + s.initializeTick(s.Ctx, currentTick, tc.lowerTick, defaultInitialLiquidity, tc.lowerTickFeeGrowthOutside, emptyUptimeTrackers, false) + s.initializeTick(s.Ctx, currentTick, tc.upperTick, defaultInitialLiquidity, tc.upperTickFeeGrowthOutside, emptyUptimeTrackers, true) pool.SetCurrentTick(sdk.NewInt(tc.currentTick)) s.App.ConcentratedLiquidityKeeper.SetPool(s.Ctx, pool) err := s.App.ConcentratedLiquidityKeeper.ChargeFee(s.Ctx, validPoolId, tc.globalFeeGrowth) @@ -567,6 +571,7 @@ func (suite *KeeperTestSuite) TestChargeFee() { func (s *KeeperTestSuite) TestCollectFees() { ownerWithValidPosition := s.TestAccs[0] defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + emptyUptimeTrackers := wrapUptimeTrackers(getExpectedUptimes().emptyExpectedAccumValues) tests := map[string]struct { // setup parameters. @@ -780,9 +785,9 @@ func (s *KeeperTestSuite) TestCollectFees() { s.initializeFeeAccumulatorPositionWithLiquidity(ctx, validPoolId, ownerWithValidPosition, tc.lowerTick, tc.upperTick, tc.initialLiquidity) - s.initializeTick(ctx, tc.currentTick, tc.lowerTick, tc.initialLiquidity, tc.lowerTickFeeGrowthOutside, false) + s.initializeTick(ctx, tc.currentTick, tc.lowerTick, tc.initialLiquidity, tc.lowerTickFeeGrowthOutside, emptyUptimeTrackers, false) - s.initializeTick(ctx, tc.currentTick, tc.upperTick, tc.initialLiquidity, tc.upperTickFeeGrowthOutside, true) + s.initializeTick(ctx, tc.currentTick, tc.upperTick, tc.initialLiquidity, tc.upperTickFeeGrowthOutside, emptyUptimeTrackers, true) validPool.SetCurrentTick(sdk.NewInt(tc.currentTick)) clKeeper.SetPool(ctx, validPool) @@ -1148,7 +1153,6 @@ func (s *KeeperTestSuite) tickStatusInvariance(ticksActivatedAfterEachSwap [][]s if expectedFeeDenoms[i] != NoUSDCExpected && expectedFeeDenoms[i] != NoETHExpected { s.Require().True(coins.AmountOf(expectedFeeDenoms[i]).GT(sdk.ZeroInt())) } - } else { // If the position was not active, check that the fees collected are zero s.Require().Nil(coins) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 81007f1a2a2..1f3f3f65f5f 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -282,8 +282,8 @@ func (k Keeper) GetAllIncentiveRecordsForPool(ctx sdk.Context, poolId uint64) ([ return osmoutils.GatherValuesFromStorePrefixWithKeyParser(ctx.KVStore(k.storeKey), types.KeyPoolIncentiveRecords(poolId), ParseFullIncentiveRecordFromBz) } -// UptimeGrowthInsideRange returns the uptime growth within the given tick range for all supported uptimes -func (k Keeper) UptimeGrowthInsideRange(ctx sdk.Context, poolId uint64, lowerTick int64, upperTick int64) ([]sdk.DecCoins, error) { +// GetUptimeGrowthInsideRange returns the uptime growth within the given tick range for all supported uptimes +func (k Keeper) GetUptimeGrowthInsideRange(ctx sdk.Context, poolId uint64, lowerTick int64, upperTick int64) ([]sdk.DecCoins, error) { globalUptimeValues, err := k.getUptimeAccumulatorValues(ctx, poolId) if err != nil { return []sdk.DecCoins{}, err @@ -315,7 +315,7 @@ func (k Keeper) UptimeGrowthInsideRange(ctx sdk.Context, poolId uint64, lowerTic if err != nil { return []sdk.DecCoins{}, err } - + return osmoutils.SubDecCoinArrays(globalMinusUpper, getUptimeTrackerValues(lowerTickInfo.UptimeTrackers)) } else { // If current tick is above range, we subtract uptime growth of lower tick from that of upper tick @@ -324,16 +324,16 @@ func (k Keeper) UptimeGrowthInsideRange(ctx sdk.Context, poolId uint64, lowerTic } // UptimeGrowthOutsideRange returns the uptime growth outside the given tick range for all supported uptimes -func (k Keeper) UptimeGrowthOutsideRange(ctx sdk.Context, poolId uint64, lowerTick int64, upperTick int64) ([]sdk.DecCoins, error) { +func (k Keeper) GetUptimeGrowthOutsideRange(ctx sdk.Context, poolId uint64, lowerTick int64, upperTick int64) ([]sdk.DecCoins, error) { globalUptimeValues, err := k.getUptimeAccumulatorValues(ctx, poolId) if err != nil { return []sdk.DecCoins{}, err } - uptimeGrowthInside, err := k.UptimeGrowthInsideRange(ctx, poolId, lowerTick, upperTick) + uptimeGrowthInside, err := k.GetUptimeGrowthInsideRange(ctx, poolId, lowerTick, upperTick) if err != nil { return []sdk.DecCoins{}, err } return osmoutils.SubDecCoinArrays(globalUptimeValues, uptimeGrowthInside) -} \ No newline at end of file +} diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index feaae5c1a13..8920526a28e 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -88,6 +88,7 @@ type ExpectedUptimes struct { hundredTokensMultiDenom []sdk.DecCoins twoHundredTokensMultiDenom []sdk.DecCoins threeHundredTokensMultiDenom []sdk.DecCoins + fourHundredTokensMultiDenom []sdk.DecCoins varyingTokensSingleDenom []sdk.DecCoins varyingTokensMultiDenom []sdk.DecCoins } @@ -102,6 +103,7 @@ func getExpectedUptimes() ExpectedUptimes { hundredTokensMultiDenom: []sdk.DecCoins{}, twoHundredTokensMultiDenom: []sdk.DecCoins{}, threeHundredTokensMultiDenom: []sdk.DecCoins{}, + fourHundredTokensMultiDenom: []sdk.DecCoins{}, varyingTokensSingleDenom: []sdk.DecCoins{}, varyingTokensMultiDenom: []sdk.DecCoins{}, } @@ -111,6 +113,7 @@ func getExpectedUptimes() ExpectedUptimes { expUptimes.hundredTokensMultiDenom = append(expUptimes.hundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins, cl.HundredBarCoins)) expUptimes.twoHundredTokensMultiDenom = append(expUptimes.twoHundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(cl.HundredFooCoins), cl.HundredBarCoins.Add(cl.HundredBarCoins))) expUptimes.threeHundredTokensMultiDenom = append(expUptimes.threeHundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(cl.HundredFooCoins).Add(cl.HundredFooCoins), cl.HundredBarCoins.Add(cl.HundredBarCoins).Add(cl.HundredBarCoins))) + expUptimes.fourHundredTokensMultiDenom = append(expUptimes.fourHundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(cl.HundredFooCoins).Add(cl.HundredFooCoins).Add(cl.HundredFooCoins), cl.HundredBarCoins.Add(cl.HundredBarCoins).Add(cl.HundredBarCoins).Add(cl.HundredBarCoins))) expUptimes.varyingTokensSingleDenom = append(expUptimes.varyingTokensSingleDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(sdk.NewDecCoin("foo", sdk.NewInt(int64(i)))))) expUptimes.varyingTokensMultiDenom = append(expUptimes.varyingTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(sdk.NewDecCoin("foo", sdk.NewInt(int64(i)))), cl.HundredBarCoins.Add(sdk.NewDecCoin("bar", sdk.NewInt(int64(i*3)))))) } @@ -143,7 +146,7 @@ func chargeIncentive(incentiveRecord types.IncentiveRecord, timeElapsed time.Dur } // Helper for adding a predetermined amount to each global uptime accum in clPool -func addToUptimeAccums(ctx sdk.Context, poolId uint64, clKeeper *cl.Keeper, addValues []sdk.DecCoins) error { +func addToUptimeAccums(ctx sdk.Context, poolId uint64, clKeeper *cl.Keeper, addValues []sdk.DecCoins) error { poolUptimeAccumulators, err := clKeeper.GetUptimeAccumulators(ctx, poolId) if err != nil { return err @@ -690,3 +693,655 @@ func (s *KeeperTestSuite) TestIncentiveRecordsSetAndGet() { s.Require().NoError(err) s.Require().Equal(emptyIncentiveRecords, allRecordsPoolTwo) } + +func (s *KeeperTestSuite) TestGetUptimeGrowthInside() { + defaultPoolId := uint64(1) + defaultInitialLiquidity := sdk.OneDec() + uptimeHelper := getExpectedUptimes() + + type uptimeGrowthOutsideTest struct { + poolSetup bool + + lowerTick int64 + upperTick int64 + currentTick int64 + lowerTickUptimeGrowthOutside []sdk.DecCoins + upperTickUptimeGrowthOutside []sdk.DecCoins + globalUptimeGrowth []sdk.DecCoins + + expectedUptimeGrowthInside []sdk.DecCoins + invalidTick bool + expectedError bool + } + + tests := map[string]uptimeGrowthOutsideTest{ + // current tick above range + + "current tick > upper tick, nonzero uptime growth inside": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 2, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.threeHundredTokensMultiDenom, + + // Since current tick is above range, we expect upper - lower + expectedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + expectedError: false, + }, + "current tick > upper tick, nonzero uptime growth inside (wider range)": { + poolSetup: true, + lowerTick: 12444, + upperTick: 15013, + currentTick: 50320, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.threeHundredTokensMultiDenom, + + // Since current tick is above range, we expect upper - lower + expectedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + expectedError: false, + }, + "current tick > upper tick, zero uptime growth inside (nonempty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 2, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.threeHundredTokensMultiDenom, + + // Since current tick is above range, we expect upper - lower + expectedUptimeGrowthInside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + "current tick > upper tick, zero uptime growth inside (empty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 2, + lowerTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + upperTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + globalUptimeGrowth: uptimeHelper.emptyExpectedAccumValues, + + // Since current tick is above range, we expect upper - lower + expectedUptimeGrowthInside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + "current tick > upper tick, zero uptime growth inside with extraneous uptime growth": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 2, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.twoHundredTokensMultiDenom, + + // Since current tick is above range, we expect upper - lower + expectedUptimeGrowthInside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + + // current tick within range + + "upper tick > current tick > lower tick, nonzero uptime growth inside": { + poolSetup: true, + lowerTick: 0, + upperTick: 2, + currentTick: 1, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.threeHundredTokensMultiDenom, + + // Since current tick is within range, we expect global - upper - lower + expectedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + expectedError: false, + }, + "upper tick > current tick > lower tick, nonzero uptime growth inside (wider range)": { + poolSetup: true, + lowerTick: -19753, + upperTick: 8921, + currentTick: -97, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.threeHundredTokensMultiDenom, + + // Since current tick is within range, we expect global - upper - lower + expectedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + expectedError: false, + }, + "upper tick > current tick > lower tick, zero uptime growth inside (nonempty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 2, + currentTick: 1, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.twoHundredTokensMultiDenom, + + // Since current tick is within range, we expect global - upper - lower + expectedUptimeGrowthInside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + "upper tick > current tick > lower tick, zero uptime growth inside (empty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 2, + currentTick: 1, + lowerTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + upperTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + globalUptimeGrowth: uptimeHelper.emptyExpectedAccumValues, + + // Since current tick is within range, we expect global - upper - lower + expectedUptimeGrowthInside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + + // current tick below range + + "current tick < lower tick, nonzero uptime growth inside": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: -1, + lowerTickUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.threeHundredTokensMultiDenom, + + // Since current tick is below range, we expect lower - upper + expectedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + expectedError: false, + }, + "current tick < lower tick, nonzero uptime growth inside (wider range)": { + poolSetup: true, + lowerTick: 328, + upperTick: 726, + currentTick: 189, + lowerTickUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.threeHundredTokensMultiDenom, + + // Since current tick is below range, we expect lower - upper + expectedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + expectedError: false, + }, + "current tick < lower tick, zero uptime growth inside (nonempty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: -1, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.threeHundredTokensMultiDenom, + + // Since current tick is below range, we expect lower - upper + expectedUptimeGrowthInside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + "current tick < lower tick, zero uptime growth inside (empty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: -1, + lowerTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + upperTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + globalUptimeGrowth: uptimeHelper.emptyExpectedAccumValues, + + // Since current tick is below range, we expect lower - upper + expectedUptimeGrowthInside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + + // current tick on range boundary + + "current tick = lower tick, nonzero uptime growth inside": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 0, + lowerTickUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.fourHundredTokensMultiDenom, + + // Since we treat the range as [lower, upper) (i.e. inclusive of lower tick, exclusive of upper), + // this case is equivalent to the current tick being within the range (global - upper - lower) + expectedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + expectedError: false, + }, + "current tick = lower tick, zero uptime growth inside (nonempty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 0, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.twoHundredTokensMultiDenom, + + // Since we treat the range as [lower, upper) (i.e. inclusive of lower tick, exclusive of upper), + // this case is equivalent to the current tick being within the range (global - upper - lower) + expectedUptimeGrowthInside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + "current tick = lower tick, zero uptime growth inside (empty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 0, + lowerTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + upperTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + globalUptimeGrowth: uptimeHelper.emptyExpectedAccumValues, + + // Since we treat the range as [lower, upper) (i.e. inclusive of lower tick, exclusive of upper), + // this case is equivalent to the current tick being within the range (global - upper - lower) + expectedUptimeGrowthInside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + "current tick = upper tick, nonzero uptime growth inside": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 1, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.fourHundredTokensMultiDenom, + + // Since we treat the range as [lower, upper) (i.e. inclusive of lower tick, exclusive of upper), + // this case is equivalent to the current tick being above the range (upper - lower) + expectedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + expectedError: false, + }, + "current tick = upper tick, zero uptime growth inside (nonempty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 1, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.twoHundredTokensMultiDenom, + + // Since we treat the range as [lower, upper) (i.e. inclusive of lower tick, exclusive of upper), + // this case is equivalent to the current tick being above the range (upper - lower) + expectedUptimeGrowthInside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + "current tick = upper tick, zero uptime growth inside (empty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 1, + lowerTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + upperTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + globalUptimeGrowth: uptimeHelper.emptyExpectedAccumValues, + + // Since we treat the range as [lower, upper) (i.e. inclusive of lower tick, exclusive of upper), + // this case is equivalent to the current tick being above the range (upper - lower) + expectedUptimeGrowthInside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + + // error catching + + "error: pool has not been setup": { + poolSetup: false, + expectedError: true, + }, + } + + for name, tc := range tests { + s.Run(name, func() { + s.SetupTest() + + // if pool set up true, set up default pool + var pool types.ConcentratedPoolExtension + if tc.poolSetup { + pool = s.PrepareConcentratedPool() + currentTick := pool.GetCurrentTick().Int64() + + // Update global uptime accums + addToUptimeAccums(s.Ctx, pool.GetId(), s.App.ConcentratedLiquidityKeeper, tc.globalUptimeGrowth) + + // Update tick-level uptime trackers + s.initializeTick(s.Ctx, currentTick, tc.lowerTick, defaultInitialLiquidity, cl.EmptyCoins, wrapUptimeTrackers(tc.lowerTickUptimeGrowthOutside), true) + s.initializeTick(s.Ctx, currentTick, tc.upperTick, defaultInitialLiquidity, cl.EmptyCoins, wrapUptimeTrackers(tc.upperTickUptimeGrowthOutside), false) + pool.SetCurrentTick(sdk.NewInt(tc.currentTick)) + s.App.ConcentratedLiquidityKeeper.SetPool(s.Ctx, pool) + } + + // system under test + uptimeGrowthInside, err := s.App.ConcentratedLiquidityKeeper.GetUptimeGrowthInsideRange(s.Ctx, defaultPoolId, tc.lowerTick, tc.upperTick) + if tc.expectedError { + s.Require().Error(err) + } else { + s.Require().NoError(err) + + // check if returned uptime growth inside has correct value + s.Require().Equal(tc.expectedUptimeGrowthInside, uptimeGrowthInside) + } + }) + } +} + +func (s *KeeperTestSuite) TestGetUptimeGrowthOutside() { + defaultPoolId := uint64(1) + defaultInitialLiquidity := sdk.OneDec() + uptimeHelper := getExpectedUptimes() + + type uptimeGrowthOutsideTest struct { + poolSetup bool + + lowerTick int64 + upperTick int64 + currentTick int64 + lowerTickUptimeGrowthOutside []sdk.DecCoins + upperTickUptimeGrowthOutside []sdk.DecCoins + globalUptimeGrowth []sdk.DecCoins + + expectedUptimeGrowthOutside []sdk.DecCoins + invalidTick bool + expectedError bool + } + + tests := map[string]uptimeGrowthOutsideTest{ + // current tick above range + + "current tick > upper tick, nonzero uptime growth inside": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 2, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.threeHundredTokensMultiDenom, + + // Since current tick is above range, we expect global - (upper - lower) + expectedUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + expectedError: false, + }, + "current tick > upper tick, nonzero uptime growth inside (wider range)": { + poolSetup: true, + lowerTick: 12444, + upperTick: 15013, + currentTick: 50320, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.threeHundredTokensMultiDenom, + + // Since current tick is above range, we expect global - (upper - lower) + expectedUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + expectedError: false, + }, + "current tick > upper tick, zero uptime growth inside (nonempty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 2, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.threeHundredTokensMultiDenom, + + // Since the range is empty, we expect growth outside to be equal to global + expectedUptimeGrowthOutside: uptimeHelper.threeHundredTokensMultiDenom, + expectedError: false, + }, + "current tick > upper tick, zero uptime growth inside (empty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 2, + lowerTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + upperTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + globalUptimeGrowth: uptimeHelper.emptyExpectedAccumValues, + + // Since the range is empty, we expect growth outside to be equal to global + expectedUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + "current tick > upper tick, zero uptime growth inside with extraneous uptime growth": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 2, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.twoHundredTokensMultiDenom, + + // Since the range is empty, we expect growth outside to be equal to global + expectedUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + expectedError: false, + }, + + // current tick within range + + "upper tick > current tick > lower tick, nonzero uptime growth inside": { + poolSetup: true, + lowerTick: 0, + upperTick: 2, + currentTick: 1, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.threeHundredTokensMultiDenom, + + // Since current tick is within range, we expect global - (global - upper - lower) + expectedUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + expectedError: false, + }, + "upper tick > current tick > lower tick, nonzero uptime growth inside (wider range)": { + poolSetup: true, + lowerTick: -19753, + upperTick: 8921, + currentTick: -97, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.twoHundredTokensMultiDenom, + + // Since current tick is within range, we expect global - (global - upper - lower) + expectedUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + expectedError: false, + }, + "upper tick > current tick > lower tick, zero uptime growth inside (nonempty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 2, + currentTick: 1, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.twoHundredTokensMultiDenom, + + // Since the range is empty, we expect growth outside to be equal to global + expectedUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + expectedError: false, + }, + "upper tick > current tick > lower tick, zero uptime growth inside (empty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 2, + currentTick: 1, + lowerTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + upperTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + globalUptimeGrowth: uptimeHelper.emptyExpectedAccumValues, + + // Since the range is empty, we expect growth outside to be equal to global + expectedUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + + // current tick below range + + "current tick < lower tick, nonzero uptime growth inside": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: -1, + lowerTickUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.threeHundredTokensMultiDenom, + + // Since current tick is below range, we expect global - (lower - upper) + expectedUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + expectedError: false, + }, + "current tick < lower tick, nonzero uptime growth inside (wider range)": { + poolSetup: true, + lowerTick: 328, + upperTick: 726, + currentTick: 189, + lowerTickUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.threeHundredTokensMultiDenom, + + // Since current tick is below range, we expect global - (lower - upper) + expectedUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + expectedError: false, + }, + "current tick < lower tick, zero uptime growth inside (nonempty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: -1, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.threeHundredTokensMultiDenom, + + // Since the range is empty, we expect growth outside to be equal to global + expectedUptimeGrowthOutside: uptimeHelper.threeHundredTokensMultiDenom, + expectedError: false, + }, + "current tick < lower tick, zero uptime growth inside (empty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: -1, + lowerTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + upperTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + globalUptimeGrowth: uptimeHelper.emptyExpectedAccumValues, + + // Since the range is empty, we expect growth outside to be equal to global + expectedUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + + // current tick on range boundary + + "current tick = lower tick, nonzero uptime growth inside": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 0, + lowerTickUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.fourHundredTokensMultiDenom, + + // Since we treat the range as [lower, upper) (i.e. inclusive of lower tick, exclusive of upper), + // this case is equivalent to the current tick being within the range (global - (global - upper - lower)) + expectedUptimeGrowthOutside: uptimeHelper.threeHundredTokensMultiDenom, + expectedError: false, + }, + "current tick = lower tick, zero uptime growth inside (nonempty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 0, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.twoHundredTokensMultiDenom, + + // Since the range is empty, we expect growth outside to be equal to global + expectedUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + expectedError: false, + }, + "current tick = lower tick, zero uptime growth inside (empty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 0, + lowerTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + upperTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + globalUptimeGrowth: uptimeHelper.emptyExpectedAccumValues, + + // Since the range is empty, we expect growth outside to be equal to global + expectedUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + "current tick = upper tick, nonzero uptime growth inside": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 1, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.fourHundredTokensMultiDenom, + + // Since we treat the range as [lower, upper) (i.e. inclusive of lower tick, exclusive of upper), + // this case is equivalent to the current tick being above the range (global - (upper - lower)) + expectedUptimeGrowthOutside: uptimeHelper.threeHundredTokensMultiDenom, + expectedError: false, + }, + "current tick = upper tick, zero uptime growth inside (nonempty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 1, + lowerTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + upperTickUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + globalUptimeGrowth: uptimeHelper.twoHundredTokensMultiDenom, + + // Since the range is empty, we expect growth outside to be equal to global + expectedUptimeGrowthOutside: uptimeHelper.twoHundredTokensMultiDenom, + expectedError: false, + }, + "current tick = upper tick, zero uptime growth inside (empty trackers)": { + poolSetup: true, + lowerTick: 0, + upperTick: 1, + currentTick: 1, + lowerTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + upperTickUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + globalUptimeGrowth: uptimeHelper.emptyExpectedAccumValues, + + // Since the range is empty, we expect growth outside to be equal to global + expectedUptimeGrowthOutside: uptimeHelper.emptyExpectedAccumValues, + expectedError: false, + }, + + // error catching + + "error: pool has not been setup": { + poolSetup: false, + expectedError: true, + }, + } + + for name, tc := range tests { + s.Run(name, func() { + s.SetupTest() + + // if pool set up true, set up default pool + var pool types.ConcentratedPoolExtension + if tc.poolSetup { + pool = s.PrepareConcentratedPool() + currentTick := pool.GetCurrentTick().Int64() + + // Update global uptime accums + addToUptimeAccums(s.Ctx, pool.GetId(), s.App.ConcentratedLiquidityKeeper, tc.globalUptimeGrowth) + + // Update tick-level uptime trackers + s.initializeTick(s.Ctx, currentTick, tc.lowerTick, defaultInitialLiquidity, cl.EmptyCoins, wrapUptimeTrackers(tc.lowerTickUptimeGrowthOutside), true) + s.initializeTick(s.Ctx, currentTick, tc.upperTick, defaultInitialLiquidity, cl.EmptyCoins, wrapUptimeTrackers(tc.upperTickUptimeGrowthOutside), false) + pool.SetCurrentTick(sdk.NewInt(tc.currentTick)) + s.App.ConcentratedLiquidityKeeper.SetPool(s.Ctx, pool) + } + + // system under test + uptimeGrowthOutside, err := s.App.ConcentratedLiquidityKeeper.GetUptimeGrowthOutsideRange(s.Ctx, defaultPoolId, tc.lowerTick, tc.upperTick) + if tc.expectedError { + s.Require().Error(err) + } else { + s.Require().NoError(err) + + // check if returned uptime growth inside has correct value + s.Require().Equal(tc.expectedUptimeGrowthOutside, uptimeGrowthOutside) + } + }) + } +} diff --git a/x/concentrated-liquidity/keeper_test.go b/x/concentrated-liquidity/keeper_test.go index 12a79ecad61..e9475e8054b 100644 --- a/x/concentrated-liquidity/keeper_test.go +++ b/x/concentrated-liquidity/keeper_test.go @@ -78,7 +78,6 @@ func (s *KeeperTestSuite) SetupPosition(poolId uint64, owner sdk.AccAddress, coi // 3. Postion with consecutive price range from the default position // 4. Position with overlapping price range from the default position func (s *KeeperTestSuite) SetupDefaultPositions(poolId uint64) { - // ----------- set up positions ---------- // 1. Default position s.SetupDefaultPosition(poolId) @@ -133,7 +132,7 @@ func (s *KeeperTestSuite) validateTickUpdates(ctx sdk.Context, poolId uint64, ow s.Require().Equal(upperTickInfo.FeeGrowthOutside.String(), expectedUpperFeeGrowthOutside.String()) } -func (s *KeeperTestSuite) initializeTick(ctx sdk.Context, currentTick int64, tickIndex int64, initialLiquidity sdk.Dec, feeGrowthOutside sdk.DecCoins, isLower bool) { +func (s *KeeperTestSuite) initializeTick(ctx sdk.Context, currentTick int64, tickIndex int64, initialLiquidity sdk.Dec, feeGrowthOutside sdk.DecCoins, uptimeTrackers []model.UptimeTracker, isLower bool) { err := s.App.ConcentratedLiquidityKeeper.InitOrUpdateTick(ctx, validPoolId, currentTick, tickIndex, initialLiquidity, isLower) s.Require().NoError(err) @@ -141,6 +140,7 @@ func (s *KeeperTestSuite) initializeTick(ctx sdk.Context, currentTick int64, tic s.Require().NoError(err) tickInfo.FeeGrowthOutside = feeGrowthOutside + tickInfo.UptimeTrackers = uptimeTrackers s.App.ConcentratedLiquidityKeeper.SetTickInfo(ctx, validPoolId, tickIndex, tickInfo) } From a022dfbbee2fb44b2899cbbaf96e0d7cd4772bb9 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 23 Feb 2023 10:52:52 -0800 Subject: [PATCH 088/136] clean up new functions for readability --- x/concentrated-liquidity/incentives.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 1f3f3f65f5f..838fe2056ec 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -284,28 +284,29 @@ func (k Keeper) GetAllIncentiveRecordsForPool(ctx sdk.Context, poolId uint64) ([ // GetUptimeGrowthInsideRange returns the uptime growth within the given tick range for all supported uptimes func (k Keeper) GetUptimeGrowthInsideRange(ctx sdk.Context, poolId uint64, lowerTick int64, upperTick int64) ([]sdk.DecCoins, error) { - globalUptimeValues, err := k.getUptimeAccumulatorValues(ctx, poolId) + pool, err := k.getPoolById(ctx, poolId) if err != nil { return []sdk.DecCoins{}, err } - pool, err := k.getPoolById(ctx, poolId) + // Get global uptime accumulator values + globalUptimeValues, err := k.getUptimeAccumulatorValues(ctx, poolId) if err != nil { return []sdk.DecCoins{}, err } + // Get current, lower, and upper ticks currentTick := pool.GetCurrentTick().Int64() - lowerTickInfo, err := k.getTickInfo(ctx, poolId, lowerTick) if err != nil { return []sdk.DecCoins{}, err } - upperTickInfo, err := k.getTickInfo(ctx, poolId, upperTick) if err != nil { return []sdk.DecCoins{}, err } + // Calculate uptime growth between lower and upper ticks if currentTick < lowerTick { // If current tick is below range, we subtract uptime growth of upper tick from that of lower tick return osmoutils.SubDecCoinArrays(getUptimeTrackerValues(lowerTickInfo.UptimeTrackers), getUptimeTrackerValues(upperTickInfo.UptimeTrackers)) From bcf4abd5ba32adab204b992309663279562bf2a8 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 23 Feb 2023 11:08:14 -0800 Subject: [PATCH 089/136] clean up test comments --- x/concentrated-liquidity/tick_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x/concentrated-liquidity/tick_test.go b/x/concentrated-liquidity/tick_test.go index f2f974c9368..296de76cfec 100644 --- a/x/concentrated-liquidity/tick_test.go +++ b/x/concentrated-liquidity/tick_test.go @@ -323,7 +323,7 @@ func (s *KeeperTestSuite) TestGetTickInfo() { poolToGet: validPoolId, tickToGet: preInitializedTickIndex, preInitUptimeAccumValues: expectedUptimes.varyingTokensMultiDenom, - // Note that FeeGrowthOutside is not updated, but UptimeGrowthOutsides are. + // Note that neither FeeGrowthOutside nor UptimeGrowthOutsides are updated. // We expect uptime trackers to be initialized to zero since tick > active tick expectedTickInfo: model.TickInfo{LiquidityGross: DefaultLiquidityAmt, LiquidityNet: DefaultLiquidityAmt.Neg(), UptimeTrackers: emptyUptimeTrackers}, }, @@ -332,7 +332,7 @@ func (s *KeeperTestSuite) TestGetTickInfo() { poolToGet: validPoolId, tickToGet: preInitializedTickIndex - 3, preInitUptimeAccumValues: expectedUptimes.varyingTokensMultiDenom, - // Note that FeeGrowthOutside is not updated, but UptimeGrowthOutsides are. + // Note that both FeeGrowthOutside and UptimeGrowthOutsides are updated. // We expect uptime trackers to be initialized to global accums since tick <= active tick expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: sdk.NewDecCoins(oneEth), UptimeTrackers: varyingTokensAndDenoms}, }, @@ -341,7 +341,7 @@ func (s *KeeperTestSuite) TestGetTickInfo() { poolToGet: validPoolId, tickToGet: DefaultCurrTick.Int64(), preInitUptimeAccumValues: expectedUptimes.varyingTokensMultiDenom, - // Uptime trackers are set to global since tickToGet <= current tick + // Both fee growth and uptime trackers are set to global since tickToGet <= current tick expectedTickInfo: model.TickInfo{LiquidityGross: sdk.ZeroDec(), LiquidityNet: sdk.ZeroDec(), FeeGrowthOutside: sdk.NewDecCoins(oneEth), UptimeTrackers: varyingTokensAndDenoms}, }, { From b0e9edbbb3d767d2252f761e68a561b83fda7ff8 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 23 Feb 2023 11:27:18 -0800 Subject: [PATCH 090/136] fix test names --- x/concentrated-liquidity/tick_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/concentrated-liquidity/tick_test.go b/x/concentrated-liquidity/tick_test.go index 7d866ec0de4..90f4d230f26 100644 --- a/x/concentrated-liquidity/tick_test.go +++ b/x/concentrated-liquidity/tick_test.go @@ -444,7 +444,7 @@ func (s *KeeperTestSuite) TestCrossTick() { expectedTickFeeGrowthOutside: DefaultFeeAccumCoins.Add(defaultAdditiveFee), }, { - name: "Get tick info on existing pool and existing tick below current tick (nil uptime trackers)", + name: "Get tick info on existing pool and existing tick above current tick (nil uptime trackers)", poolToGet: validPoolId, preInitializedTickIndex: preInitializedTickIndex, tickToGet: preInitializedTickIndex, @@ -454,7 +454,7 @@ func (s *KeeperTestSuite) TestCrossTick() { expectedTickFeeGrowthOutside: DefaultFeeAccumCoins.Add(defaultAdditiveFee), }, { - name: "Get tick info on existing pool and existing tick above current tick (nonzero uptime trackers)", + name: "Get tick info on existing pool and existing tick below current tick (nonzero uptime trackers)", poolToGet: validPoolId, preInitializedTickIndex: preInitializedTickIndex, tickToGet: DefaultCurrTick.Int64() + 1, From e83af521dbc0c899dd2ba4d94f571326fb8783f6 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 23 Feb 2023 11:44:33 -0800 Subject: [PATCH 091/136] lint --- x/concentrated-liquidity/incentives_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index e732aa98e8d..19bbc007b6a 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -158,6 +158,7 @@ func addToUptimeAccums(ctx sdk.Context, poolId uint64, clKeeper *cl.Keeper, addV return nil } + func createIncentiveRecord(incentiveDenom string, remainingAmt, emissionRate sdk.Dec, startTime time.Time, minUpTime time.Duration) types.IncentiveRecord { return types.IncentiveRecord{ IncentiveDenom: incentiveDenom, @@ -873,7 +874,7 @@ func (s *KeeperTestSuite) TestGetInitialUptimeGrowthOutsidesForTick() { }) } } - + func (s *KeeperTestSuite) TestGetUptimeGrowthInsideRange() { defaultPoolId := uint64(1) defaultInitialLiquidity := sdk.OneDec() @@ -1525,4 +1526,3 @@ func (s *KeeperTestSuite) TestGetUptimeGrowthOutsideRange() { }) } } - From f5e0c707420f87030e815025cf9034725aabb96e Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 23 Feb 2023 16:57:50 -0800 Subject: [PATCH 092/136] add godoc and further comments --- osmoutils/coin_helper.go | 2 ++ x/concentrated-liquidity/incentives.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/osmoutils/coin_helper.go b/osmoutils/coin_helper.go index 571706d304c..61f2fb195e3 100644 --- a/osmoutils/coin_helper.go +++ b/osmoutils/coin_helper.go @@ -30,6 +30,8 @@ func MinCoins(coinsA sdk.Coins, coinsB sdk.Coins) sdk.Coins { return resCoins } +// SubDecCoinArrays subtracts the contents of the second param from the first (decCoinsArrayA - decCoinsArrayB) +// Note that this takes in two _arrays_ of DecCoins, meaning that each term itself is of type DecCoins (i.e. an array of DecCoin). func SubDecCoinArrays(decCoinsArrayA []sdk.DecCoins, decCoinsArrayB []sdk.DecCoins) ([]sdk.DecCoins, error) { if len(decCoinsArrayA) != len(decCoinsArrayB) { return []sdk.DecCoins{}, fmt.Errorf("DecCoin arrays must be of equal length to be subtracted") diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 838fe2056ec..91fe2affa27 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -307,6 +307,8 @@ func (k Keeper) GetUptimeGrowthInsideRange(ctx sdk.Context, poolId uint64, lower } // Calculate uptime growth between lower and upper ticks + // Note that we regard "within range" to mean [lowerTick, upperTick), + // inclusive of lowerTick and exclusive of upperTick. if currentTick < lowerTick { // If current tick is below range, we subtract uptime growth of upper tick from that of lower tick return osmoutils.SubDecCoinArrays(getUptimeTrackerValues(lowerTickInfo.UptimeTrackers), getUptimeTrackerValues(upperTickInfo.UptimeTrackers)) From 0c64337d608a4840216c35513363f80271518bee Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 23 Feb 2023 17:01:33 -0800 Subject: [PATCH 093/136] update go mod for e2e --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 068cdd8c1c1..92019f6da16 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/ory/dockertest/v3 v3.9.1 github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 - github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230223162608-2c0076afdafc + github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230224005750-f5e0c707420f github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 diff --git a/go.sum b/go.sum index 3ac21f6714e..41c1176a40e 100644 --- a/go.sum +++ b/go.sum @@ -861,8 +861,8 @@ github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 h1:Ylmch github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3/go.mod h1:lV6KnqXYD/ayTe7310MHtM3I2q8Z6bBfMAi+bhwPYtI= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 h1:+EbINXzHQyDtHje2CND357A22H2zUpceTtwJClC9IAM= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260/go.mod h1:KrzYoNtnWUH75rj1XAsSR4nymlHFU7jeVOx7/1KMe0k= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230223162608-2c0076afdafc h1:pT+1g6yADNZFuuCUTfrOTm0DCmQ40NSmCJDE42C5674= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230223162608-2c0076afdafc/go.mod h1:fHfEDIHu347XE+64DISa7LJ5OOWpubz+6H28huZ90fo= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230224005750-f5e0c707420f h1:Q8Ye1suZZG2zvTmcvl/C1whBctGY8RC/sgcJ7uGI4Cw= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230224005750-f5e0c707420f/go.mod h1:fHfEDIHu347XE+64DISa7LJ5OOWpubz+6H28huZ90fo= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 h1:Ov+gyEBpU2hJkLIFAHCcQZwehCSCXFNYzqQY1zJqSXk= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8/go.mod h1:Kh2V4fLvLM4/EagRX53CYDJnILAz9NzCCETKXoH/sno= github.com/osmosis-labs/wasmd v0.29.2-0.20221222131554-7c8ea36a6e30 h1:6uMi7HhPSwvKKU7j5NqljseFTEz4I7qHr+IPnnn42Ck= From 47bb8b4bdce57547a3249aa441de2239aa9a16e6 Mon Sep 17 00:00:00 2001 From: alpo Date: Sat, 25 Feb 2023 00:33:06 -0800 Subject: [PATCH 094/136] update liq change logic --- x/concentrated-liquidity/fees.go | 12 +++++----- x/concentrated-liquidity/position.go | 35 ++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/x/concentrated-liquidity/fees.go b/x/concentrated-liquidity/fees.go index a4f5bd65a3e..e4908b8fd21 100644 --- a/x/concentrated-liquidity/fees.go +++ b/x/concentrated-liquidity/fees.go @@ -278,16 +278,16 @@ func formatFeePositionAccumulatorKey(poolId uint64, owner sdk.AccAddress, lowerT // preparePositionAccumulator is called prior to updating unclaimed rewards, // as we must set the position's accumulator value to the sum of -// - the fee growth inside at position creation time (position.InitAccumValue) -// - fee growth outside at the current block time (feeGrowthOutside) -func preparePositionAccumulator(feeAccumulator accum.AccumulatorObject, positionKey string, feeGrowthOutside sdk.DecCoins) error { - position, err := accum.GetPosition(feeAccumulator, positionKey) +// - the fee/uptime growth inside at position creation time (position.InitAccumValue) +// - fee/uptime growth outside at the current block time (feeGrowthOutside/uptimeGrowthOutside) +func preparePositionAccumulator(accumulator accum.AccumulatorObject, positionKey string, growthOutside sdk.DecCoins) error { + position, err := accum.GetPosition(accumulator, positionKey) if err != nil { return err } - customAccumulatorValue := position.InitAccumValue.Add(feeGrowthOutside...) - err = feeAccumulator.SetPositionCustomAcc(positionKey, customAccumulatorValue) + customAccumulatorValue := position.InitAccumValue.Add(growthOutside...) + err = accumulator.SetPositionCustomAcc(positionKey, customAccumulatorValue) if err != nil { return err } diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index bba71b164b9..8fac6fcf9be 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -80,6 +80,16 @@ func (k Keeper) initOrUpdatePosition( return err } + globalUptimeGrowthInsideRange, err := k.GetUptimeGrowthInsideRange(ctx, poolId, lowerTick, upperTick) + if err != nil { + return err + } + + globalUptimeGrowthOutsideRange, err := k.GetUptimeGrowthOutsideRange(ctx, poolId, lowerTick, upperTick) + if err != nil { + return err + } + for uptimeIndex, uptime := range types.SupportedUptimes { // We assume every position update requires the position to be frozen for the // min uptime again. Thus, the difference between the position's `FrozenUntil` @@ -97,14 +107,25 @@ func (k Keeper) initOrUpdatePosition( } if !recordExists { - err = curUptimeAccum.NewPosition(positionName, position.Liquidity, emptyOptions) - } else if !liquidityDelta.IsNegative() { - err = curUptimeAccum.AddToPosition(positionName, liquidityDelta) + // Since the position should only be entitled to uptime growth within its range, we checkpoint globalUptimeGrowthInsideRange as + // its accumulator's init value. During the claiming (or, equivalently, position updating) process, we ensure that incentives are + // not overpaid. + err = curUptimeAccum.NewPositionCustomAcc(positionName, position.Liquidity, globalUptimeGrowthInsideRange[uptimeIndex], emptyOptions) + if err != nil { + return err + } } else { - err = curUptimeAccum.RemoveFromPosition(positionName, liquidityDelta.Neg()) - } - if err != nil { - return err + // Prep accum since we claim rewards first under the hood before any update (otherwise we would overpay) + err = preparePositionAccumulator(curUptimeAccum, positionName, globalUptimeGrowthOutsideRange[uptimeIndex]) + if err != nil { + return err + } + + // Adds if liqDelta is positive, removes if negative + err = curUptimeAccum.UpdatePositionCustomAcc(positionName, liquidityDelta, globalUptimeGrowthInsideRange[uptimeIndex]) + if err != nil { + return err + } } } } From a55414bd91e3fc548fe98114d3ab4968b853002d Mon Sep 17 00:00:00 2001 From: alpo Date: Sat, 25 Feb 2023 00:38:28 -0800 Subject: [PATCH 095/136] update uptime accums before gettings them for tick crossing --- x/concentrated-liquidity/tick.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index bf746a316a7..5b3994dbddb 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -71,15 +71,15 @@ func (k Keeper) crossTick(ctx sdk.Context, poolId uint64, tickIndex int64, swapS // subtract tick's fee growth outside from current fee growth global, including the fee growth of the current swap. tickInfo.FeeGrowthOutside = feeAccum.GetValue().Add(swapStateFeeGrowth).Sub(tickInfo.FeeGrowthOutside) - uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) - if err != nil { - return sdk.Dec{}, err - } - // Update global accums to now before uptime outside changes if err := k.updateUptimeAccumulatorsToNow(ctx, poolId); err != nil { return sdk.Dec{}, err } + + uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) + if err != nil { + return sdk.Dec{}, err + } // For each supported uptime, subtract tick's uptime growth outside from the respective uptime accumulator // This is functionally equivalent to "flipping" the trackers once the tick is crossed From 12962ae098f00362d84bebf145b8e2a582f5fc83 Mon Sep 17 00:00:00 2001 From: alpo Date: Sat, 25 Feb 2023 10:56:04 -0800 Subject: [PATCH 096/136] abstract uptime init and update logic to helper --- x/concentrated-liquidity/incentives.go | 70 ++++++++++++++++++++++++++ x/concentrated-liquidity/position.go | 43 ++++++---------- 2 files changed, 85 insertions(+), 28 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 91fe2affa27..fb6774fb4dd 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -340,3 +340,73 @@ func (k Keeper) GetUptimeGrowthOutsideRange(ctx sdk.Context, poolId uint64, lowe return osmoutils.SubDecCoinArrays(globalUptimeValues, uptimeGrowthInside) } + +// initOrUpdatePositionUptime either adds or updates records for all uptime accumulators `position` qualifies for +func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, position *model.Position, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, frozenUntil time.Time) error { + // We update accumulators _prior_ to any position-related updates to ensure + // past rewards aren't distributed to new liquidity. We also update pool's + // LastLiquidityUpdate here. + err := k.updateUptimeAccumulatorsToNow(ctx, poolId) + if err != nil { + return err + } + + // Create records for relevant uptime accumulators here. + uptimeAccumulators, err := k.getUptimeAccumulators(ctx, poolId) + if err != nil { + return err + } + + globalUptimeGrowthInsideRange, err := k.GetUptimeGrowthInsideRange(ctx, poolId, lowerTick, upperTick) + if err != nil { + return err + } + + globalUptimeGrowthOutsideRange, err := k.GetUptimeGrowthOutsideRange(ctx, poolId, lowerTick, upperTick) + if err != nil { + return err + } + + // Loop through uptime accums for all supported uptimes on the pool and init or update position's records + for uptimeIndex, uptime := range types.SupportedUptimes { + // We assume every position update requires the position to be frozen for the + // min uptime again. Thus, the difference between the position's `FrozenUntil` + // and the blocktime when the update happens should be greater than or equal + // to the required uptime. + if position.FrozenUntil.Sub(ctx.BlockTime()) >= uptime { + curUptimeAccum := uptimeAccumulators[uptimeIndex] + + // If a record does not exist for this uptime accumulator, create a new position. + // Otherwise, add to existing record. + positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil)) + recordExists, err := curUptimeAccum.HasPosition(positionName) + if err != nil { + return err + } + + if !recordExists { + // Since the position should only be entitled to uptime growth within its range, we checkpoint globalUptimeGrowthInsideRange as + // its accumulator's init value. During the claiming (or, equivalently, position updating) process, we ensure that incentives are + // not overpaid. + err = curUptimeAccum.NewPositionCustomAcc(positionName, position.Liquidity, globalUptimeGrowthInsideRange[uptimeIndex], emptyOptions) + if err != nil { + return err + } + } else { + // Prep accum since we claim rewards first under the hood before any update (otherwise we would overpay) + err = preparePositionAccumulator(curUptimeAccum, positionName, globalUptimeGrowthOutsideRange[uptimeIndex]) + if err != nil { + return err + } + + // Adds if liqDelta is positive, removes if negative + err = curUptimeAccum.UpdatePositionCustomAcc(positionName, liquidityDelta, globalUptimeGrowthInsideRange[uptimeIndex]) + if err != nil { + return err + } + } + } + } + + return nil +} \ No newline at end of file diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 8fac6fcf9be..6645dd9f6c1 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -66,6 +66,14 @@ func (k Keeper) initOrUpdatePosition( // TODO: consider deleting position if liquidity becomes zero + // TODO: replace all uptime-related logic below with the following (will break tests): + /* + err = k.initOrUpdatePositionUptime(ctx, poolId, position, owner, lowerTick, upperTick, liquidityDelta, frozenUntil) + if err != nil { + return err + } + */ + // We update accumulators _prior_ to any position-related updates to ensure // past rewards aren't distributed to new liquidity. We also update pool's // LastLiquidityUpdate here. @@ -80,16 +88,6 @@ func (k Keeper) initOrUpdatePosition( return err } - globalUptimeGrowthInsideRange, err := k.GetUptimeGrowthInsideRange(ctx, poolId, lowerTick, upperTick) - if err != nil { - return err - } - - globalUptimeGrowthOutsideRange, err := k.GetUptimeGrowthOutsideRange(ctx, poolId, lowerTick, upperTick) - if err != nil { - return err - } - for uptimeIndex, uptime := range types.SupportedUptimes { // We assume every position update requires the position to be frozen for the // min uptime again. Thus, the difference between the position's `FrozenUntil` @@ -107,25 +105,14 @@ func (k Keeper) initOrUpdatePosition( } if !recordExists { - // Since the position should only be entitled to uptime growth within its range, we checkpoint globalUptimeGrowthInsideRange as - // its accumulator's init value. During the claiming (or, equivalently, position updating) process, we ensure that incentives are - // not overpaid. - err = curUptimeAccum.NewPositionCustomAcc(positionName, position.Liquidity, globalUptimeGrowthInsideRange[uptimeIndex], emptyOptions) - if err != nil { - return err - } + err = curUptimeAccum.NewPosition(positionName, position.Liquidity, emptyOptions) + } else if !liquidityDelta.IsNegative() { + err = curUptimeAccum.AddToPosition(positionName, liquidityDelta) } else { - // Prep accum since we claim rewards first under the hood before any update (otherwise we would overpay) - err = preparePositionAccumulator(curUptimeAccum, positionName, globalUptimeGrowthOutsideRange[uptimeIndex]) - if err != nil { - return err - } - - // Adds if liqDelta is positive, removes if negative - err = curUptimeAccum.UpdatePositionCustomAcc(positionName, liquidityDelta, globalUptimeGrowthInsideRange[uptimeIndex]) - if err != nil { - return err - } + err = curUptimeAccum.RemoveFromPosition(positionName, liquidityDelta.Neg()) + } + if err != nil { + return err } } } From 333a2e73cb4ae32c4205bdc4fc9d916dff5653e1 Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 27 Feb 2023 16:43:03 -0800 Subject: [PATCH 097/136] add thorough tests for initOrUpdatePositionUptime --- x/concentrated-liquidity/export_test.go | 6 + x/concentrated-liquidity/incentives.go | 7 +- x/concentrated-liquidity/incentives_test.go | 307 +++++++++++++++++++- x/concentrated-liquidity/lp.go | 1 + 4 files changed, 316 insertions(+), 5 deletions(-) diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index 96001535926..83c5ccfb0dc 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -16,6 +16,8 @@ var ( EmptyCoins = emptyCoins HundredFooCoins = sdk.NewDecCoin("foo", sdk.NewInt(100)) HundredBarCoins = sdk.NewDecCoin("bar", sdk.NewInt(100)) + TwoHundredFooCoins = sdk.NewDecCoin("foo", sdk.NewInt(200)) + TwoHundredBarCoins = sdk.NewDecCoin("bar", sdk.NewInt(200)) ) // OrderInitialPoolDenoms sets the pool denoms of a cl pool @@ -213,3 +215,7 @@ func (k Keeper) SetMultipleIncentiveRecords(ctx sdk.Context, incentiveRecords [] func (k Keeper) GetInitialUptimeGrowthOutsidesForTick(ctx sdk.Context, poolId uint64, tick int64) ([]sdk.DecCoins, error) { return k.getInitialUptimeGrowthOutsidesForTick(ctx, poolId, tick) } + +func (k Keeper) InitOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, position *model.Position, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, frozenUntil time.Time) error { + return k.initOrUpdatePositionUptime(ctx, poolId, position, owner, lowerTick, upperTick, liquidityDelta, frozenUntil) +} diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index fb6774fb4dd..a78c5d3633f 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -373,6 +373,8 @@ func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, posit // min uptime again. Thus, the difference between the position's `FrozenUntil` // and the blocktime when the update happens should be greater than or equal // to the required uptime. + + // TODO: consider replacing BlockTime with a new field, JoinTime, so that post-join updates are not skipped if position.FrozenUntil.Sub(ctx.BlockTime()) >= uptime { curUptimeAccum := uptimeAccumulators[uptimeIndex] @@ -398,8 +400,9 @@ func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, posit if err != nil { return err } - - // Adds if liqDelta is positive, removes if negative + + // Note that even though "unclaimed rewards" accrue in the accumulator prior to frozenUntil, since position withdrawal + // and incentive collection are only allowed when current time is past frozenUntil these rewards are not accessible until then. err = curUptimeAccum.UpdatePositionCustomAcc(positionName, liquidityDelta, globalUptimeGrowthInsideRange[uptimeIndex]) if err != nil { return err diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 19bbc007b6a..d7fa02a0b3f 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/osmosis-labs/osmosis/osmoutils/accum" cl "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" @@ -89,6 +90,7 @@ type ExpectedUptimes struct { twoHundredTokensMultiDenom []sdk.DecCoins threeHundredTokensMultiDenom []sdk.DecCoins fourHundredTokensMultiDenom []sdk.DecCoins + sixHundredTokensMultiDenom []sdk.DecCoins varyingTokensSingleDenom []sdk.DecCoins varyingTokensMultiDenom []sdk.DecCoins } @@ -104,6 +106,7 @@ func getExpectedUptimes() ExpectedUptimes { twoHundredTokensMultiDenom: []sdk.DecCoins{}, threeHundredTokensMultiDenom: []sdk.DecCoins{}, fourHundredTokensMultiDenom: []sdk.DecCoins{}, + sixHundredTokensMultiDenom: []sdk.DecCoins{}, varyingTokensSingleDenom: []sdk.DecCoins{}, varyingTokensMultiDenom: []sdk.DecCoins{}, } @@ -111,9 +114,10 @@ func getExpectedUptimes() ExpectedUptimes { expUptimes.emptyExpectedAccumValues = append(expUptimes.emptyExpectedAccumValues, cl.EmptyCoins) expUptimes.hundredTokensSingleDenom = append(expUptimes.hundredTokensSingleDenom, sdk.NewDecCoins(cl.HundredFooCoins)) expUptimes.hundredTokensMultiDenom = append(expUptimes.hundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins, cl.HundredBarCoins)) - expUptimes.twoHundredTokensMultiDenom = append(expUptimes.twoHundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(cl.HundredFooCoins), cl.HundredBarCoins.Add(cl.HundredBarCoins))) - expUptimes.threeHundredTokensMultiDenom = append(expUptimes.threeHundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(cl.HundredFooCoins).Add(cl.HundredFooCoins), cl.HundredBarCoins.Add(cl.HundredBarCoins).Add(cl.HundredBarCoins))) - expUptimes.fourHundredTokensMultiDenom = append(expUptimes.fourHundredTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(cl.HundredFooCoins).Add(cl.HundredFooCoins).Add(cl.HundredFooCoins), cl.HundredBarCoins.Add(cl.HundredBarCoins).Add(cl.HundredBarCoins).Add(cl.HundredBarCoins))) + expUptimes.twoHundredTokensMultiDenom = append(expUptimes.twoHundredTokensMultiDenom, sdk.NewDecCoins(cl.TwoHundredFooCoins, cl.TwoHundredBarCoins)) + expUptimes.threeHundredTokensMultiDenom = append(expUptimes.threeHundredTokensMultiDenom, sdk.NewDecCoins(cl.TwoHundredFooCoins.Add(cl.HundredFooCoins), cl.TwoHundredBarCoins.Add(cl.HundredBarCoins))) + expUptimes.fourHundredTokensMultiDenom = append(expUptimes.fourHundredTokensMultiDenom, sdk.NewDecCoins(cl.TwoHundredFooCoins.Add(cl.TwoHundredFooCoins), cl.TwoHundredBarCoins.Add(cl.TwoHundredBarCoins))) + expUptimes.sixHundredTokensMultiDenom = append(expUptimes.sixHundredTokensMultiDenom, sdk.NewDecCoins(cl.TwoHundredFooCoins.Add(cl.TwoHundredFooCoins).Add(cl.TwoHundredFooCoins), cl.TwoHundredBarCoins.Add(cl.TwoHundredBarCoins).Add(cl.TwoHundredBarCoins))) expUptimes.varyingTokensSingleDenom = append(expUptimes.varyingTokensSingleDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(sdk.NewDecCoin("foo", sdk.NewInt(int64(i)))))) expUptimes.varyingTokensMultiDenom = append(expUptimes.varyingTokensMultiDenom, sdk.NewDecCoins(cl.HundredFooCoins.Add(sdk.NewDecCoin("foo", sdk.NewInt(int64(i)))), cl.HundredBarCoins.Add(sdk.NewDecCoin("bar", sdk.NewInt(int64(i*3)))))) } @@ -1526,3 +1530,300 @@ func (s *KeeperTestSuite) TestGetUptimeGrowthOutsideRange() { }) } } + +func (s *KeeperTestSuite) TestInitOrUpdatePositionUptime() { + defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + uptimeHelper := getExpectedUptimes() + + type tick struct { + tickIndex int64 + uptimeTrackers []model.UptimeTracker + } + + tests := []struct { + name string + position *model.Position + + lowerTick tick + upperTick tick + currentTickIndex sdk.Int + globalUptimeAccumValues []sdk.DecCoins + + // For testing updates on existing liquidity + existingPosition bool + newLowerTick tick + newUpperTick tick + addToGlobalAccums []sdk.DecCoins + + expectedInitAccumValue []sdk.DecCoins + expectedUnclaimedRewards []sdk.DecCoins + expectedErr error + }{ + // New position tests + + { + name: "(lower < curr < upper) default freeze time with nonzero uptime trackers", + position: &model.Position{ + FrozenUntil: defaultFrozenUntil, + Liquidity: DefaultLiquidityAmt, + }, + lowerTick: tick{ + tickIndex: -50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), + }, + upperTick: tick{ + tickIndex: 50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), + }, + currentTickIndex: sdk.ZeroInt(), + globalUptimeAccumValues: uptimeHelper.threeHundredTokensMultiDenom, + expectedInitAccumValue: uptimeHelper.hundredTokensMultiDenom, + expectedUnclaimedRewards: uptimeHelper.emptyExpectedAccumValues, + }, + { + name: "(lower < upper < curr) default freeze time with nonzero uptime trackers", + position: &model.Position{ + FrozenUntil: defaultFrozenUntil, + Liquidity: DefaultLiquidityAmt, + }, + lowerTick: tick{ + tickIndex: -50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), + }, + upperTick: tick{ + tickIndex: 50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.threeHundredTokensMultiDenom), + }, + currentTickIndex: sdk.NewInt(51), + globalUptimeAccumValues: uptimeHelper.fourHundredTokensMultiDenom, + expectedInitAccumValue: uptimeHelper.twoHundredTokensMultiDenom, + expectedUnclaimedRewards: uptimeHelper.emptyExpectedAccumValues, + }, + { + name: "(curr < lower < upper) default freeze time with nonzero uptime trackers", + position: &model.Position{ + FrozenUntil: defaultFrozenUntil, + Liquidity: DefaultLiquidityAmt, + }, + lowerTick: tick{ + tickIndex: -50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.threeHundredTokensMultiDenom), + }, + upperTick: tick{ + tickIndex: 50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), + }, + currentTickIndex: sdk.NewInt(-51), + globalUptimeAccumValues: uptimeHelper.fourHundredTokensMultiDenom, + expectedInitAccumValue: uptimeHelper.twoHundredTokensMultiDenom, + expectedUnclaimedRewards: uptimeHelper.emptyExpectedAccumValues, + }, + { + name: "(lower < curr < upper) default freeze time with nonzero and variable uptime trackers", + position: &model.Position{ + FrozenUntil: defaultFrozenUntil, + Liquidity: DefaultLiquidityAmt, + }, + lowerTick: tick{ + tickIndex: -50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.varyingTokensMultiDenom), + }, + upperTick: tick{ + tickIndex: 50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), + }, + currentTickIndex: sdk.ZeroInt(), + + // We set up the global accum values such that the growth inside is equal to 100 of each denom + // for each uptime tracker. Let the uptime growth inside (UGI) = 100 + globalUptimeAccumValues: []sdk.DecCoins{ + sdk.NewDecCoins( + // 100 + 100 + UGI = 300 + sdk.NewDecCoin("bar", sdk.NewInt(300)), + // 100 + 100 + UGI = 300 + sdk.NewDecCoin("foo", sdk.NewInt(300)), + ), + sdk.NewDecCoins( + // 100 + 103 + UGI = 303 + sdk.NewDecCoin("bar", sdk.NewInt(303)), + // 100 + 101 + UGI = 301 + sdk.NewDecCoin("foo", sdk.NewInt(301)), + ), + sdk.NewDecCoins( + // 100 + 106 + UGI = 306 + sdk.NewDecCoin("bar", sdk.NewInt(306)), + // 100 + 102 + UGI = 302 + sdk.NewDecCoin("foo", sdk.NewInt(302)), + ), + sdk.NewDecCoins( + // 100 + 109 + UGI = 309 + sdk.NewDecCoin("bar", sdk.NewInt(309)), + // 100 + 103 + UGI = 303 + sdk.NewDecCoin("foo", sdk.NewInt(303)), + ), + }, + // Equal to 100 of foo and bar in each uptime tracker (UGI) + expectedInitAccumValue: uptimeHelper.hundredTokensMultiDenom, + expectedUnclaimedRewards: uptimeHelper.emptyExpectedAccumValues, + }, + + // Existing position tests + + { + name: "(lower < curr < upper) add to frozen position with no new uptime growth", + position: &model.Position{ + FrozenUntil: defaultFrozenUntil, + Liquidity: DefaultLiquidityAmt, + }, + lowerTick: tick{ + tickIndex: -50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), + }, + upperTick: tick{ + tickIndex: 50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), + }, + currentTickIndex: sdk.ZeroInt(), + globalUptimeAccumValues: uptimeHelper.threeHundredTokensMultiDenom, + + // New lower and upper ticks remain unchanged + existingPosition: true, + newLowerTick: tick{ + tickIndex: -50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), + }, + newUpperTick: tick{ + tickIndex: 50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), + }, + addToGlobalAccums: uptimeHelper.emptyExpectedAccumValues, + expectedInitAccumValue: uptimeHelper.hundredTokensMultiDenom, + + // No uptime growth inside range + expectedUnclaimedRewards: uptimeHelper.emptyExpectedAccumValues, + }, + { + name: "(lower < curr < upper) add to frozen position with new growth", + position: &model.Position{ + FrozenUntil: defaultFrozenUntil, + Liquidity: DefaultLiquidityAmt, + }, + lowerTick: tick{ + tickIndex: -50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), + }, + upperTick: tick{ + tickIndex: 50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), + }, + currentTickIndex: sdk.ZeroInt(), + globalUptimeAccumValues: uptimeHelper.threeHundredTokensMultiDenom, + + // Add 200 to growth outside range, and 100 to growth inside + // Note that since (lower < curr < upper), this means adding 200 to the + // uptime trackers of the lower and upper ticks and (200 + 100) to the global accums + existingPosition: true, + newLowerTick: tick{ + tickIndex: -50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.twoHundredTokensMultiDenom), + }, + newUpperTick: tick{ + tickIndex: 50, + uptimeTrackers: wrapUptimeTrackers(uptimeHelper.twoHundredTokensMultiDenom), + }, + // This puts global accums at 600 of each denom + addToGlobalAccums: uptimeHelper.threeHundredTokensMultiDenom, + + // We expect (global - upper - lower) = (600 - 200 - 200) = 200 of each denom + expectedInitAccumValue: uptimeHelper.twoHundredTokensMultiDenom, + + // Equivalent to the uptime growth inside the range (200 - 100 = 100) + expectedUnclaimedRewards: uptimeHelper.hundredTokensMultiDenom, + }, + } + + for _, test := range tests { + s.Run(test.name, func() { + // --- Setup --- + + // Init suite for each test. + s.Setup() + clPool := s.PrepareConcentratedPool() + + // Initialize lower, upper, and current ticks + s.initializeTick(s.Ctx, test.currentTickIndex.Int64(), test.lowerTick.tickIndex, sdk.ZeroDec(), cl.EmptyCoins, test.lowerTick.uptimeTrackers, true) + s.initializeTick(s.Ctx, test.currentTickIndex.Int64(), test.upperTick.tickIndex, sdk.ZeroDec(), cl.EmptyCoins, test.upperTick.uptimeTrackers, false) + clPool.SetCurrentTick(test.currentTickIndex) + s.App.ConcentratedLiquidityKeeper.SetPool(s.Ctx, clPool) + + // Initialize global uptime accums + addToUptimeAccums(s.Ctx, clPool.GetId(), s.App.ConcentratedLiquidityKeeper, test.globalUptimeAccumValues) + + // If applicable, set up existing position and update ticks & global accums + if test.existingPosition{ + err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePositionUptime(s.Ctx, clPool.GetId(), test.position, s.TestAccs[0], test.lowerTick.tickIndex, test.upperTick.tickIndex, test.position.Liquidity, test.position.FrozenUntil) + s.Require().NoError(err) + s.App.ConcentratedLiquidityKeeper.SetPosition(s.Ctx, clPool.GetId(), s.TestAccs[0], test.lowerTick.tickIndex, test.upperTick.tickIndex, test.position, test.position.FrozenUntil) + + s.initializeTick(s.Ctx, test.currentTickIndex.Int64(), test.newLowerTick.tickIndex, sdk.ZeroDec(), cl.EmptyCoins, test.newLowerTick.uptimeTrackers, true) + s.initializeTick(s.Ctx, test.currentTickIndex.Int64(), test.newUpperTick.tickIndex, sdk.ZeroDec(), cl.EmptyCoins, test.newUpperTick.uptimeTrackers, false) + clPool.SetCurrentTick(test.currentTickIndex) + s.App.ConcentratedLiquidityKeeper.SetPool(s.Ctx, clPool) + + addToUptimeAccums(s.Ctx, clPool.GetId(), s.App.ConcentratedLiquidityKeeper, test.addToGlobalAccums) + } + + // --- System under test --- + + err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePositionUptime(s.Ctx, clPool.GetId(), test.position, s.TestAccs[0], test.lowerTick.tickIndex, test.upperTick.tickIndex, test.position.Liquidity, test.position.FrozenUntil) + + // --- Error catching --- + + if test.expectedErr != nil { + s.Require().Error(err) + s.Require().ErrorContains(err, test.expectedErr.Error()) + return + } + + // --- Non error case checks --- + + s.Require().NoError(err) + + // Pre-compute variables for readability + freezePeriod := test.position.FrozenUntil.Sub(s.Ctx.BlockTime()) + positionName := string(types.KeyFullPosition(clPool.GetId(), s.TestAccs[0], test.lowerTick.tickIndex, test.upperTick.tickIndex, test.position.FrozenUntil)) + uptimeAccums, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulators(s.Ctx, clPool.GetId()) + s.Require().NoError(err) + + // Ensure records are properly updated for each supported uptime + for uptimeIndex, uptime := range types.SupportedUptimes { + recordExists, err := uptimeAccums[uptimeIndex].HasPosition(positionName) + s.Require().NoError(err) + + if freezePeriod >= uptime { + // If frozen for more than the specific uptime's period, the record should exist + s.Require().True(recordExists) + + // Ensure position's record has correct values + positionRecord, err := accum.GetPosition(uptimeAccums[uptimeIndex], positionName) + s.Require().NoError(err) + + s.Require().Equal(test.expectedInitAccumValue[uptimeIndex], positionRecord.InitAccumValue) + + if test.existingPosition { + s.Require().Equal(sdk.NewDec(2).Mul(test.position.Liquidity), positionRecord.NumShares) + } else { + s.Require().Equal(test.position.Liquidity, positionRecord.NumShares) + } + + // Note that the rewards only apply to the initial shares, not the new ones + s.Require().Equal(test.expectedUnclaimedRewards[uptimeIndex].MulDec(test.position.Liquidity), positionRecord.UnclaimedRewards) + + // TODO: ensure that position updates are handled correctly (e.g. record's unclaimed rewards are correct?) + } else { + s.Require().False(recordExists) + } + } + }) + } +} diff --git a/x/concentrated-liquidity/lp.go b/x/concentrated-liquidity/lp.go index 12b86475f94..ce50e51efa6 100644 --- a/x/concentrated-liquidity/lp.go +++ b/x/concentrated-liquidity/lp.go @@ -125,6 +125,7 @@ func (k Keeper) withdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAd } // Check if position is still frozen + // TODO: consider replacing this check with ClaimIncentives and distributing rewards back into the accumulator if BlockTime < frozenUntil if position.FrozenUntil.After(ctx.BlockTime()) { return sdk.Int{}, sdk.Int{}, types.PositionStillFrozenError{FrozenUntil: position.FrozenUntil} } From 05361163db23251a281989ac30476bb85d219e9e Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 27 Feb 2023 16:53:41 -0800 Subject: [PATCH 098/136] update liquidity update logic and tests to use new helper --- x/concentrated-liquidity/position.go | 46 ----------------------- x/concentrated-liquidity/position_test.go | 6 ++- 2 files changed, 5 insertions(+), 47 deletions(-) diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 6645dd9f6c1..2632a5ebf5d 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -66,56 +66,10 @@ func (k Keeper) initOrUpdatePosition( // TODO: consider deleting position if liquidity becomes zero - // TODO: replace all uptime-related logic below with the following (will break tests): - /* err = k.initOrUpdatePositionUptime(ctx, poolId, position, owner, lowerTick, upperTick, liquidityDelta, frozenUntil) if err != nil { return err } - */ - - // We update accumulators _prior_ to any position-related updates to ensure - // past rewards aren't distributed to new liquidity. We also update pool's - // LastLiquidityUpdate here. - err = k.updateUptimeAccumulatorsToNow(ctx, poolId) - if err != nil { - return err - } - - // Create records for relevant uptime accumulators here. - uptimeAccumulators, err := k.getUptimeAccumulators(ctx, poolId) - if err != nil { - return err - } - - for uptimeIndex, uptime := range types.SupportedUptimes { - // We assume every position update requires the position to be frozen for the - // min uptime again. Thus, the difference between the position's `FrozenUntil` - // and the blocktime when the update happens should be greater than or equal - // to the required uptime. - if position.FrozenUntil.Sub(ctx.BlockTime()) >= uptime { - curUptimeAccum := uptimeAccumulators[uptimeIndex] - - // If a record does not exist for this uptime accumulator, create a new position. - // Otherwise, add to existing record. - positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil)) - recordExists, err := curUptimeAccum.HasPosition(positionName) - if err != nil { - return err - } - - if !recordExists { - err = curUptimeAccum.NewPosition(positionName, position.Liquidity, emptyOptions) - } else if !liquidityDelta.IsNegative() { - err = curUptimeAccum.AddToPosition(positionName, liquidityDelta) - } else { - err = curUptimeAccum.RemoveFromPosition(positionName, liquidityDelta.Neg()) - } - if err != nil { - return err - } - } - } k.setPosition(ctx, poolId, owner, lowerTick, upperTick, position, frozenUntil) return nil diff --git a/x/concentrated-liquidity/position_test.go b/x/concentrated-liquidity/position_test.go index 25d3f3cfe57..3a51c70fb70 100644 --- a/x/concentrated-liquidity/position_test.go +++ b/x/concentrated-liquidity/position_test.go @@ -203,6 +203,8 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { s.Require().NoError(err) newUptimeAccumValues, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulatorValues(s.Ctx, test.param.poolId) s.Require().NoError(err) + expectedInitAccumValues, err := s.App.ConcentratedLiquidityKeeper.GetUptimeGrowthInsideRange(s.Ctx, clPool.GetId(), test.param.lowerTick, test.param.upperTick) + s.Require().NoError(err) // Setup for checks actualUptimeAccumDelta, expectedUptimeAccumValueGrowth, expectedIncentiveRecords, expectedGrowthCurAccum := emptyAccumValues, emptyAccumValues, test.incentiveRecords, sdk.DecCoins{} @@ -226,7 +228,9 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { // Ensure position's record has correct values positionRecord, err := accum.GetPosition(newUptimeAccums[uptimeIndex], positionName) s.Require().NoError(err) - s.Require().Equal(newUptimeAccums[uptimeIndex].GetValue(), positionRecord.InitAccumValue) + + // We expect the position's accum record to be initialized to the uptime growth *inside* its range + s.Require().Equal(expectedInitAccumValues[uptimeIndex], positionRecord.InitAccumValue) s.Require().Equal(test.expectedLiquidity, positionRecord.NumShares) } else { s.Require().False(recordExists) From 51a7f56904c81e0cd34b35715aa85846553e756a Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 27 Feb 2023 21:31:35 -0800 Subject: [PATCH 099/136] add todo for frozenuntil issue --- x/concentrated-liquidity/incentives_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index d7fa02a0b3f..7d935f0918f 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -1771,6 +1771,9 @@ func (s *KeeperTestSuite) TestInitOrUpdatePositionUptime() { s.App.ConcentratedLiquidityKeeper.SetPool(s.Ctx, clPool) addToUptimeAccums(s.Ctx, clPool.GetId(), s.App.ConcentratedLiquidityKeeper, test.addToGlobalAccums) + + // TODO: replace all uses of `frozenUntil` with `joinTime` and `freezeDuration` such that the following line does not cause any issues: + // s.Ctx = s.Ctx.WithBlockTime(test.position.FrozenUntil.Add(-1 * time.Second)) } // --- System under test --- @@ -1818,8 +1821,6 @@ func (s *KeeperTestSuite) TestInitOrUpdatePositionUptime() { // Note that the rewards only apply to the initial shares, not the new ones s.Require().Equal(test.expectedUnclaimedRewards[uptimeIndex].MulDec(test.position.Liquidity), positionRecord.UnclaimedRewards) - - // TODO: ensure that position updates are handled correctly (e.g. record's unclaimed rewards are correct?) } else { s.Require().False(recordExists) } From 0a51d056c55e3538d4f67638a52621911f95533a Mon Sep 17 00:00:00 2001 From: alpo Date: Tue, 28 Feb 2023 08:41:11 -0800 Subject: [PATCH 100/136] lint --- x/concentrated-liquidity/tick.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/tick.go b/x/concentrated-liquidity/tick.go index 5b3994dbddb..77e7fc8b9de 100644 --- a/x/concentrated-liquidity/tick.go +++ b/x/concentrated-liquidity/tick.go @@ -75,7 +75,7 @@ func (k Keeper) crossTick(ctx sdk.Context, poolId uint64, tickIndex int64, swapS if err := k.updateUptimeAccumulatorsToNow(ctx, poolId); err != nil { return sdk.Dec{}, err } - + uptimeAccums, err := k.getUptimeAccumulators(ctx, poolId) if err != nil { return sdk.Dec{}, err From 8bb8240b05230c992e2331893e9dfc91a4a13c51 Mon Sep 17 00:00:00 2001 From: alpo Date: Tue, 28 Feb 2023 08:45:12 -0800 Subject: [PATCH 101/136] lint --- x/concentrated-liquidity/incentives.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index a78c5d3633f..9ba6a691027 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -401,7 +401,7 @@ func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, posit return err } - // Note that even though "unclaimed rewards" accrue in the accumulator prior to frozenUntil, since position withdrawal + // Note that even though "unclaimed rewards" accrue in the accumulator prior to frozenUntil, since position withdrawal // and incentive collection are only allowed when current time is past frozenUntil these rewards are not accessible until then. err = curUptimeAccum.UpdatePositionCustomAcc(positionName, liquidityDelta, globalUptimeGrowthInsideRange[uptimeIndex]) if err != nil { @@ -412,4 +412,4 @@ func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, posit } return nil -} \ No newline at end of file +} From b117f72bd7aed992e98a33a76e6cf6f7df4462f7 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Mar 2023 23:13:20 -0800 Subject: [PATCH 102/136] clean up logic and add tests for helper --- osmoutils/coin_helper_test.go | 82 ++++++++++++++++++++++++++ x/concentrated-liquidity/incentives.go | 12 ++-- 2 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 osmoutils/coin_helper_test.go diff --git a/osmoutils/coin_helper_test.go b/osmoutils/coin_helper_test.go new file mode 100644 index 00000000000..3a3a24527a7 --- /dev/null +++ b/osmoutils/coin_helper_test.go @@ -0,0 +1,82 @@ +package osmoutils_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + + "github.com/osmosis-labs/osmosis/osmoutils" +) + +func TestSubDecCoins(t *testing.T) { + var ( + emptyCoins = sdk.DecCoins(nil) + fiftyFooCoins = sdk.NewDecCoin("foo", sdk.NewInt(50)) + fiftyBarCoins = sdk.NewDecCoin("bar", sdk.NewInt(50)) + hundredFooCoins = sdk.NewDecCoin("foo", sdk.NewInt(100)) + hundredBarCoins = sdk.NewDecCoin("bar", sdk.NewInt(100)) + + fiftyEach = sdk.NewDecCoins(fiftyFooCoins, fiftyBarCoins) + hundredEach = sdk.NewDecCoins(hundredFooCoins, hundredBarCoins) + ) + + tests := map[string]struct { + firstInput []sdk.DecCoins + secondInput []sdk.DecCoins + + expectedOutput []sdk.DecCoins + expectError bool + }{ + "[[100foo, 100bar], [100foo, 100bar]] - [[50foo, 50bar], [50foo, 100bar]]": { + firstInput: []sdk.DecCoins{hundredEach, hundredEach}, + secondInput: []sdk.DecCoins{fiftyEach, hundredEach}, + + expectedOutput: []sdk.DecCoins{fiftyEach, emptyCoins}, + }, + "[[100bar, 100foo], [100foo, 100bar]] - [[50foo, 50bar], [50foo, 100bar]]": { + firstInput: []sdk.DecCoins{ + sdk.NewDecCoins(hundredBarCoins, hundredFooCoins), + hundredEach}, + secondInput: []sdk.DecCoins{fiftyEach, hundredEach}, + + expectedOutput: []sdk.DecCoins{fiftyEach, emptyCoins}, + }, + "both inputs empty": { + firstInput: []sdk.DecCoins{}, + secondInput: []sdk.DecCoins{}, + + expectedOutput: []sdk.DecCoins{}, + }, + "[[100foo]] - [[50foo]]": { + firstInput: []sdk.DecCoins{sdk.NewDecCoins(hundredFooCoins)}, + secondInput: []sdk.DecCoins{sdk.NewDecCoins(fiftyFooCoins)}, + + expectedOutput: []sdk.DecCoins{sdk.NewDecCoins(fiftyFooCoins)}, + }, + + // error catching + + "different length inputs": { + firstInput: []sdk.DecCoins{hundredEach, hundredEach, hundredEach}, + secondInput: []sdk.DecCoins{fiftyEach, hundredEach}, + + expectedOutput: []sdk.DecCoins{}, + expectError: true, + }, + } + for name, tc := range tests { + t.Run(name, func(t *testing.T) { + actualOutput, err := osmoutils.SubDecCoinArrays(tc.firstInput, tc.secondInput) + + if tc.expectError { + require.Error(t, err) + require.Equal(t, tc.expectedOutput, actualOutput) + return + } + + require.NoError(t, err) + require.Equal(t, tc.expectedOutput, actualOutput) + }) + } +} diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 91fe2affa27..f7032840fd4 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -309,24 +309,26 @@ func (k Keeper) GetUptimeGrowthInsideRange(ctx sdk.Context, poolId uint64, lower // Calculate uptime growth between lower and upper ticks // Note that we regard "within range" to mean [lowerTick, upperTick), // inclusive of lowerTick and exclusive of upperTick. + lowerTickUptimeValues := getUptimeTrackerValues(lowerTickInfo.UptimeTrackers) + upperTickUptimeValues := getUptimeTrackerValues(upperTickInfo.UptimeTrackers) if currentTick < lowerTick { // If current tick is below range, we subtract uptime growth of upper tick from that of lower tick - return osmoutils.SubDecCoinArrays(getUptimeTrackerValues(lowerTickInfo.UptimeTrackers), getUptimeTrackerValues(upperTickInfo.UptimeTrackers)) + return osmoutils.SubDecCoinArrays(lowerTickUptimeValues, upperTickUptimeValues) } else if currentTick < upperTick { // If current tick is within range, we subtract uptime growth of lower and upper tick from global growth - globalMinusUpper, err := osmoutils.SubDecCoinArrays(globalUptimeValues, getUptimeTrackerValues(upperTickInfo.UptimeTrackers)) + globalMinusUpper, err := osmoutils.SubDecCoinArrays(globalUptimeValues, upperTickUptimeValues) if err != nil { return []sdk.DecCoins{}, err } - return osmoutils.SubDecCoinArrays(globalMinusUpper, getUptimeTrackerValues(lowerTickInfo.UptimeTrackers)) + return osmoutils.SubDecCoinArrays(globalMinusUpper, lowerTickUptimeValues) } else { // If current tick is above range, we subtract uptime growth of lower tick from that of upper tick - return osmoutils.SubDecCoinArrays(getUptimeTrackerValues(upperTickInfo.UptimeTrackers), getUptimeTrackerValues(lowerTickInfo.UptimeTrackers)) + return osmoutils.SubDecCoinArrays(upperTickUptimeValues, lowerTickUptimeValues) } } -// UptimeGrowthOutsideRange returns the uptime growth outside the given tick range for all supported uptimes +// GetUptimeGrowthOutsideRange returns the uptime growth outside the given tick range for all supported uptimes func (k Keeper) GetUptimeGrowthOutsideRange(ctx sdk.Context, poolId uint64, lowerTick int64, upperTick int64) ([]sdk.DecCoins, error) { globalUptimeValues, err := k.getUptimeAccumulatorValues(ctx, poolId) if err != nil { From 65abf780bd7caa0493664374922c4ad546a76b22 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Mar 2023 23:15:13 -0800 Subject: [PATCH 103/136] go mod for osmoutils e2e --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 92019f6da16..11d7cad2393 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/ory/dockertest/v3 v3.9.1 github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 - github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230224005750-f5e0c707420f + github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303071320-b117f72bd7ae github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 diff --git a/go.sum b/go.sum index 41c1176a40e..a4f5504747e 100644 --- a/go.sum +++ b/go.sum @@ -861,8 +861,8 @@ github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 h1:Ylmch github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3/go.mod h1:lV6KnqXYD/ayTe7310MHtM3I2q8Z6bBfMAi+bhwPYtI= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 h1:+EbINXzHQyDtHje2CND357A22H2zUpceTtwJClC9IAM= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260/go.mod h1:KrzYoNtnWUH75rj1XAsSR4nymlHFU7jeVOx7/1KMe0k= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230224005750-f5e0c707420f h1:Q8Ye1suZZG2zvTmcvl/C1whBctGY8RC/sgcJ7uGI4Cw= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230224005750-f5e0c707420f/go.mod h1:fHfEDIHu347XE+64DISa7LJ5OOWpubz+6H28huZ90fo= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303071320-b117f72bd7ae h1:zQJWOnUMiUWCzqTdOsPLJHEnt08UV4qvCzl6NrDEYvc= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303071320-b117f72bd7ae/go.mod h1:fHfEDIHu347XE+64DISa7LJ5OOWpubz+6H28huZ90fo= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 h1:Ov+gyEBpU2hJkLIFAHCcQZwehCSCXFNYzqQY1zJqSXk= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8/go.mod h1:Kh2V4fLvLM4/EagRX53CYDJnILAz9NzCCETKXoH/sno= github.com/osmosis-labs/wasmd v0.29.2-0.20221222131554-7c8ea36a6e30 h1:6uMi7HhPSwvKKU7j5NqljseFTEz4I7qHr+IPnnn42Ck= From 511d8a0f2ed5ff03bbe9a1bf2011ed2e21dd23e3 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Mar 2023 23:22:06 -0800 Subject: [PATCH 104/136] move position key computation outside loop --- x/concentrated-liquidity/incentives.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 9ba6a691027..5480986bf45 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -368,6 +368,7 @@ func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, posit } // Loop through uptime accums for all supported uptimes on the pool and init or update position's records + positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil)) for uptimeIndex, uptime := range types.SupportedUptimes { // We assume every position update requires the position to be frozen for the // min uptime again. Thus, the difference between the position's `FrozenUntil` @@ -380,7 +381,6 @@ func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, posit // If a record does not exist for this uptime accumulator, create a new position. // Otherwise, add to existing record. - positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil)) recordExists, err := curUptimeAccum.HasPosition(positionName) if err != nil { return err From 654505d58edbe7ed60c9b00aa7b148a54585e64f Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Mar 2023 23:34:45 -0800 Subject: [PATCH 105/136] clean up imports and go sum --- go.sum | 4 ++-- x/concentrated-liquidity/incentives.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.sum b/go.sum index 716c56d5b2e..daf616f3802 100644 --- a/go.sum +++ b/go.sum @@ -865,8 +865,8 @@ github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303071320-b117f72bd7ae h1: github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303071320-b117f72bd7ae/go.mod h1:fHfEDIHu347XE+64DISa7LJ5OOWpubz+6H28huZ90fo= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 h1:Ov+gyEBpU2hJkLIFAHCcQZwehCSCXFNYzqQY1zJqSXk= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8/go.mod h1:Kh2V4fLvLM4/EagRX53CYDJnILAz9NzCCETKXoH/sno= -github.com/osmosis-labs/wasmd v0.29.2-0.20221222131554-7c8ea36a6e30 h1:6uMi7HhPSwvKKU7j5NqljseFTEz4I7qHr+IPnnn42Ck= -github.com/osmosis-labs/wasmd v0.29.2-0.20221222131554-7c8ea36a6e30/go.mod h1:5fDYJyMXBq6u2iuHqqOTYiZ5NitIOeIW5k7qEXqbwJE= +github.com/osmosis-labs/wasmd v0.30.0-osmo-v15 h1:vjbzq9ta/KmQwUM6PcRmrBJuDwILgLbV4POypC1Uhn8= +github.com/osmosis-labs/wasmd v0.30.0-osmo-v15/go.mod h1:5fDYJyMXBq6u2iuHqqOTYiZ5NitIOeIW5k7qEXqbwJE= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index f7032840fd4..9aff1e72aad 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -10,8 +10,8 @@ import ( "github.com/osmosis-labs/osmosis/osmoutils" "github.com/osmosis-labs/osmosis/osmoutils/accum" - "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" - "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" + "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/model" + "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/types" ) const ( From 77f158dfd77a9f2083cfa70c3648253c97d50341 Mon Sep 17 00:00:00 2001 From: alpo Date: Thu, 2 Mar 2023 23:40:38 -0800 Subject: [PATCH 106/136] fix imports --- x/concentrated-liquidity/incentives_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index ed8ebecddb6..4453beafa9b 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -6,9 +6,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/osmosis-labs/osmosis/osmoutils/accum" - cl "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity" - "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/model" - "github.com/osmosis-labs/osmosis/v14/x/concentrated-liquidity/types" + cl "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity" + "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/model" + "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/types" ) var ( From 391d74f29a7fc7a404b22e11d919444c0837149d Mon Sep 17 00:00:00 2001 From: stackman27 Date: Tue, 28 Feb 2023 15:25:53 -0800 Subject: [PATCH 107/136] [CL Incentives][bugfix]: Replace all uses of frozenUntil with joinTime and freezeDuration --- go.mod | 2 +- go.sum | 5 + go.work.sum | 5 +- osmoutils/encoding_helper_test.go | 19 ++ osmoutils/osmocli/parsers.go | 7 +- .../pool-model/query.proto | 13 +- .../concentrated-liquidity/position.proto | 11 +- proto/osmosis/concentrated-liquidity/tx.proto | 18 +- tests/e2e/configurer/chain/commands.go | 8 +- tests/e2e/e2e_test.go | 24 +- x/concentrated-liquidity/client/cli/tx.go | 8 +- x/concentrated-liquidity/export_test.go | 38 +-- x/concentrated-liquidity/fees_test.go | 161 +++++------ x/concentrated-liquidity/incentives.go | 12 +- x/concentrated-liquidity/incentives_test.go | 164 +++++------ x/concentrated-liquidity/keeper_test.go | 22 +- x/concentrated-liquidity/lp.go | 25 +- x/concentrated-liquidity/lp_test.go | 145 ++++++---- x/concentrated-liquidity/model/position.pb.go | 115 ++++++-- x/concentrated-liquidity/msg_server.go | 4 +- x/concentrated-liquidity/position.go | 48 ++-- x/concentrated-liquidity/position_test.go | 270 ++++++++++-------- .../simulation/sim_msgs.go | 9 + x/concentrated-liquidity/store.go | 29 +- x/concentrated-liquidity/store_test.go | 94 +++--- x/concentrated-liquidity/swaps_test.go | 24 +- x/concentrated-liquidity/tick_test.go | 5 +- x/concentrated-liquidity/types/errors.go | 15 +- x/concentrated-liquidity/types/keys.go | 10 +- x/concentrated-liquidity/types/msgs.go | 8 + x/concentrated-liquidity/types/query.pb.go | 212 +++++++++----- x/concentrated-liquidity/types/tx.pb.go | 187 +++++++----- x/gamm/keeper/migrate.go | 3 +- x/gamm/keeper/migrate_test.go | 17 +- x/gamm/types/expected_keepers.go | 2 +- x/superfluid/keeper/migrate.go | 32 +-- x/superfluid/keeper/migrate_test.go | 11 +- x/superfluid/keeper/msg_server.go | 4 +- x/superfluid/types/events.go | 3 +- x/superfluid/types/expected_keepers.go | 2 +- 40 files changed, 1049 insertions(+), 742 deletions(-) diff --git a/go.mod b/go.mod index b65c3afcef5..f6553ae6b51 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/ory/dockertest/v3 v3.9.1 github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 - github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303071320-b117f72bd7ae + github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303084731-71ab5decdfa1 github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 diff --git a/go.sum b/go.sum index daf616f3802..953954f8c2d 100644 --- a/go.sum +++ b/go.sum @@ -861,8 +861,13 @@ github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 h1:Ylmch github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3/go.mod h1:lV6KnqXYD/ayTe7310MHtM3I2q8Z6bBfMAi+bhwPYtI= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 h1:+EbINXzHQyDtHje2CND357A22H2zUpceTtwJClC9IAM= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260/go.mod h1:KrzYoNtnWUH75rj1XAsSR4nymlHFU7jeVOx7/1KMe0k= +<<<<<<< HEAD github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303071320-b117f72bd7ae h1:zQJWOnUMiUWCzqTdOsPLJHEnt08UV4qvCzl6NrDEYvc= github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303071320-b117f72bd7ae/go.mod h1:fHfEDIHu347XE+64DISa7LJ5OOWpubz+6H28huZ90fo= +======= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303084731-71ab5decdfa1 h1:PeBYW7Jze++bdl0PddxTVh/2xllNuu7Wol8cPEsnZXE= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303084731-71ab5decdfa1/go.mod h1:fHfEDIHu347XE+64DISa7LJ5OOWpubz+6H28huZ90fo= +>>>>>>> b00f5461b ([CL Incentives][bugfix]: Replace all uses of frozenUntil with joinTime and freezeDuration) github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 h1:Ov+gyEBpU2hJkLIFAHCcQZwehCSCXFNYzqQY1zJqSXk= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8/go.mod h1:Kh2V4fLvLM4/EagRX53CYDJnILAz9NzCCETKXoH/sno= github.com/osmosis-labs/wasmd v0.30.0-osmo-v15 h1:vjbzq9ta/KmQwUM6PcRmrBJuDwILgLbV4POypC1Uhn8= diff --git a/go.work.sum b/go.work.sum index a8e33a1cf59..07c26987cdf 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,9 +1,6 @@ github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= -github.com/osmosis-labs/cosmos-sdk v0.45.1-0.20230220032354-0907b756eecb/go.mod h1:rud0OaBIuq3+qOqtwT4SR7Q7iSzRp7w41fjninTjfnQ= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230220020447-efe299ca44e0/go.mod h1:/WgLS5/cEgBnR/C6pLQjujGceD/G5i0jDsEEeqvIpgI= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303071320-b117f72bd7ae/go.mod h1:fHfEDIHu347XE+64DISa7LJ5OOWpubz+6H28huZ90fo= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303084731-71ab5decdfa1/go.mod h1:fHfEDIHu347XE+64DISa7LJ5OOWpubz+6H28huZ90fo= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8/go.mod h1:Kh2V4fLvLM4/EagRX53CYDJnILAz9NzCCETKXoH/sno= -github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230227091331-517de090338b/go.mod h1:w901NxDyJ+78Co12QQTltoGLqROG4daYwoiRuzTs6mQ= github.com/osmosis-labs/wasmd v0.30.0-osmo-v15/go.mod h1:5fDYJyMXBq6u2iuHqqOTYiZ5NitIOeIW5k7qEXqbwJE= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= diff --git a/osmoutils/encoding_helper_test.go b/osmoutils/encoding_helper_test.go index 35690501b34..e1f83080373 100644 --- a/osmoutils/encoding_helper_test.go +++ b/osmoutils/encoding_helper_test.go @@ -1,8 +1,10 @@ package osmoutils import ( + "fmt" "math" "testing" + "time" "github.com/stretchr/testify/assert" ) @@ -27,3 +29,20 @@ func TestFormatFixedLengthU64(t *testing.T) { }) } } + +func TestParseTimeString(t *testing.T) { + tests := map[string]struct { + timeStr string + want time.Time + }{ + "0": {"2023-03-03 08:59:42.68331893 +0000 UTC", time.Now()}, + } + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + got, err := ParseTimeString(tt.timeStr) + assert.NoError(t, err) + fmt.Println(got) + + }) + } +} diff --git a/osmoutils/osmocli/parsers.go b/osmoutils/osmocli/parsers.go index b4081c76409..856f7dfeba7 100644 --- a/osmoutils/osmocli/parsers.go +++ b/osmoutils/osmocli/parsers.go @@ -278,7 +278,12 @@ func ParseInt(arg string, fieldName string) (int64, error) { func ParseUnixTime(arg string, fieldName string) (time.Time, error) { timeUnix, err := strconv.ParseInt(arg, 10, 64) if err != nil { - return time.Time{}, fmt.Errorf("could not parse %s as unix time for field %s: %w", arg, fieldName, err) + parsedTime, err := time.Parse(sdk.SortableTimeFormat, arg) + if err != nil { + return time.Time{}, fmt.Errorf("could not parse %s as time for field %s: %w", arg, fieldName, err) + } + + return parsedTime, nil } startTime := time.Unix(timeUnix, 0) return startTime, nil diff --git a/proto/osmosis/concentrated-liquidity/pool-model/query.proto b/proto/osmosis/concentrated-liquidity/pool-model/query.proto index e13f152dffa..3c14171c1f7 100644 --- a/proto/osmosis/concentrated-liquidity/pool-model/query.proto +++ b/proto/osmosis/concentrated-liquidity/pool-model/query.proto @@ -10,6 +10,7 @@ import "google/api/annotations.proto"; import "google/protobuf/any.proto"; import "cosmos_proto/cosmos.proto"; import "google/protobuf/timestamp.proto"; +import "google/protobuf/duration.proto"; option go_package = "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/types"; @@ -60,12 +61,18 @@ message FullPositionByOwnerResult { uint64 pool_id = 1 [ (gogoproto.moretags) = "yaml:\"pool_id\"" ]; int64 lower_tick = 2; int64 upper_tick = 3; - google.protobuf.Timestamp frozen_until = 4 [ + google.protobuf.Timestamp join_time = 4 [ (gogoproto.nullable) = false, (gogoproto.stdtime) = true, - (gogoproto.moretags) = "yaml:\"frozen_until\"" + (gogoproto.moretags) = "yaml:\"join_time\"" ]; - string liquidity = 5 [ + google.protobuf.Duration freeze_duration = 5 [ + (gogoproto.nullable) = false, + (gogoproto.stdduration) = true, + (gogoproto.jsontag) = "duration,omitempty", + (gogoproto.moretags) = "yaml:\"freeze_duration\"" + ]; + string liquidity = 6 [ (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.moretags) = "yaml:\"liquidity\"", (gogoproto.nullable) = false diff --git a/proto/osmosis/concentrated-liquidity/position.proto b/proto/osmosis/concentrated-liquidity/position.proto index cd14f71620a..b0f139422ce 100644 --- a/proto/osmosis/concentrated-liquidity/position.proto +++ b/proto/osmosis/concentrated-liquidity/position.proto @@ -7,6 +7,7 @@ package osmosis.concentratedliquidity.v1beta1; import "cosmos_proto/cosmos.proto"; import "google/protobuf/timestamp.proto"; +import "google/protobuf/duration.proto"; import "gogoproto/gogo.proto"; option go_package = "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/model"; @@ -17,9 +18,15 @@ message Position { (gogoproto.moretags) = "yaml:\"liquidity\"", (gogoproto.nullable) = false ]; - google.protobuf.Timestamp frozen_until = 2 [ + google.protobuf.Timestamp join_time = 2 [ (gogoproto.nullable) = false, (gogoproto.stdtime) = true, - (gogoproto.moretags) = "yaml:\"frozen_until\"" + (gogoproto.moretags) = "yaml:\"join_time\"" + ]; + google.protobuf.Duration freeze_duration = 3 [ + (gogoproto.nullable) = false, + (gogoproto.stdduration) = true, + (gogoproto.jsontag) = "duration,omitempty", + (gogoproto.moretags) = "yaml:\"freeze_duration\"" ]; } diff --git a/proto/osmosis/concentrated-liquidity/tx.proto b/proto/osmosis/concentrated-liquidity/tx.proto index 7ee4b56e617..6f4c2c27edc 100644 --- a/proto/osmosis/concentrated-liquidity/tx.proto +++ b/proto/osmosis/concentrated-liquidity/tx.proto @@ -3,6 +3,7 @@ package osmosis.concentratedliquidity.v1beta1; import "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; +import "google/protobuf/duration.proto"; import "cosmos/base/v1beta1/coin.proto"; option go_package = "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/types"; @@ -38,10 +39,11 @@ message MsgCreatePosition { (gogoproto.moretags) = "yaml:\"token_min_amount1\"", (gogoproto.nullable) = false ]; - google.protobuf.Timestamp frozen_until = 9 [ + google.protobuf.Duration freeze_duration = 9 [ (gogoproto.nullable) = false, - (gogoproto.stdtime) = true, - (gogoproto.moretags) = "yaml:\"frozen_until\"" + (gogoproto.stdduration) = true, + (gogoproto.jsontag) = "duration,omitempty", + (gogoproto.moretags) = "yaml:\"freeze_duration\"" ]; } @@ -74,10 +76,16 @@ message MsgWithdrawPosition { (gogoproto.moretags) = "yaml:\"liquidity_amount\"", (gogoproto.nullable) = false ]; - google.protobuf.Timestamp frozen_until = 6 [ + google.protobuf.Timestamp join_time = 6 [ (gogoproto.nullable) = false, (gogoproto.stdtime) = true, - (gogoproto.moretags) = "yaml:\"frozen_until\"" + (gogoproto.moretags) = "yaml:\"join_time\"" + ]; + google.protobuf.Duration freeze_duration = 7 [ + (gogoproto.nullable) = false, + (gogoproto.stdduration) = true, + (gogoproto.jsontag) = "duration,omitempty", + (gogoproto.moretags) = "yaml:\"freeze_duration\"" ]; } diff --git a/tests/e2e/configurer/chain/commands.go b/tests/e2e/configurer/chain/commands.go index 16340745e59..20a524124fd 100644 --- a/tests/e2e/configurer/chain/commands.go +++ b/tests/e2e/configurer/chain/commands.go @@ -58,10 +58,10 @@ func (n *NodeConfig) CreateConcentratedPool(from, denom1, denom2 string, tickSpa return poolID } -func (n *NodeConfig) CreateConcentratedPosition(from, lowerTick, upperTick string, token0, token1 string, token0MinAmt, token1MinAmt int64, frozenUntil int64, poolId uint64) { +func (n *NodeConfig) CreateConcentratedPosition(from, lowerTick, upperTick string, token0, token1 string, token0MinAmt, token1MinAmt int64, freezeDuration string, poolId uint64) { n.LogActionF("creating concentrated position") - cmd := []string{"osmosisd", "tx", "concentratedliquidity", "create-position", lowerTick, upperTick, token0, token1, fmt.Sprintf("%d", token0MinAmt), fmt.Sprintf("%d", token1MinAmt), fmt.Sprintf("%v", frozenUntil), fmt.Sprintf("--from=%s", from), fmt.Sprintf("--pool-id=%d", poolId)} + cmd := []string{"osmosisd", "tx", "concentratedliquidity", "create-position", lowerTick, upperTick, token0, token1, fmt.Sprintf("%d", token0MinAmt), fmt.Sprintf("%d", token1MinAmt), freezeDuration, fmt.Sprintf("--from=%s", from), fmt.Sprintf("--pool-id=%d", poolId)} _, _, err := n.containerManager.ExecTxCmd(n.t, n.chainId, n.Name, cmd) require.NoError(n.t, err) @@ -76,9 +76,9 @@ func (n *NodeConfig) StoreWasmCode(wasmFile, from string) { n.LogActionF("successfully stored") } -func (n *NodeConfig) WithdrawPosition(from, lowerTick, upperTick string, liquidityOut string, poolId uint64, frozenUntil int64) { +func (n *NodeConfig) WithdrawPosition(from, lowerTick, upperTick string, liquidityOut string, poolId uint64, joinTime time.Time, freezeDuration string) { n.LogActionF("withdrawing liquidity from position") - cmd := []string{"osmosisd", "tx", "concentratedliquidity", "withdraw-position", lowerTick, upperTick, liquidityOut, fmt.Sprintf("%d", frozenUntil), fmt.Sprintf("--from=%s", from), fmt.Sprintf("--pool-id=%d", poolId)} + cmd := []string{"osmosisd", "tx", "concentratedliquidity", "withdraw-position", lowerTick, upperTick, liquidityOut, osmoutils.FormatTimeString(joinTime), freezeDuration, fmt.Sprintf("--from=%s", from), fmt.Sprintf("--pool-id=%d", poolId)} _, _, err := n.containerManager.ExecTxCmd(n.t, n.chainId, n.Name, cmd) require.NoError(n.t, err) n.LogActionF("successfully withdrew position from lowerTick %s to upperTick %s", lowerTick, upperTick) diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index c94b2875e19..e2cec58ec1e 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -196,7 +196,7 @@ func (s *IntegrationTestSuite) TestConcentratedLiquidity() { denom1 string = "uosmo" tickSpacing uint64 = 1 precisionFactorAtPriceOne int64 = -1 - frozenUntil int64 = time.Unix(86400, 0).Unix() + freezeDuration = time.Duration(time.Second) swapFee = "0.01" ) @@ -229,15 +229,15 @@ func (s *IntegrationTestSuite) TestConcentratedLiquidity() { address3 := node.CreateWalletAndFund("addr3", fundTokens) // Create 2 positions for address1: overlap together, overlap with 2 address3 positions - node.CreateConcentratedPosition(address1, "[-1200]", "400", fmt.Sprintf("1000%s", denom0), fmt.Sprintf("1000%s", denom1), 0, 0, frozenUntil, poolID) - node.CreateConcentratedPosition(address1, "[-400]", "400", fmt.Sprintf("1000%s", denom0), fmt.Sprintf("1000%s", denom1), 0, 0, frozenUntil, poolID) + node.CreateConcentratedPosition(address1, "[-1200]", "400", fmt.Sprintf("1000%s", denom0), fmt.Sprintf("1000%s", denom1), 0, 0, freezeDuration.String(), poolID) + node.CreateConcentratedPosition(address1, "[-400]", "400", fmt.Sprintf("1000%s", denom0), fmt.Sprintf("1000%s", denom1), 0, 0, freezeDuration.String(), poolID) // Create 1 position for address2: does not overlap with anything, ends at maximum - node.CreateConcentratedPosition(address2, "2200", fmt.Sprintf("%d", maxTick), fmt.Sprintf("1000%s", denom0), fmt.Sprintf("1000%s", denom1), 0, 0, frozenUntil, poolID) + node.CreateConcentratedPosition(address2, "2200", fmt.Sprintf("%d", maxTick), fmt.Sprintf("1000%s", denom0), fmt.Sprintf("1000%s", denom1), 0, 0, freezeDuration.String(), poolID) // Create 2 positions for address3: overlap together, overlap with 2 address1 positions, one position starts from minimum - node.CreateConcentratedPosition(address3, "[-1600]", "[-200]", fmt.Sprintf("1000%s", denom0), fmt.Sprintf("1000%s", denom1), 0, 0, frozenUntil, poolID) - node.CreateConcentratedPosition(address3, fmt.Sprintf("[%d]", minTick), "1400", fmt.Sprintf("1000%s", denom0), fmt.Sprintf("1000%s", denom1), 0, 0, frozenUntil, poolID) + node.CreateConcentratedPosition(address3, "[-1600]", "[-200]", fmt.Sprintf("1000%s", denom0), fmt.Sprintf("1000%s", denom1), 0, 0, freezeDuration.String(), poolID) + node.CreateConcentratedPosition(address3, fmt.Sprintf("[%d]", minTick), "1400", fmt.Sprintf("1000%s", denom0), fmt.Sprintf("1000%s", denom1), 0, 0, freezeDuration.String(), poolID) // get newly created positions positionsAddress1 := node.QueryConcentratedPositions(address1) @@ -282,24 +282,26 @@ func (s *IntegrationTestSuite) TestConcentratedLiquidity() { defaultLiquidityRemoval string = "1000" ) + chainA.WaitForNumHeights(2) + // Assert removing some liquidity // address1: check removing some amount of liquidity address1position1liquidityBefore := positionsAddress1[0].Liquidity - node.WithdrawPosition(address1, "[-1200]", "400", defaultLiquidityRemoval, poolID, frozenUntil) + node.WithdrawPosition(address1, "[-1200]", "400", defaultLiquidityRemoval, poolID, positionsAddress1[0].JoinTime, positionsAddress1[0].FreezeDuration.String()) // assert positionsAddress1 = node.QueryConcentratedPositions(address1) s.Require().Equal(address1position1liquidityBefore, positionsAddress1[0].Liquidity.Add(sdk.MustNewDecFromStr(defaultLiquidityRemoval))) // address2: check removing some amount of liquidity address2position1liquidityBefore := positionsAddress2[0].Liquidity - node.WithdrawPosition(address2, "2200", fmt.Sprintf("%d", maxTick), defaultLiquidityRemoval, poolID, frozenUntil) + node.WithdrawPosition(address2, "2200", fmt.Sprintf("%d", maxTick), defaultLiquidityRemoval, poolID, positionsAddress2[0].JoinTime, positionsAddress1[0].FreezeDuration.String()) // assert positionsAddress2 = node.QueryConcentratedPositions(address2) s.Require().Equal(address2position1liquidityBefore, positionsAddress2[0].Liquidity.Add(sdk.MustNewDecFromStr(defaultLiquidityRemoval))) // address3: check removing some amount of liquidity address3position1liquidityBefore := positionsAddress3[0].Liquidity - node.WithdrawPosition(address3, "[-1600]", "[-200]", defaultLiquidityRemoval, poolID, frozenUntil) + node.WithdrawPosition(address3, "[-1600]", "[-200]", defaultLiquidityRemoval, poolID, positionsAddress3[0].JoinTime, positionsAddress3[0].FreezeDuration.String()) // assert positionsAddress3 = node.QueryConcentratedPositions(address3) s.Require().Equal(address3position1liquidityBefore, positionsAddress3[0].Liquidity.Add(sdk.MustNewDecFromStr(defaultLiquidityRemoval))) @@ -307,13 +309,13 @@ func (s *IntegrationTestSuite) TestConcentratedLiquidity() { // Assert removing all liquidity // address2: no more positions left allLiquidityAddress2Position1 := positionsAddress2[0].Liquidity - node.WithdrawPosition(address2, "2200", fmt.Sprintf("%d", maxTick), allLiquidityAddress2Position1.String(), poolID, frozenUntil) + node.WithdrawPosition(address2, "2200", fmt.Sprintf("%d", maxTick), allLiquidityAddress2Position1.String(), poolID, positionsAddress2[0].JoinTime, positionsAddress2[0].FreezeDuration.String()) positionsAddress2 = node.QueryConcentratedPositions(address2) s.Require().Empty(positionsAddress2) // address1: one position left allLiquidityAddress1Position1 := positionsAddress1[0].Liquidity - node.WithdrawPosition(address1, "[-1200]", "400", allLiquidityAddress1Position1.String(), poolID, frozenUntil) + node.WithdrawPosition(address1, "[-1200]", "400", allLiquidityAddress1Position1.String(), poolID, positionsAddress1[0].JoinTime, positionsAddress1[0].FreezeDuration.String()) positionsAddress1 = node.QueryConcentratedPositions(address1) s.Require().Equal(len(positionsAddress1), 1) diff --git a/x/concentrated-liquidity/client/cli/tx.go b/x/concentrated-liquidity/client/cli/tx.go index ffff8510a8d..def81d2f6f2 100644 --- a/x/concentrated-liquidity/client/cli/tx.go +++ b/x/concentrated-liquidity/client/cli/tx.go @@ -33,9 +33,9 @@ func NewCreateConcentratedPoolCmd() (*osmocli.TxCliDesc, *clmodel.MsgCreateConce func NewCreatePositionCmd() (*osmocli.TxCliDesc, *types.MsgCreatePosition) { return &osmocli.TxCliDesc{ - Use: "create-position [lower-tick] [upper-tick] [token-0] [token-1] [token-0-min-amount] [token-1-min-amount] [frozen-until]", + Use: "create-position [lower-tick] [upper-tick] [token-0] [token-1] [token-0-min-amount] [token-1-min-amount] [freeze-duration]", Short: "create or add to existing concentrated liquidity position", - Example: "create-position [-69082] 69082 1000000000uosmo 10000000uion 0 0 1675237890 --pool-id 1 --from val --chain-id osmosis-1", + Example: "create-position [-69082] 69082 1000000000uosmo 10000000uion 0 0 24h --pool-id 1 --from val --chain-id osmosis-1", CustomFlagOverrides: poolIdFlagOverride, Flags: osmocli.FlagDesc{RequiredFlags: []*flag.FlagSet{FlagSetJustPoolId()}}, }, &types.MsgCreatePosition{} @@ -43,9 +43,9 @@ func NewCreatePositionCmd() (*osmocli.TxCliDesc, *types.MsgCreatePosition) { func NewWithdrawPositionCmd() (*osmocli.TxCliDesc, *types.MsgWithdrawPosition) { return &osmocli.TxCliDesc{ - Use: "withdraw-position [lower-tick] [upper-tick] [liquidity-out] [frozenUntil]", + Use: "withdraw-position [lower-tick] [upper-tick] [liquidity-out] [join-time] [freeze-duration]", Short: "withdraw from an existing concentrated liquidity position", - Example: "withdraw-position [-69082] 69082 100317215 100 --pool-id 1 --from val --chain-id osmosis-1", + Example: "withdraw-position [-69082] 69082 100317215 100 2023-03-03 03:20:35.419543805 24h --pool-id 1 --from val --chain-id osmosis-1", CustomFlagOverrides: poolIdFlagOverride, Flags: osmocli.FlagDesc{RequiredFlags: []*flag.FlagSet{FlagSetJustPoolId()}}, }, &types.MsgWithdrawPosition{} diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index a537d60872b..3246864f692 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -13,9 +13,9 @@ import ( ) var ( - EmptyCoins = emptyCoins - HundredFooCoins = sdk.NewDecCoin("foo", sdk.NewInt(100)) - HundredBarCoins = sdk.NewDecCoin("bar", sdk.NewInt(100)) + EmptyCoins = emptyCoins + HundredFooCoins = sdk.NewDecCoin("foo", sdk.NewInt(100)) + HundredBarCoins = sdk.NewDecCoin("bar", sdk.NewInt(100)) TwoHundredFooCoins = sdk.NewDecCoin("foo", sdk.NewInt(200)) TwoHundredBarCoins = sdk.NewDecCoin("bar", sdk.NewInt(200)) ) @@ -29,12 +29,12 @@ func (k Keeper) SetPool(ctx sdk.Context, pool types.ConcentratedPoolExtension) e return k.setPool(ctx, pool) } -func (k Keeper) HasFullPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) bool { - return k.hasFullPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) +func (k Keeper) HasFullPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, joinTime time.Time, freezeDuration time.Duration) bool { + return k.hasFullPosition(ctx, poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) } -func (k Keeper) DeletePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) error { - return k.deletePosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) +func (k Keeper) DeletePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, joinTime time.Time, freezeDuration time.Duration) error { + return k.deletePosition(ctx, poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) } func (k Keeper) GetPoolById(ctx sdk.Context, poolId uint64) (types.ConcentratedPoolExtension, error) { @@ -65,16 +65,16 @@ func (k Keeper) SwapOutAmtGivenIn(ctx sdk.Context, sender sdk.AccAddress, poolI return k.swapOutAmtGivenIn(ctx, sender, poolI, tokenIn, tokenOutDenom, swapFee, priceLimit, poolId) } -func (k Keeper) UpdatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, frozenUntil time.Time) (sdk.Int, sdk.Int, error) { - return k.updatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta, frozenUntil) +func (k Keeper) UpdatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, joinTime time.Time, freezeDuration time.Duration) (sdk.Int, sdk.Int, error) { + return k.updatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta, joinTime, freezeDuration) } func (k Keeper) InitOrUpdateTick(ctx sdk.Context, poolId uint64, currentTick int64, tickIndex int64, liquidityIn sdk.Dec, upper bool) (err error) { return k.initOrUpdateTick(ctx, poolId, currentTick, tickIndex, liquidityIn, upper) } -func (k Keeper) InitOrUpdatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, frozenUntil time.Time) (err error) { - return k.initOrUpdatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta, frozenUntil) +func (k Keeper) InitOrUpdatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, joinTime time.Time, freezeDuration time.Duration) (err error) { + return k.initOrUpdatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta, joinTime, freezeDuration) } func (k Keeper) PoolExists(ctx sdk.Context, poolId uint64) bool { @@ -105,8 +105,8 @@ func (k Keeper) GetAllPositionsWithVaryingFreezeTimes(ctx sdk.Context, poolId ui return k.getAllPositionsWithVaryingFreezeTimes(ctx, poolId, addr, lowerTick, upperTick) } -func (k Keeper) SetPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, position *model.Position, frozenUntil time.Time) { - k.setPosition(ctx, poolId, owner, lowerTick, upperTick, position, frozenUntil) +func (k Keeper) SetPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, position *model.Position, joinTime time.Time, freezeDuration time.Duration) { + k.setPosition(ctx, poolId, owner, lowerTick, upperTick, position, joinTime, freezeDuration) } func (k Keeper) ValidateSwapFee(ctx sdk.Context, params types.Params, swapFee sdk.Dec) bool { @@ -162,12 +162,12 @@ func PreparePositionAccumulator(feeAccumulator accum.AccumulatorObject, position return preparePositionAccumulator(feeAccumulator, positionKey, feeGrowthOutside) } -func (k Keeper) CreatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, amount0Desired, amount1Desired, amount0Min, amount1Min sdk.Int, lowerTick, upperTick int64, frozenUntil time.Time) (sdk.Int, sdk.Int, sdk.Dec, error) { - return k.createPosition(ctx, poolId, owner, amount0Desired, amount1Desired, amount0Min, amount1Min, lowerTick, upperTick, frozenUntil) +func (k Keeper) CreatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, amount0Desired, amount1Desired, amount0Min, amount1Min sdk.Int, lowerTick, upperTick int64, freezeDuration time.Duration) (sdk.Int, sdk.Int, sdk.Dec, error) { + return k.createPosition(ctx, poolId, owner, amount0Desired, amount1Desired, amount0Min, amount1Min, lowerTick, upperTick, freezeDuration) } -func (k Keeper) WithdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time, requestedLiquidityAmountToWithdraw sdk.Dec) (amtDenom0, amtDenom1 sdk.Int, err error) { - return k.withdrawPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil, requestedLiquidityAmountToWithdraw) +func (k Keeper) WithdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, joinTime time.Time, freezeDuration time.Duration, requestedLiquidityAmountToWithdraw sdk.Dec) (amtDenom0, amtDenom1 sdk.Int, err error) { + return k.withdrawPosition(ctx, poolId, owner, lowerTick, upperTick, joinTime, freezeDuration, requestedLiquidityAmountToWithdraw) } func (ss *SwapState) UpdateFeeGrowthGlobal(feeChargeTotal sdk.Dec) { @@ -224,6 +224,6 @@ func (k Keeper) GetInitialUptimeGrowthOutsidesForTick(ctx sdk.Context, poolId ui return k.getInitialUptimeGrowthOutsidesForTick(ctx, poolId, tick) } -func (k Keeper) InitOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, position *model.Position, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, frozenUntil time.Time) error { - return k.initOrUpdatePositionUptime(ctx, poolId, position, owner, lowerTick, upperTick, liquidityDelta, frozenUntil) +func (k Keeper) InitOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, position *model.Position, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, joinTime time.Time, freezeDuration time.Duration) error { + return k.initOrUpdatePositionUptime(ctx, poolId, position, owner, lowerTick, upperTick, liquidityDelta, joinTime, freezeDuration) } diff --git a/x/concentrated-liquidity/fees_test.go b/x/concentrated-liquidity/fees_test.go index 6550cd75e87..d5fb0192c66 100644 --- a/x/concentrated-liquidity/fees_test.go +++ b/x/concentrated-liquidity/fees_test.go @@ -23,11 +23,11 @@ const ( // fields used to identify a fee position. type positionIdentifiers struct { - poolId uint64 - owner sdk.AccAddress - lowerTick int64 - upperTick int64 - frozenUntil time.Time + poolId uint64 + owner sdk.AccAddress + lowerTick int64 + upperTick int64 + freezeDuration time.Duration } var ( @@ -44,7 +44,7 @@ func (s *KeeperTestSuite) TestInitializeFeeAccumulatorPosition() { // cannot be overriden. s.SetupTest() s.PrepareConcentratedPool() - defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + defaultAccount := s.TestAccs[0] var ( @@ -54,7 +54,7 @@ func (s *KeeperTestSuite) TestInitializeFeeAccumulatorPosition() { defaultAccount, DefaultLowerTick, DefaultUpperTick, - defaultFrozenUntil, + DefaultFreezeDuration, } ) @@ -111,7 +111,7 @@ func (s *KeeperTestSuite) TestInitializeFeeAccumulatorPosition() { defaultAccount, DefaultLowerTick, DefaultUpperTick, - defaultFrozenUntil, + DefaultFreezeDuration, }, expectedPass: false, }, @@ -570,7 +570,6 @@ func (suite *KeeperTestSuite) TestChargeFee() { func (s *KeeperTestSuite) TestCollectFees() { ownerWithValidPosition := s.TestAccs[0] - defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) emptyUptimeTrackers := wrapUptimeTrackers(getExpectedUptimes().emptyExpectedAccumValues) tests := map[string]struct { @@ -583,10 +582,10 @@ func (s *KeeperTestSuite) TestCollectFees() { isInvalidPoolIdGiven bool // inputs parameters. - owner sdk.AccAddress - lowerTick int64 - upperTick int64 - frozenUntil time.Time + owner sdk.AccAddress + lowerTick int64 + upperTick int64 + freezeDuration time.Duration // expectations. expectedFeesClaimed sdk.Coins @@ -606,10 +605,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: 0, - upperTick: 1, - frozenUntil: defaultFrozenUntil, + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 1, + freezeDuration: DefaultFreezeDuration, currentTick: 2, @@ -623,10 +622,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: 0, - upperTick: 2, - frozenUntil: defaultFrozenUntil, + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + freezeDuration: DefaultFreezeDuration, currentTick: 3, @@ -640,10 +639,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: 0, - upperTick: 1, - frozenUntil: defaultFrozenUntil, + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 1, + freezeDuration: DefaultFreezeDuration, currentTick: 1, @@ -664,10 +663,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: 0, - upperTick: 1, - frozenUntil: defaultFrozenUntil, + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 1, + freezeDuration: DefaultFreezeDuration, currentTick: 0, @@ -682,10 +681,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: 0, - upperTick: 1, - frozenUntil: defaultFrozenUntil, + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 1, + freezeDuration: DefaultFreezeDuration, currentTick: -1, @@ -703,10 +702,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: 0, - upperTick: 1, - frozenUntil: defaultFrozenUntil, + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 1, + freezeDuration: DefaultFreezeDuration, currentTick: 5, @@ -721,10 +720,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: -10, - upperTick: -4, - frozenUntil: defaultFrozenUntil, + owner: ownerWithValidPosition, + lowerTick: -10, + upperTick: -4, + freezeDuration: DefaultFreezeDuration, currentTick: -13, @@ -741,10 +740,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: ownerWithValidPosition, - lowerTick: 0, - upperTick: 1, - frozenUntil: defaultFrozenUntil, + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 1, + freezeDuration: DefaultFreezeDuration, currentTick: 2, @@ -759,10 +758,10 @@ func (s *KeeperTestSuite) TestCollectFees() { globalFeeGrowth: sdk.NewDecCoins(sdk.NewDecCoin(ETH, sdk.NewInt(10))), - owner: s.TestAccs[1], // different owner from the one who initialized the position. - lowerTick: 0, - upperTick: 1, - frozenUntil: defaultFrozenUntil, + owner: s.TestAccs[1], // different owner from the one who initialized the position. + lowerTick: 0, + upperTick: 1, + freezeDuration: DefaultFreezeDuration, currentTick: 2, @@ -837,7 +836,6 @@ func (s *KeeperTestSuite) TestUpdateFeeAccumulatorPosition() { ownerOne = s.TestAccs[0] ownerTwo = s.TestAccs[1] ) - defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) type updateFeeAccumPositionTest struct { poolId uint64 @@ -845,60 +843,52 @@ func (s *KeeperTestSuite) TestUpdateFeeAccumulatorPosition() { liquidity sdk.Dec lowerTick int64 upperTick int64 - frozenUntil time.Time expectedError error } positions := map[int]updateFeeAccumPositionTest{ 1: { - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick, }, 2: { - lowerTick: DefaultLowerTick + 1, - upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil, + lowerTick: DefaultLowerTick + 1, + upperTick: DefaultUpperTick, }, 3: { - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick + 1, - frozenUntil: defaultFrozenUntil, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick + 1, }, } tests := map[string]updateFeeAccumPositionTest{ "update position with a different pool ID": { - poolId: 2, - owner: ownerOne, - liquidity: DefaultLiquidityAmt, - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil, + poolId: 2, + owner: ownerOne, + liquidity: DefaultLiquidityAmt, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick, }, "update position with a different owner": { - poolId: 1, - owner: ownerTwo, - liquidity: DefaultLiquidityAmt, - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil, + poolId: 1, + owner: ownerTwo, + liquidity: DefaultLiquidityAmt, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick, }, "update position with a different lower tick": { - poolId: 1, - owner: ownerOne, - liquidity: DefaultLiquidityAmt, - lowerTick: DefaultLowerTick + 1, - upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil, + poolId: 1, + owner: ownerOne, + liquidity: DefaultLiquidityAmt, + lowerTick: DefaultLowerTick + 1, + upperTick: DefaultUpperTick, }, "update position with a different upper tick": { - poolId: 1, - owner: ownerOne, - liquidity: DefaultLiquidityAmt, - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick + 1, - frozenUntil: defaultFrozenUntil, + poolId: 1, + owner: ownerOne, + liquidity: DefaultLiquidityAmt, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick + 1, }, "err: pool does not exist": { poolId: 3, @@ -910,7 +900,6 @@ func (s *KeeperTestSuite) TestUpdateFeeAccumulatorPosition() { liquidity: DefaultLiquidityAmt, lowerTick: DefaultLowerTick - 1, upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil, expectedError: accum.NoPositionError{Name: cl.FormatPositionAccumulatorKey(1, ownerOne, DefaultLowerTick-1, DefaultUpperTick)}, }, } @@ -955,7 +944,7 @@ func (s *KeeperTestSuite) TestUpdateFeeAccumulatorPosition() { if pool.GetId() == tc.poolId && owner.Equals(tc.owner) && pos.lowerTick == tc.lowerTick && pos.upperTick == tc.upperTick { liq = DefaultLiquidityAmt.Mul(sdk.NewDec(2)) } - s.validatePositionFeeAccUpdate(s.Ctx, pool.GetId(), owner, pos.lowerTick, pos.upperTick, pos.frozenUntil, liq) + s.validatePositionFeeAccUpdate(s.Ctx, pool.GetId(), owner, pos.lowerTick, pos.upperTick, liq) } } } diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index a39a502f885..16296aeab50 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -344,7 +344,7 @@ func (k Keeper) GetUptimeGrowthOutsideRange(ctx sdk.Context, poolId uint64, lowe } // initOrUpdatePositionUptime either adds or updates records for all uptime accumulators `position` qualifies for -func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, position *model.Position, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, frozenUntil time.Time) error { +func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, position *model.Position, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, joinTime time.Time, freezeDuration time.Duration) error { // We update accumulators _prior_ to any position-related updates to ensure // past rewards aren't distributed to new liquidity. We also update pool's // LastLiquidityUpdate here. @@ -370,15 +370,15 @@ func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, posit } // Loop through uptime accums for all supported uptimes on the pool and init or update position's records - positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil)) + positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, joinTime, freezeDuration)) for uptimeIndex, uptime := range types.SupportedUptimes { // We assume every position update requires the position to be frozen for the - // min uptime again. Thus, the difference between the position's `FrozenUntil` + // min uptime again. Thus, the difference between the position's `freezeDuration` // and the blocktime when the update happens should be greater than or equal // to the required uptime. // TODO: consider replacing BlockTime with a new field, JoinTime, so that post-join updates are not skipped - if position.FrozenUntil.Sub(ctx.BlockTime()) >= uptime { + if freezeDuration >= uptime { curUptimeAccum := uptimeAccumulators[uptimeIndex] // If a record does not exist for this uptime accumulator, create a new position. @@ -403,8 +403,8 @@ func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, posit return err } - // Note that even though "unclaimed rewards" accrue in the accumulator prior to frozenUntil, since position withdrawal - // and incentive collection are only allowed when current time is past frozenUntil these rewards are not accessible until then. + // Note that even though "unclaimed rewards" accrue in the accumulator prior to freezeDuration, since position withdrawal + // and incentive collection are only allowed when current time is past freezeDuration these rewards are not accessible until then. err = curUptimeAccum.UpdatePositionCustomAcc(positionName, liquidityDelta, globalUptimeGrowthInsideRange[uptimeIndex]) if err != nil { return err diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 4453beafa9b..ddd4c53ac0a 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -613,7 +613,6 @@ func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { supportedUptimes := types.SupportedUptimes - type updateAccumToNow struct { poolId uint64 accumUptime time.Duration @@ -703,13 +702,13 @@ func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { s.FundAcc(testAddressTwo, sdk.NewCoins(sdk.NewCoin(clPool.GetToken0(), testQualifyingDepositsTwo), sdk.NewCoin(clPool.GetToken1(), testQualifyingDepositsTwo))) s.FundAcc(testAddressThree, sdk.NewCoins(sdk.NewCoin(clPool.GetToken0(), testQualifyingDepositsThree), sdk.NewCoin(clPool.GetToken1(), testQualifyingDepositsThree))) - _, _, qualifyingLiquidityUptimeOne, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, testAddressOne, testQualifyingDepositsOne, testQualifyingDepositsOne, sdk.ZeroInt(), sdk.ZeroInt(), clPool.GetCurrentTick().Int64()-1, clPool.GetCurrentTick().Int64()+1, defaultStartTime.Add(supportedUptimes[0])) + _, _, qualifyingLiquidityUptimeOne, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, testAddressOne, testQualifyingDepositsOne, testQualifyingDepositsOne, sdk.ZeroInt(), sdk.ZeroInt(), clPool.GetCurrentTick().Int64()-1, clPool.GetCurrentTick().Int64()+1, supportedUptimes[0]) s.Require().NoError(err) - _, _, qualifyingLiquidityUptimeTwo, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, testAddressTwo, testQualifyingDepositsTwo, testQualifyingDepositsTwo, sdk.ZeroInt(), sdk.ZeroInt(), clPool.GetCurrentTick().Int64()-1, clPool.GetCurrentTick().Int64()+1, defaultStartTime.Add(supportedUptimes[1])) + _, _, qualifyingLiquidityUptimeTwo, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, testAddressTwo, testQualifyingDepositsTwo, testQualifyingDepositsTwo, sdk.ZeroInt(), sdk.ZeroInt(), clPool.GetCurrentTick().Int64()-1, clPool.GetCurrentTick().Int64()+1, supportedUptimes[1]) s.Require().NoError(err) - _, _, qualifyingLiquidityUptimeThree, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, testAddressThree, testQualifyingDepositsThree, testQualifyingDepositsThree, sdk.ZeroInt(), sdk.ZeroInt(), clPool.GetCurrentTick().Int64()-1, clPool.GetCurrentTick().Int64()+1, defaultStartTime.Add(supportedUptimes[2])) + _, _, qualifyingLiquidityUptimeThree, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, testAddressThree, testQualifyingDepositsThree, testQualifyingDepositsThree, sdk.ZeroInt(), sdk.ZeroInt(), clPool.GetCurrentTick().Int64()-1, clPool.GetCurrentTick().Int64()+1, supportedUptimes[2]) s.Require().NoError(err) // Note that the third position (1D freeze) qualifies for all three uptimes, the second position qualifies for the first two, @@ -1532,104 +1531,107 @@ func (s *KeeperTestSuite) TestGetUptimeGrowthOutsideRange() { } func (s *KeeperTestSuite) TestInitOrUpdatePositionUptime() { - defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) uptimeHelper := getExpectedUptimes() type tick struct { - tickIndex int64 + tickIndex int64 uptimeTrackers []model.UptimeTracker } tests := []struct { - name string - position *model.Position + name string + position *model.Position - lowerTick tick - upperTick tick - currentTickIndex sdk.Int + lowerTick tick + upperTick tick + currentTickIndex sdk.Int globalUptimeAccumValues []sdk.DecCoins // For testing updates on existing liquidity - existingPosition bool - newLowerTick tick - newUpperTick tick - addToGlobalAccums []sdk.DecCoins + existingPosition bool + newLowerTick tick + newUpperTick tick + addToGlobalAccums []sdk.DecCoins - expectedInitAccumValue []sdk.DecCoins + expectedInitAccumValue []sdk.DecCoins expectedUnclaimedRewards []sdk.DecCoins - expectedErr error + expectedErr error }{ // New position tests { name: "(lower < curr < upper) default freeze time with nonzero uptime trackers", position: &model.Position{ - FrozenUntil: defaultFrozenUntil, - Liquidity: DefaultLiquidityAmt, + FreezeDuration: DefaultFreezeDuration, + JoinTime: s.Ctx.BlockTime(), + Liquidity: DefaultLiquidityAmt, }, - lowerTick: tick{ - tickIndex: -50, + lowerTick: tick{ + tickIndex: -50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), }, - upperTick: tick{ - tickIndex: 50, + upperTick: tick{ + tickIndex: 50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), }, - currentTickIndex: sdk.ZeroInt(), - globalUptimeAccumValues: uptimeHelper.threeHundredTokensMultiDenom, - expectedInitAccumValue: uptimeHelper.hundredTokensMultiDenom, + currentTickIndex: sdk.ZeroInt(), + globalUptimeAccumValues: uptimeHelper.threeHundredTokensMultiDenom, + expectedInitAccumValue: uptimeHelper.hundredTokensMultiDenom, expectedUnclaimedRewards: uptimeHelper.emptyExpectedAccumValues, }, { name: "(lower < upper < curr) default freeze time with nonzero uptime trackers", position: &model.Position{ - FrozenUntil: defaultFrozenUntil, - Liquidity: DefaultLiquidityAmt, + FreezeDuration: DefaultFreezeDuration, + JoinTime: s.Ctx.BlockTime(), + Liquidity: DefaultLiquidityAmt, }, - lowerTick: tick{ - tickIndex: -50, + lowerTick: tick{ + tickIndex: -50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), }, - upperTick: tick{ - tickIndex: 50, + upperTick: tick{ + tickIndex: 50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.threeHundredTokensMultiDenom), }, - currentTickIndex: sdk.NewInt(51), - globalUptimeAccumValues: uptimeHelper.fourHundredTokensMultiDenom, - expectedInitAccumValue: uptimeHelper.twoHundredTokensMultiDenom, + currentTickIndex: sdk.NewInt(51), + globalUptimeAccumValues: uptimeHelper.fourHundredTokensMultiDenom, + expectedInitAccumValue: uptimeHelper.twoHundredTokensMultiDenom, expectedUnclaimedRewards: uptimeHelper.emptyExpectedAccumValues, }, { name: "(curr < lower < upper) default freeze time with nonzero uptime trackers", position: &model.Position{ - FrozenUntil: defaultFrozenUntil, - Liquidity: DefaultLiquidityAmt, + FreezeDuration: DefaultFreezeDuration, + JoinTime: s.Ctx.BlockTime(), + Liquidity: DefaultLiquidityAmt, }, - lowerTick: tick{ - tickIndex: -50, + lowerTick: tick{ + tickIndex: -50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.threeHundredTokensMultiDenom), }, - upperTick: tick{ - tickIndex: 50, + upperTick: tick{ + tickIndex: 50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), }, - currentTickIndex: sdk.NewInt(-51), - globalUptimeAccumValues: uptimeHelper.fourHundredTokensMultiDenom, - expectedInitAccumValue: uptimeHelper.twoHundredTokensMultiDenom, + currentTickIndex: sdk.NewInt(-51), + globalUptimeAccumValues: uptimeHelper.fourHundredTokensMultiDenom, + expectedInitAccumValue: uptimeHelper.twoHundredTokensMultiDenom, expectedUnclaimedRewards: uptimeHelper.emptyExpectedAccumValues, }, { name: "(lower < curr < upper) default freeze time with nonzero and variable uptime trackers", position: &model.Position{ - FrozenUntil: defaultFrozenUntil, - Liquidity: DefaultLiquidityAmt, + FreezeDuration: DefaultFreezeDuration, + JoinTime: s.Ctx.BlockTime(), + Liquidity: DefaultLiquidityAmt, }, - lowerTick: tick{ - tickIndex: -50, + lowerTick: tick{ + tickIndex: -50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.varyingTokensMultiDenom), }, - upperTick: tick{ - tickIndex: 50, + upperTick: tick{ + tickIndex: 50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), }, currentTickIndex: sdk.ZeroInt(), @@ -1663,7 +1665,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePositionUptime() { ), }, // Equal to 100 of foo and bar in each uptime tracker (UGI) - expectedInitAccumValue: uptimeHelper.hundredTokensMultiDenom, + expectedInitAccumValue: uptimeHelper.hundredTokensMultiDenom, expectedUnclaimedRewards: uptimeHelper.emptyExpectedAccumValues, }, @@ -1672,31 +1674,32 @@ func (s *KeeperTestSuite) TestInitOrUpdatePositionUptime() { { name: "(lower < curr < upper) add to frozen position with no new uptime growth", position: &model.Position{ - FrozenUntil: defaultFrozenUntil, - Liquidity: DefaultLiquidityAmt, + FreezeDuration: DefaultFreezeDuration, + JoinTime: s.Ctx.BlockTime(), + Liquidity: DefaultLiquidityAmt, }, - lowerTick: tick{ - tickIndex: -50, + lowerTick: tick{ + tickIndex: -50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), }, - upperTick: tick{ - tickIndex: 50, + upperTick: tick{ + tickIndex: 50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), }, - currentTickIndex: sdk.ZeroInt(), + currentTickIndex: sdk.ZeroInt(), globalUptimeAccumValues: uptimeHelper.threeHundredTokensMultiDenom, // New lower and upper ticks remain unchanged existingPosition: true, newLowerTick: tick{ - tickIndex: -50, + tickIndex: -50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), }, newUpperTick: tick{ - tickIndex: 50, + tickIndex: 50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), }, - addToGlobalAccums: uptimeHelper.emptyExpectedAccumValues, + addToGlobalAccums: uptimeHelper.emptyExpectedAccumValues, expectedInitAccumValue: uptimeHelper.hundredTokensMultiDenom, // No uptime growth inside range @@ -1705,18 +1708,19 @@ func (s *KeeperTestSuite) TestInitOrUpdatePositionUptime() { { name: "(lower < curr < upper) add to frozen position with new growth", position: &model.Position{ - FrozenUntil: defaultFrozenUntil, - Liquidity: DefaultLiquidityAmt, + FreezeDuration: DefaultFreezeDuration, + JoinTime: s.Ctx.BlockTime(), + Liquidity: DefaultLiquidityAmt, }, - lowerTick: tick{ - tickIndex: -50, + lowerTick: tick{ + tickIndex: -50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), }, - upperTick: tick{ - tickIndex: 50, + upperTick: tick{ + tickIndex: 50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.hundredTokensMultiDenom), }, - currentTickIndex: sdk.ZeroInt(), + currentTickIndex: sdk.ZeroInt(), globalUptimeAccumValues: uptimeHelper.threeHundredTokensMultiDenom, // Add 200 to growth outside range, and 100 to growth inside @@ -1724,11 +1728,11 @@ func (s *KeeperTestSuite) TestInitOrUpdatePositionUptime() { // uptime trackers of the lower and upper ticks and (200 + 100) to the global accums existingPosition: true, newLowerTick: tick{ - tickIndex: -50, + tickIndex: -50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.twoHundredTokensMultiDenom), }, newUpperTick: tick{ - tickIndex: 50, + tickIndex: 50, uptimeTrackers: wrapUptimeTrackers(uptimeHelper.twoHundredTokensMultiDenom), }, // This puts global accums at 600 of each denom @@ -1736,7 +1740,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePositionUptime() { // We expect (global - upper - lower) = (600 - 200 - 200) = 200 of each denom expectedInitAccumValue: uptimeHelper.twoHundredTokensMultiDenom, - + // Equivalent to the uptime growth inside the range (200 - 100 = 100) expectedUnclaimedRewards: uptimeHelper.hundredTokensMultiDenom, }, @@ -1760,11 +1764,11 @@ func (s *KeeperTestSuite) TestInitOrUpdatePositionUptime() { addToUptimeAccums(s.Ctx, clPool.GetId(), s.App.ConcentratedLiquidityKeeper, test.globalUptimeAccumValues) // If applicable, set up existing position and update ticks & global accums - if test.existingPosition{ - err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePositionUptime(s.Ctx, clPool.GetId(), test.position, s.TestAccs[0], test.lowerTick.tickIndex, test.upperTick.tickIndex, test.position.Liquidity, test.position.FrozenUntil) + if test.existingPosition { + err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePositionUptime(s.Ctx, clPool.GetId(), test.position, s.TestAccs[0], test.lowerTick.tickIndex, test.upperTick.tickIndex, test.position.Liquidity, test.position.JoinTime, test.position.FreezeDuration) s.Require().NoError(err) - s.App.ConcentratedLiquidityKeeper.SetPosition(s.Ctx, clPool.GetId(), s.TestAccs[0], test.lowerTick.tickIndex, test.upperTick.tickIndex, test.position, test.position.FrozenUntil) - + s.App.ConcentratedLiquidityKeeper.SetPosition(s.Ctx, clPool.GetId(), s.TestAccs[0], test.lowerTick.tickIndex, test.upperTick.tickIndex, test.position, test.position.JoinTime, test.position.FreezeDuration) + s.initializeTick(s.Ctx, test.currentTickIndex.Int64(), test.newLowerTick.tickIndex, sdk.ZeroDec(), cl.EmptyCoins, test.newLowerTick.uptimeTrackers, true) s.initializeTick(s.Ctx, test.currentTickIndex.Int64(), test.newUpperTick.tickIndex, sdk.ZeroDec(), cl.EmptyCoins, test.newUpperTick.uptimeTrackers, false) clPool.SetCurrentTick(test.currentTickIndex) @@ -1778,8 +1782,8 @@ func (s *KeeperTestSuite) TestInitOrUpdatePositionUptime() { // --- System under test --- - err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePositionUptime(s.Ctx, clPool.GetId(), test.position, s.TestAccs[0], test.lowerTick.tickIndex, test.upperTick.tickIndex, test.position.Liquidity, test.position.FrozenUntil) - + err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePositionUptime(s.Ctx, clPool.GetId(), test.position, s.TestAccs[0], test.lowerTick.tickIndex, test.upperTick.tickIndex, test.position.Liquidity, test.position.JoinTime, test.position.FreezeDuration) + // --- Error catching --- if test.expectedErr != nil { @@ -1793,8 +1797,8 @@ func (s *KeeperTestSuite) TestInitOrUpdatePositionUptime() { s.Require().NoError(err) // Pre-compute variables for readability - freezePeriod := test.position.FrozenUntil.Sub(s.Ctx.BlockTime()) - positionName := string(types.KeyFullPosition(clPool.GetId(), s.TestAccs[0], test.lowerTick.tickIndex, test.upperTick.tickIndex, test.position.FrozenUntil)) + freezePeriod := test.position.FreezeDuration + positionName := string(types.KeyFullPosition(clPool.GetId(), s.TestAccs[0], test.lowerTick.tickIndex, test.upperTick.tickIndex, test.position.JoinTime, test.position.FreezeDuration)) uptimeAccums, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulators(s.Ctx, clPool.GetId()) s.Require().NoError(err) @@ -1810,7 +1814,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePositionUptime() { // Ensure position's record has correct values positionRecord, err := accum.GetPosition(uptimeAccums[uptimeIndex], positionName) s.Require().NoError(err) - + s.Require().Equal(test.expectedInitAccumValue[uptimeIndex], positionRecord.InitAccumValue) if test.existingPosition { diff --git a/x/concentrated-liquidity/keeper_test.go b/x/concentrated-liquidity/keeper_test.go index c392ff254dc..46d2cc7bc4a 100644 --- a/x/concentrated-liquidity/keeper_test.go +++ b/x/concentrated-liquidity/keeper_test.go @@ -59,14 +59,14 @@ func (suite *KeeperTestSuite) SetupTest() { } func (s *KeeperTestSuite) SetupDefaultPosition(poolId uint64) { - s.SetupPosition(poolId, s.TestAccs[0], DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) + s.SetupPosition(poolId, s.TestAccs[0], DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime(), DefaultFreezeDuration) } -func (s *KeeperTestSuite) SetupPosition(poolId uint64, owner sdk.AccAddress, coin0, coin1 sdk.Coin, lowerTick, upperTick int64, frozenUntil time.Time) model.Position { +func (s *KeeperTestSuite) SetupPosition(poolId uint64, owner sdk.AccAddress, coin0, coin1 sdk.Coin, lowerTick, upperTick int64, joinTime time.Time, freezeDuration time.Duration) model.Position { s.FundAcc(owner, sdk.NewCoins(coin0, coin1)) - _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, poolId, owner, coin0.Amount, coin1.Amount, sdk.ZeroInt(), sdk.ZeroInt(), lowerTick, upperTick, frozenUntil) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, poolId, owner, coin0.Amount, coin1.Amount, sdk.ZeroInt(), sdk.ZeroInt(), lowerTick, upperTick, freezeDuration) s.Require().NoError(err) - position, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, poolId, owner, lowerTick, upperTick, frozenUntil) + position, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) s.Require().NoError(err) return *position } @@ -93,24 +93,24 @@ func (s *KeeperTestSuite) SetupDefaultPositions(poolId uint64) { } func (s *KeeperTestSuite) SetupDefaultPositionAcc(poolId uint64, owner sdk.AccAddress) { - s.SetupPosition(poolId, owner, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) + s.SetupPosition(poolId, owner, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime(), DefaultFreezeDuration) } func (s *KeeperTestSuite) SetupFullRangePositionAcc(poolId uint64, owner sdk.AccAddress) { - s.SetupPosition(poolId, owner, DefaultCoin0, DefaultCoin1, DefaultMinTick, DefaultMaxTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) + s.SetupPosition(poolId, owner, DefaultCoin0, DefaultCoin1, DefaultMinTick, DefaultMaxTick, s.Ctx.BlockTime(), DefaultFreezeDuration) } func (s *KeeperTestSuite) SetupConsecutiveRangePositionAcc(poolId uint64, owner sdk.AccAddress) { - s.SetupPosition(poolId, owner, DefaultCoin0, DefaultCoin1, DefaultExponentConsecutivePositionLowerTick.Int64(), DefaultExponentConsecutivePositionUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) + s.SetupPosition(poolId, owner, DefaultCoin0, DefaultCoin1, DefaultExponentConsecutivePositionLowerTick.Int64(), DefaultExponentConsecutivePositionUpperTick.Int64(), s.Ctx.BlockTime(), DefaultFreezeDuration) } func (s *KeeperTestSuite) SetupOverlappingRangePositionAcc(poolId uint64, owner sdk.AccAddress) { - s.SetupPosition(poolId, owner, DefaultCoin0, DefaultCoin1, DefaultExponentOverlappingPositionLowerTick.Int64(), DefaultExponentOverlappingPositionUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) + s.SetupPosition(poolId, owner, DefaultCoin0, DefaultCoin1, DefaultExponentOverlappingPositionLowerTick.Int64(), DefaultExponentOverlappingPositionUpperTick.Int64(), s.Ctx.BlockTime(), DefaultFreezeDuration) } // validatePositionUpdate validates that position with given parameters has expectedRemainingLiquidity left. -func (s *KeeperTestSuite) validatePositionUpdate(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64, frozenUntil time.Time, expectedRemainingLiquidity sdk.Dec) { - position, err := s.App.ConcentratedLiquidityKeeper.GetPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) +func (s *KeeperTestSuite) validatePositionUpdate(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64, joinTime time.Time, freezeDuration time.Duration, expectedRemainingLiquidity sdk.Dec) { + position, err := s.App.ConcentratedLiquidityKeeper.GetPosition(ctx, poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) s.Require().NoError(err) newPositionLiquidity := position.Liquidity s.Require().Equal(expectedRemainingLiquidity.String(), newPositionLiquidity.String()) @@ -156,7 +156,7 @@ func (s *KeeperTestSuite) initializeFeeAccumulatorPositionWithLiquidity(ctx sdk. // validatePositionFeeAccUpdate validates that the position's accumulator with given parameters // has been updated with liquidity. -func (s *KeeperTestSuite) validatePositionFeeAccUpdate(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64, frozenUntil time.Time, liquidity sdk.Dec) { +func (s *KeeperTestSuite) validatePositionFeeAccUpdate(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64, liquidity sdk.Dec) { accum, err := s.App.ConcentratedLiquidityKeeper.GetFeeAccumulator(ctx, poolId) s.Require().NoError(err) diff --git a/x/concentrated-liquidity/lp.go b/x/concentrated-liquidity/lp.go index 9ba318af3a0..6b9a3ac038d 100644 --- a/x/concentrated-liquidity/lp.go +++ b/x/concentrated-liquidity/lp.go @@ -23,7 +23,10 @@ import ( // - the liquidity delta is zero // - the amount0 or amount1 returned from the position update is less than the given minimums // - the pool or user does not have enough tokens to satisfy the requested amount -func (k Keeper) createPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, amount0Desired, amount1Desired, amount0Min, amount1Min sdk.Int, lowerTick, upperTick int64, frozenUntil time.Time) (sdk.Int, sdk.Int, sdk.Dec, error) { +func (k Keeper) createPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, amount0Desired, amount1Desired, amount0Min, amount1Min sdk.Int, lowerTick, upperTick int64, freezeDuration time.Duration) (sdk.Int, sdk.Int, sdk.Dec, error) { + // get current blockTime that user joins the position + joinTime := ctx.BlockTime() + // Retrieve the pool associated with the given pool ID. pool, err := k.getPoolById(ctx, poolId) if err != nil { @@ -75,7 +78,7 @@ func (k Keeper) createPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddr } // Update the position in the pool based on the provided tick range and liquidity delta. - actualAmount0, actualAmount1, err := k.updatePosition(cacheCtx, poolId, owner, lowerTick, upperTick, liquidityDelta, frozenUntil) + actualAmount0, actualAmount1, err := k.updatePosition(cacheCtx, poolId, owner, lowerTick, upperTick, liquidityDelta, joinTime, freezeDuration) if err != nil { return sdk.Int{}, sdk.Int{}, sdk.Dec{}, err } @@ -106,7 +109,7 @@ func (k Keeper) createPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddr // - there is no position in the given tick ranges // - if tick ranges are invalid // - if attempts to withdraw an amount higher than originally provided in createPosition for a given range. -func (k Keeper) withdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time, requestedLiquidityAmountToWithdraw sdk.Dec) (amtDenom0, amtDenom1 sdk.Int, err error) { +func (k Keeper) withdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, joinTime time.Time, freezeDuration time.Duration, requestedLiquidityAmountToWithdraw sdk.Dec) (amtDenom0, amtDenom1 sdk.Int, err error) { // Retrieve the pool associated with the given pool ID. pool, err := k.getPoolById(ctx, poolId) if err != nil { @@ -119,15 +122,17 @@ func (k Keeper) withdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAd } // Retrieve the position in the pool for the provided owner and tick range. - position, err := k.GetPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) + position, err := k.GetPosition(ctx, poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) if err != nil { return sdk.Int{}, sdk.Int{}, err } // Check if position is still frozen // TODO: consider replacing this check with ClaimIncentives and distributing rewards back into the accumulator if BlockTime < frozenUntil - if position.FrozenUntil.After(ctx.BlockTime()) { - return sdk.Int{}, sdk.Int{}, types.PositionStillFrozenError{FrozenUntil: position.FrozenUntil} + // if (joinTime + freezeDuration) is more than (currentBlockTime) the position is still frozen. + // Note: JoinTime is set to currentBlockTime when a user creates or updates position. + if joinTime.Add(position.FreezeDuration).After(ctx.BlockTime()) { + return sdk.Int{}, sdk.Int{}, types.PositionStillFrozenError{FreezeDuration: position.FreezeDuration} } // Check if the requested liquidity amount to withdraw is less than or equal to the available liquidity for the position. @@ -142,7 +147,7 @@ func (k Keeper) withdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAd liquidityDelta := requestedLiquidityAmountToWithdraw.Neg() // Update the position in the pool based on the provided tick range and liquidity delta. - actualAmount0, actualAmount1, err := k.updatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta, frozenUntil) + actualAmount0, actualAmount1, err := k.updatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta, joinTime, freezeDuration) if err != nil { return sdk.Int{}, sdk.Int{}, err } @@ -162,7 +167,7 @@ func (k Keeper) withdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAd // TODO: claim incentives (when implemented) to clear accum record from state - if err := k.deletePosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil); err != nil { + if err := k.deletePosition(ctx, poolId, owner, lowerTick, upperTick, joinTime, freezeDuration); err != nil { return sdk.Int{}, sdk.Int{}, err } } @@ -176,7 +181,7 @@ func (k Keeper) withdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAd // Updates ticks and pool liquidity. Returns how much of each token is either added or removed. // Negative returned amounts imply that tokens are removed from the pool. // Positive returned amounts imply that tokens are added to the pool. -func (k Keeper) updatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, frozenUntil time.Time) (sdk.Int, sdk.Int, error) { +func (k Keeper) updatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, joinTime time.Time, freezeDuration time.Duration) (sdk.Int, sdk.Int, error) { // now calculate amount for token0 and token1 pool, err := k.getPoolById(ctx, poolId) if err != nil { @@ -200,7 +205,7 @@ func (k Keeper) updatePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddr // update position state // TODO: come back to sdk.Int vs sdk.Dec state & truncation - err = k.initOrUpdatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta, frozenUntil) + err = k.initOrUpdatePosition(ctx, poolId, owner, lowerTick, upperTick, liquidityDelta, joinTime, freezeDuration) if err != nil { return sdk.Int{}, sdk.Int{}, err } diff --git a/x/concentrated-liquidity/lp_test.go b/x/concentrated-liquidity/lp_test.go index 5dc8df110dc..9b60b6ce136 100644 --- a/x/concentrated-liquidity/lp_test.go +++ b/x/concentrated-liquidity/lp_test.go @@ -17,7 +17,8 @@ type lpTest struct { currentTick sdk.Int lowerTick int64 upperTick int64 - frozenUntil time.Time + joinTime time.Time + freezeDuration time.Duration currentSqrtP sdk.Dec amount0Desired sdk.Int amount0Minimum sdk.Int @@ -56,6 +57,7 @@ var ( liquidityAmount: DefaultLiquidityAmt, tickSpacing: DefaultTickSpacing, precisionFactorAtPriceOne: DefaultExponentAtPriceOne, + freezeDuration: DefaultFreezeDuration, preSetChargeFee: oneEth, // in this setup lower tick < current tick < upper tick @@ -120,6 +122,7 @@ var ( ) func (s *KeeperTestSuite) TestCreatePosition() { + defaultJoinTime := s.Ctx.BlockTime() tests := map[string]lpTest{ "error: non-existent pool": { poolId: 2, @@ -186,6 +189,7 @@ func (s *KeeperTestSuite) TestCreatePosition() { tc := tc s.Run(name, func() { s.SetupTest() + s.Ctx = s.Ctx.WithBlockTime(defaultJoinTime) // Merge tc with baseCase and update tc to the merged result. This is done to reduce the amount of boilerplate in test cases. baseConfigCopy := *baseCase @@ -212,7 +216,7 @@ func (s *KeeperTestSuite) TestCreatePosition() { // If we want to test a non-first position, we create a first position with a separate account if tc.isNotFirstPosition { - s.SetupPosition(1, s.TestAccs[1], DefaultCoin0, DefaultCoin1, tc.lowerTick, tc.upperTick, tc.frozenUntil) + s.SetupPosition(1, s.TestAccs[1], DefaultCoin0, DefaultCoin1, tc.lowerTick, tc.upperTick, defaultJoinTime, tc.freezeDuration) } expectedLiquidityCreated := tc.liquidityAmount @@ -221,7 +225,7 @@ func (s *KeeperTestSuite) TestCreatePosition() { // we expect to create half of the final liquidity amount. expectedLiquidityCreated = tc.liquidityAmount.QuoInt64(2) - s.SetupPosition(1, s.TestAccs[0], DefaultCoin0, DefaultCoin1, tc.lowerTick, tc.upperTick, tc.frozenUntil) + s.SetupPosition(1, s.TestAccs[0], DefaultCoin0, DefaultCoin1, tc.lowerTick, tc.upperTick, defaultJoinTime, tc.freezeDuration) } // Fund test account and create the desired position @@ -232,7 +236,7 @@ func (s *KeeperTestSuite) TestCreatePosition() { poolBalancePrePositionCreation := s.App.BankKeeper.GetAllBalances(s.Ctx, pool.GetAddress()) // System under test. - asset0, asset1, liquidityCreated, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.amount0Desired, tc.amount1Desired, tc.amount0Minimum, tc.amount1Minimum, tc.lowerTick, tc.upperTick, tc.frozenUntil) + asset0, asset1, liquidityCreated, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.amount0Desired, tc.amount1Desired, tc.amount0Minimum, tc.amount1Minimum, tc.lowerTick, tc.upperTick, tc.freezeDuration) // Note user and pool account balances to compare after create position is called userBalancePostPositionCreation := s.App.BankKeeper.GetAllBalances(s.Ctx, s.TestAccs[0]) @@ -254,7 +258,7 @@ func (s *KeeperTestSuite) TestCreatePosition() { s.Require().Equal(poolBalancePrePositionCreation.String(), poolBalancePostPositionCreation.String()) // Redundantly ensure that position was not created - position, err := clKeeper.GetPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.frozenUntil) + position, err := clKeeper.GetPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, defaultJoinTime, tc.freezeDuration) s.Require().Error(err) s.Require().ErrorAs(err, &types.PositionNotFoundError{PoolId: tc.poolId, LowerTick: tc.lowerTick, UpperTick: tc.upperTick}) s.Require().Nil(position) @@ -271,13 +275,13 @@ func (s *KeeperTestSuite) TestCreatePosition() { s.Require().Equal(userBalancePrePositionCreation.Sub(sdk.NewCoins(sdk.NewCoin(ETH, asset0), (sdk.NewCoin(USDC, asset1)))).String(), userBalancePostPositionCreation.String()) s.Require().Equal(poolBalancePrePositionCreation.Add(sdk.NewCoin(ETH, asset0), (sdk.NewCoin(USDC, asset1))).String(), poolBalancePostPositionCreation.String()) - hasPosition := clKeeper.HasFullPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.frozenUntil) + hasPosition := clKeeper.HasFullPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, defaultJoinTime, tc.freezeDuration) s.Require().True(hasPosition) // Check position state - s.validatePositionUpdate(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.frozenUntil, tc.liquidityAmount) + s.validatePositionUpdate(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, defaultJoinTime, tc.freezeDuration, tc.liquidityAmount) - s.validatePositionFeeAccUpdate(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.frozenUntil, tc.liquidityAmount) + s.validatePositionFeeAccUpdate(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.liquidityAmount) // Check tick state s.validateTickUpdates(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.liquidityAmount, tc.expectedFeeGrowthOutsideLower, tc.expectedFeeGrowthOutsideUpper) @@ -286,9 +290,10 @@ func (s *KeeperTestSuite) TestCreatePosition() { } func (s *KeeperTestSuite) TestWithdrawPosition() { - defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) frozenBaseCase := *baseCase - frozenBaseCase.frozenUntil = defaultFrozenUntil + frozenBaseCase.freezeDuration = DefaultFreezeDuration + defaultJoinTime := s.Ctx.BlockTime() + tests := map[string]struct { setupConfig *lpTest // when this is set, it overwrites the setupConfig @@ -316,7 +321,6 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { // for withdrawing a position. sutConfigOverwrite: &lpTest{ liquidityAmount: baseCase.liquidityAmount.QuoRoundUp(sdk.NewDec(2)), - amount0Expected: baseCase.amount0Expected.QuoRaw(2), // 0.499488 amount1Expected: baseCase.amount1Expected.QuoRaw(2), // 2500 usdc }, @@ -329,30 +333,30 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { // for withdrawing a position. sutConfigOverwrite: &lpTest{ lowerTick: -1, // valid tick at which no position exists - expectedError: types.PositionNotFoundError{PoolId: 1, LowerTick: -1, UpperTick: 315000, FrozenUntil: time.Time{}}, + expectedError: types.PositionNotFoundError{PoolId: 1, LowerTick: -1, UpperTick: 315000, JoinTime: defaultJoinTime, FreezeDuration: DefaultFreezeDuration}, }, }, - "error: no position created (position exists but wrong frozenUntil value)": { + "error: no position created (position exists but wrong freeze duration value)": { // setup parameters for creation a pool and position. setupConfig: baseCase, // system under test parameters // for withdrawing a position. sutConfigOverwrite: &lpTest{ - frozenUntil: defaultFrozenUntil, - expectedError: types.PositionNotFoundError{PoolId: 1, LowerTick: 305450, UpperTick: 315000, FrozenUntil: defaultFrozenUntil}, + freezeDuration: DefaultFreezeDuration, + expectedError: types.PositionNotFoundError{PoolId: 1, LowerTick: 305450, UpperTick: 315000, JoinTime: defaultJoinTime, FreezeDuration: DefaultFreezeDuration}, }, createPositionFreezeOverwrite: true, }, "error: position still unfreezing": { // setup parameters for creation a pool and position. - setupConfig: baseCase, + setupConfig: &frozenBaseCase, // system under test parameters // for withdrawing a position. sutConfigOverwrite: &lpTest{ - frozenUntil: defaultFrozenUntil, - expectedError: types.PositionStillFrozenError{FrozenUntil: defaultFrozenUntil}, + freezeDuration: DefaultFreezeDuration, + expectedError: types.PositionStillFrozenError{FreezeDuration: DefaultFreezeDuration}, }, }, "error: withdraw liquidity that is still frozen": { @@ -362,7 +366,7 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { // system under test parameters // for withdrawing a position. sutConfigOverwrite: &lpTest{ - expectedError: types.PositionStillFrozenError{FrozenUntil: defaultFrozenUntil}, + expectedError: types.PositionStillFrozenError{FreezeDuration: DefaultFreezeDuration}, }, }, "error: pool id for pool that does not exist": { @@ -429,6 +433,7 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { s.Run(name, func() { // Setup. s.SetupTest() + s.Ctx = s.Ctx.WithBlockTime(defaultJoinTime) var ( ctx = s.Ctx @@ -439,11 +444,13 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { config = *tc.setupConfig sutConfigOverwrite = *tc.sutConfigOverwrite ) + // If specific configs are provided in the test case, overwrite the config with those values. mergeConfigs(&config, &sutConfigOverwrite) - createPositionFreezeTime := config.frozenUntil + createPositionFreezeDuration := config.freezeDuration + if tc.createPositionFreezeOverwrite { - createPositionFreezeTime = time.Time{} + createPositionFreezeDuration = 0 } // If a setupConfig is provided, use it to create a pool and position. @@ -451,7 +458,7 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { s.FundAcc(owner, sdk.NewCoins(sdk.NewCoin("eth", sdk.NewInt(10000000000000)), sdk.NewCoin("usdc", sdk.NewInt(1000000000000)))) // Create a position from the parameters in the test case. - _, _, liquidityCreated, err := concentratedLiquidityKeeper.CreatePosition(ctx, pool.GetId(), owner, config.amount0Desired, config.amount1Desired, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, createPositionFreezeTime) + _, _, liquidityCreated, err := concentratedLiquidityKeeper.CreatePosition(ctx, pool.GetId(), owner, config.amount0Desired, config.amount1Desired, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, createPositionFreezeDuration) s.Require().NoError(err) // Set global fee growth to 1 ETH and charge the fee to the pool. @@ -476,9 +483,13 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { expectedBalanceDelta := expectedFeesClaimed.Add(sdk.NewCoin(ETH, config.amount0Expected.Abs())).Add(sdk.NewCoin(USDC, config.amount1Expected.Abs())) - // System under test. - amtDenom0, amtDenom1, err := concentratedLiquidityKeeper.WithdrawPosition(ctx, config.poolId, owner, config.lowerTick, config.upperTick, config.frozenUntil, config.liquidityAmount) + if tc.setupConfig != &frozenBaseCase { + s.Ctx = s.Ctx.WithBlockTime(defaultJoinTime.Add(time.Hour * 24)) + ctx = s.Ctx + } + // System under test. + amtDenom0, amtDenom1, err := concentratedLiquidityKeeper.WithdrawPosition(ctx, config.poolId, owner, config.lowerTick, config.upperTick, defaultJoinTime, config.freezeDuration, config.liquidityAmount) if config.expectedError != nil { s.Require().Error(err) s.Require().Equal(amtDenom0, sdk.Int{}) @@ -501,13 +512,13 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { if expectedRemainingLiquidity.IsZero() { // Check that the position was deleted. - position, err := concentratedLiquidityKeeper.GetPosition(ctx, config.poolId, owner, config.lowerTick, config.upperTick, config.frozenUntil) + position, err := concentratedLiquidityKeeper.GetPosition(ctx, config.poolId, owner, config.lowerTick, config.upperTick, defaultJoinTime, config.freezeDuration) s.Require().Error(err) - s.Require().ErrorAs(err, &types.PositionNotFoundError{PoolId: config.poolId, LowerTick: config.lowerTick, UpperTick: config.upperTick}) + s.Require().ErrorAs(err, &types.PositionNotFoundError{PoolId: config.poolId, LowerTick: config.lowerTick, JoinTime: defaultJoinTime, UpperTick: config.upperTick}) s.Require().Nil(position) } else { // Check that the position was updated. - s.validatePositionUpdate(ctx, config.poolId, owner, config.lowerTick, config.upperTick, config.frozenUntil, expectedRemainingLiquidity) + s.validatePositionUpdate(ctx, config.poolId, owner, config.lowerTick, config.upperTick, defaultJoinTime, config.freezeDuration, expectedRemainingLiquidity) } // Check tick state. @@ -562,8 +573,11 @@ func mergeConfigs(dst *lpTest, overwrite *lpTest) { if overwrite.isNotFirstPositionWithSameAccount { dst.isNotFirstPositionWithSameAccount = overwrite.isNotFirstPositionWithSameAccount } - if !overwrite.frozenUntil.IsZero() { - dst.frozenUntil = overwrite.frozenUntil + if overwrite.freezeDuration != 0 { + dst.freezeDuration = overwrite.freezeDuration + } + if !overwrite.joinTime.IsZero() { + dst.joinTime = overwrite.joinTime } if !overwrite.expectedFeeGrowthOutsideLower.IsEqual(sdk.DecCoins{}) { dst.expectedFeeGrowthOutsideLower = overwrite.expectedFeeGrowthOutsideLower @@ -750,13 +764,15 @@ func (s *KeeperTestSuite) TestisInitialPositionForPool() { } func (s *KeeperTestSuite) TestUpdatePosition() { - defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + DefaultJoinTime := s.Ctx.BlockTime() + type updatePositionTest struct { poolId uint64 ownerIndex int lowerTick int64 upperTick int64 - frozenUntil time.Time + joinTime time.Time + freezeDuration time.Duration liquidityDelta sdk.Dec amount0Expected sdk.Int amount1Expected sdk.Int @@ -772,35 +788,39 @@ func (s *KeeperTestSuite) TestUpdatePosition() { ownerIndex: 0, lowerTick: DefaultLowerTick, upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil, + joinTime: DefaultJoinTime, + freezeDuration: DefaultFreezeDuration, liquidityDelta: DefaultLiquidityAmt, amount0Expected: DefaultAmt0Expected, amount1Expected: DefaultAmt1Expected, - expectedPositionLiquidity: DefaultLiquidityAmt.Add(DefaultLiquidityAmt), + expectedPositionLiquidity: DefaultLiquidityAmt, expectedTickLiquidity: DefaultLiquidityAmt.Add(DefaultLiquidityAmt), expectedPoolLiquidity: DefaultLiquidityAmt.Add(DefaultLiquidityAmt), expectedError: false, }, - "update existing position with negative amount (equal amount as liquidity provided)": { - poolId: 1, - ownerIndex: 0, - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil, - liquidityDelta: DefaultLiquidityAmt.Neg(), - amount0Expected: DefaultAmt0Expected.Neg(), - amount1Expected: DefaultAmt1Expected.Neg(), - expectedPositionLiquidity: sdk.ZeroDec(), - expectedTickLiquidity: sdk.ZeroDec(), - expectedPoolLiquidity: sdk.ZeroDec(), - expectedError: false, - }, + // ? Not sure if the test below make sense anymore cause we create new position at every update now + // "update existing position with negative amount (equal amount as liquidity provided)": { + // poolId: 1, + // ownerIndex: 0, + // lowerTick: DefaultLowerTick, + // upperTick: DefaultUpperTick, + // joinTime: DefaultJoinTime, + // freezeDuration: DefaultFreezeDuration, + // liquidityDelta: DefaultLiquidityAmt.Neg(), + // amount0Expected: DefaultAmt0Expected.Neg(), + // amount1Expected: DefaultAmt1Expected.Neg(), + // expectedPositionLiquidity: sdk.ZeroDec(), + // expectedTickLiquidity: sdk.ZeroDec(), + // expectedPoolLiquidity: sdk.ZeroDec(), + // expectedError: false, + // }, "error - update existing position with negative amount (more than liquidity provided)": { poolId: 1, ownerIndex: 0, lowerTick: DefaultLowerTick, upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil, + joinTime: DefaultJoinTime, + freezeDuration: DefaultFreezeDuration, liquidityDelta: DefaultLiquidityAmt.Neg().Mul(sdk.NewDec(2)), expectedError: true, }, @@ -809,7 +829,8 @@ func (s *KeeperTestSuite) TestUpdatePosition() { ownerIndex: 0, lowerTick: DefaultUpperTick + 1, upperTick: DefaultUpperTick + 100, - frozenUntil: defaultFrozenUntil, + joinTime: DefaultJoinTime, + freezeDuration: DefaultFreezeDuration, liquidityDelta: DefaultLiquidityAmt, expectedError: true, }, @@ -818,7 +839,8 @@ func (s *KeeperTestSuite) TestUpdatePosition() { ownerIndex: 0, lowerTick: DefaultLowerTick, upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil, + joinTime: DefaultJoinTime, + freezeDuration: DefaultFreezeDuration, liquidityDelta: DefaultLiquidityAmt, expectedError: true, }, @@ -827,7 +849,8 @@ func (s *KeeperTestSuite) TestUpdatePosition() { ownerIndex: 1, // using a different address makes this a new position lowerTick: DefaultLowerTick, upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil, + joinTime: DefaultJoinTime, + freezeDuration: DefaultFreezeDuration, liquidityDelta: DefaultLiquidityAmt, expectedError: true, }, @@ -850,7 +873,7 @@ func (s *KeeperTestSuite) TestUpdatePosition() { DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, - defaultFrozenUntil, + DefaultFreezeDuration, ) s.Require().NoError(err) @@ -862,7 +885,8 @@ func (s *KeeperTestSuite) TestUpdatePosition() { tc.lowerTick, tc.upperTick, tc.liquidityDelta, - tc.frozenUntil, + tc.joinTime, + tc.freezeDuration, ) if tc.expectedError { @@ -875,7 +899,7 @@ func (s *KeeperTestSuite) TestUpdatePosition() { s.Require().Equal(actualAmount1, tc.amount1Expected) // validate if position has been properly updated - s.validatePositionUpdate(s.Ctx, tc.poolId, s.TestAccs[tc.ownerIndex], tc.lowerTick, tc.upperTick, tc.frozenUntil, tc.expectedPositionLiquidity) + s.validatePositionUpdate(s.Ctx, tc.poolId, s.TestAccs[tc.ownerIndex], tc.lowerTick, tc.upperTick, tc.joinTime, tc.freezeDuration, tc.expectedPositionLiquidity) s.validateTickUpdates(s.Ctx, tc.poolId, s.TestAccs[tc.ownerIndex], tc.lowerTick, tc.upperTick, tc.expectedTickLiquidity, cl.EmptyCoins, cl.EmptyCoins) // validate if pool liquidity has been updated properly @@ -940,6 +964,7 @@ func (s *KeeperTestSuite) TestinitializeInitialPositionForPool() { } func (s *KeeperTestSuite) TestInverseRelation_CreatePosition_WithdrawPosition() { + defaultJoinTime := s.Ctx.BlockTime() tests := map[string]lpTest{} // add test cases for different positions @@ -951,7 +976,7 @@ func (s *KeeperTestSuite) TestInverseRelation_CreatePosition_WithdrawPosition() tc := tc s.Run(name, func() { s.SetupTest() - + s.Ctx = s.Ctx.WithBlockTime(defaultJoinTime) // Merge tc with baseCase and update tc to the merged result. This is done to reduce the amount of boilerplate in test cases. baseConfigCopy := *baseCase mergeConfigs(&baseConfigCopy, &tc) @@ -976,7 +1001,7 @@ func (s *KeeperTestSuite) TestInverseRelation_CreatePosition_WithdrawPosition() // If we want to test a non-first position, we create a first position with a separate account if tc.isNotFirstPosition { - s.SetupPosition(1, s.TestAccs[1], DefaultCoin0, DefaultCoin1, tc.lowerTick, tc.upperTick, tc.frozenUntil) + s.SetupPosition(1, s.TestAccs[1], DefaultCoin0, DefaultCoin1, tc.lowerTick, tc.upperTick, defaultJoinTime, tc.freezeDuration) } // Fund test account and create the desired position @@ -987,9 +1012,11 @@ func (s *KeeperTestSuite) TestInverseRelation_CreatePosition_WithdrawPosition() poolBalancePrePositionCreation := s.App.BankKeeper.GetAllBalances(s.Ctx, poolBefore.GetAddress()) // System under test. - amtDenom0CreatePosition, amtDenom1CreatePosition, liquidityCreated, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.amount0Desired, tc.amount1Desired, tc.amount0Minimum, tc.amount1Minimum, tc.lowerTick, tc.upperTick, tc.frozenUntil) + amtDenom0CreatePosition, amtDenom1CreatePosition, liquidityCreated, err := clKeeper.CreatePosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.amount0Desired, tc.amount1Desired, tc.amount0Minimum, tc.amount1Minimum, tc.lowerTick, tc.upperTick, tc.freezeDuration) s.Require().NoError(err) - amtDenom0WithdrawPosition, amtDenom1WithdrawPosition, err := clKeeper.WithdrawPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.frozenUntil, liquidityCreated) + + s.Ctx = s.Ctx.WithBlockTime(defaultJoinTime.Add(time.Hour * 24)) + amtDenom0WithdrawPosition, amtDenom1WithdrawPosition, err := clKeeper.WithdrawPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, defaultJoinTime, tc.freezeDuration, liquidityCreated) s.Require().NoError(err) // INVARIANTS @@ -1005,7 +1032,7 @@ func (s *KeeperTestSuite) TestInverseRelation_CreatePosition_WithdrawPosition() s.Require().Equal(poolBalancePrePositionCreation, poolBalancePostPositionCreation) // 3. Check that position was deleted - position, err := clKeeper.GetPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, tc.frozenUntil) + position, err := clKeeper.GetPosition(s.Ctx, tc.poolId, s.TestAccs[0], tc.lowerTick, tc.upperTick, defaultJoinTime, tc.freezeDuration) s.Require().Error(err) s.Require().ErrorAs(err, &types.PositionNotFoundError{PoolId: tc.poolId, LowerTick: tc.lowerTick, UpperTick: tc.upperTick}) s.Require().Nil(position) diff --git a/x/concentrated-liquidity/model/position.pb.go b/x/concentrated-liquidity/model/position.pb.go index 395273724ad..56505b09777 100644 --- a/x/concentrated-liquidity/model/position.pb.go +++ b/x/concentrated-liquidity/model/position.pb.go @@ -35,8 +35,9 @@ var _ = time.Kitchen const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type Position struct { - Liquidity github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=liquidity,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"liquidity" yaml:"liquidity"` - FrozenUntil time.Time `protobuf:"bytes,2,opt,name=frozen_until,json=frozenUntil,proto3,stdtime" json:"frozen_until" yaml:"frozen_until"` + Liquidity github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=liquidity,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"liquidity" yaml:"liquidity"` + JoinTime time.Time `protobuf:"bytes,2,opt,name=join_time,json=joinTime,proto3,stdtime" json:"join_time" yaml:"join_time"` + FreezeDuration time.Duration `protobuf:"bytes,3,opt,name=freeze_duration,json=freezeDuration,proto3,stdduration" json:"duration,omitempty" yaml:"freeze_duration"` } func (m *Position) Reset() { *m = Position{} } @@ -72,13 +73,20 @@ func (m *Position) XXX_DiscardUnknown() { var xxx_messageInfo_Position proto.InternalMessageInfo -func (m *Position) GetFrozenUntil() time.Time { +func (m *Position) GetJoinTime() time.Time { if m != nil { - return m.FrozenUntil + return m.JoinTime } return time.Time{} } +func (m *Position) GetFreezeDuration() time.Duration { + if m != nil { + return m.FreezeDuration + } + return 0 +} + func init() { proto.RegisterType((*Position)(nil), "osmosis.concentratedliquidity.v1beta1.Position") } @@ -88,28 +96,32 @@ func init() { } var fileDescriptor_ffdfd7b30d37d326 = []byte{ - // 329 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x91, 0xbf, 0x4e, 0xf3, 0x30, - 0x14, 0xc5, 0xe3, 0x6f, 0xf8, 0x44, 0x53, 0x06, 0x54, 0x18, 0x4a, 0x87, 0xb8, 0x8a, 0x04, 0xea, - 0x12, 0x5b, 0x05, 0xb1, 0x30, 0x46, 0x3c, 0x00, 0xaa, 0x60, 0x41, 0x88, 0x92, 0x3f, 0x6e, 0xb0, - 0x88, 0x73, 0x43, 0xed, 0x54, 0x94, 0xa7, 0xe8, 0x63, 0x75, 0x60, 0xe8, 0x88, 0x18, 0x02, 0x6a, - 0xdf, 0xa0, 0x4f, 0x80, 0x1a, 0xbb, 0x25, 0x0b, 0x53, 0x72, 0x8f, 0xce, 0x39, 0xf7, 0x67, 0xdb, - 0xf6, 0x40, 0x0a, 0x90, 0x5c, 0xd2, 0x08, 0xb2, 0x88, 0x65, 0x6a, 0x1c, 0x28, 0x16, 0x7b, 0x29, - 0x7f, 0x29, 0x78, 0xcc, 0xd5, 0x94, 0xe6, 0x20, 0xb9, 0xe2, 0x90, 0x91, 0x7c, 0x0c, 0x0a, 0x5a, - 0x27, 0xc6, 0x4e, 0xea, 0xf6, 0x9d, 0x9b, 0x4c, 0xfa, 0x21, 0x53, 0x41, 0xbf, 0x73, 0x1c, 0x55, - 0xbe, 0x61, 0x15, 0xa2, 0x7a, 0xd0, 0x0d, 0x1d, 0x9c, 0x00, 0x24, 0x29, 0xa3, 0xd5, 0x14, 0x16, - 0x23, 0xaa, 0xb8, 0x60, 0x52, 0x05, 0x22, 0x37, 0x86, 0xa3, 0x04, 0x12, 0xd0, 0xc1, 0xcd, 0x9f, - 0x56, 0xdd, 0x77, 0x64, 0xef, 0x5d, 0x1b, 0x96, 0xd6, 0xa3, 0xdd, 0xd8, 0xed, 0x6c, 0xa3, 0x2e, - 0xea, 0x35, 0x7c, 0x7f, 0x5e, 0x62, 0xeb, 0xb3, 0xc4, 0xa7, 0x09, 0x57, 0x4f, 0x45, 0x48, 0x22, - 0x10, 0x66, 0xaf, 0xf9, 0x78, 0x32, 0x7e, 0xa6, 0x6a, 0x9a, 0x33, 0x49, 0xae, 0x58, 0xb4, 0x2e, - 0xf1, 0xc1, 0x34, 0x10, 0xe9, 0xa5, 0xbb, 0x2b, 0x72, 0x07, 0xbf, 0xa5, 0xad, 0x07, 0x7b, 0x7f, - 0x34, 0x86, 0x37, 0x96, 0x0d, 0x8b, 0x4c, 0xf1, 0xb4, 0xfd, 0xaf, 0x8b, 0x7a, 0xcd, 0xb3, 0x0e, - 0xd1, 0xf0, 0x64, 0x0b, 0x4f, 0x6e, 0xb6, 0xf0, 0x3e, 0xde, 0x00, 0xac, 0x4b, 0x7c, 0xa8, 0x6b, - 0xeb, 0x69, 0x77, 0xf6, 0x85, 0xd1, 0xa0, 0xa9, 0xa5, 0xdb, 0x8d, 0xe2, 0xdf, 0xcf, 0x97, 0x0e, - 0x5a, 0x2c, 0x1d, 0xf4, 0xbd, 0x74, 0xd0, 0x6c, 0xe5, 0x58, 0x8b, 0x95, 0x63, 0x7d, 0xac, 0x1c, - 0xeb, 0xce, 0xaf, 0x1d, 0xc0, 0x5c, 0xb6, 0x97, 0x06, 0xa1, 0xdc, 0x0e, 0x74, 0xd2, 0xbf, 0xa0, - 0xaf, 0x7f, 0x3d, 0x97, 0x80, 0x98, 0xa5, 0xe1, 0xff, 0x8a, 0xef, 0xfc, 0x27, 0x00, 0x00, 0xff, - 0xff, 0x79, 0xd4, 0x99, 0x1d, 0xdd, 0x01, 0x00, 0x00, + // 388 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0x4d, 0x4b, 0xe3, 0x40, + 0x18, 0xc7, 0x93, 0x2e, 0x2c, 0x6d, 0x16, 0x76, 0x97, 0xb0, 0x2c, 0x6d, 0x90, 0xa4, 0x04, 0x94, + 0x1e, 0xcc, 0x0c, 0x55, 0x0f, 0xe2, 0x31, 0xf4, 0x03, 0x48, 0xd1, 0x8b, 0x08, 0x35, 0x2f, 0xd3, + 0x38, 0x9a, 0xc9, 0xc4, 0xcc, 0xa4, 0x18, 0xf1, 0x43, 0xf4, 0xe8, 0xd7, 0xf1, 0xd6, 0x63, 0x8f, + 0xe2, 0x21, 0x4a, 0x7b, 0xf3, 0xd8, 0x4f, 0x20, 0x79, 0x6d, 0xa9, 0x78, 0x4a, 0x9e, 0xe1, 0xff, + 0xfc, 0x9e, 0xdf, 0x0c, 0x8f, 0x64, 0x50, 0x46, 0x28, 0xc3, 0x0c, 0x3a, 0x34, 0x70, 0x50, 0xc0, + 0x23, 0x8b, 0x23, 0xd7, 0xf0, 0xf1, 0x5d, 0x8c, 0x5d, 0xcc, 0x13, 0x18, 0x52, 0x86, 0x39, 0xa6, + 0x01, 0x08, 0x23, 0xca, 0xa9, 0xbc, 0x5b, 0xc6, 0xc1, 0x66, 0xbc, 0x4e, 0x83, 0x49, 0xdf, 0x46, + 0xdc, 0xea, 0x2b, 0x1d, 0x27, 0xcf, 0x8d, 0xf2, 0x26, 0x58, 0x14, 0x05, 0x41, 0xd1, 0x3c, 0x4a, + 0x3d, 0x1f, 0xc1, 0xbc, 0xb2, 0xe3, 0x31, 0xe4, 0x98, 0x20, 0xc6, 0x2d, 0x12, 0x96, 0x01, 0x75, + 0x3b, 0xe0, 0xc6, 0x91, 0xb5, 0x56, 0x50, 0xfe, 0x79, 0xd4, 0xa3, 0x05, 0x38, 0xfb, 0x2b, 0x4e, + 0xf5, 0xe7, 0x86, 0xd4, 0x3c, 0x2d, 0x5d, 0xe5, 0x2b, 0xa9, 0x55, 0x3b, 0xb5, 0xc5, 0xae, 0xd8, + 0x6b, 0x99, 0xe6, 0x2c, 0xd5, 0x84, 0xd7, 0x54, 0xdb, 0xf3, 0x30, 0xbf, 0x8e, 0x6d, 0xe0, 0x50, + 0x52, 0x7a, 0x95, 0x1f, 0x83, 0xb9, 0xb7, 0x90, 0x27, 0x21, 0x62, 0x60, 0x80, 0x9c, 0x55, 0xaa, + 0xfd, 0x4d, 0x2c, 0xe2, 0x9f, 0xe8, 0x35, 0x48, 0x1f, 0xae, 0xa1, 0xf2, 0xb9, 0xd4, 0xba, 0xa1, + 0x38, 0x18, 0x65, 0xf2, 0xed, 0x46, 0x57, 0xec, 0xfd, 0x3a, 0x50, 0x40, 0x21, 0x0e, 0x2a, 0x71, + 0x70, 0x56, 0xdd, 0xcc, 0xdc, 0xc9, 0xa6, 0xaf, 0x99, 0x75, 0xab, 0x3e, 0x7d, 0xd3, 0xc4, 0x61, + 0x33, 0xab, 0xb3, 0xb0, 0xfc, 0x28, 0xfd, 0x19, 0x47, 0x08, 0x3d, 0xa0, 0x51, 0x75, 0xe9, 0xf6, + 0x8f, 0x1c, 0xde, 0xf9, 0x02, 0x1f, 0x94, 0x01, 0xf3, 0x38, 0x63, 0x7f, 0xa4, 0x9a, 0x5c, 0xb5, + 0xec, 0x53, 0x82, 0x39, 0x22, 0x21, 0x4f, 0x56, 0xa9, 0xf6, 0xbf, 0x98, 0xb8, 0x45, 0xd5, 0x9f, + 0xb2, 0xb9, 0xbf, 0x8b, 0xd3, 0x9a, 0x74, 0x39, 0x5b, 0xa8, 0xe2, 0x7c, 0xa1, 0x8a, 0xef, 0x0b, + 0x55, 0x9c, 0x2e, 0x55, 0x61, 0xbe, 0x54, 0x85, 0x97, 0xa5, 0x2a, 0x5c, 0x98, 0x1b, 0xaf, 0x56, + 0x6e, 0x80, 0xe1, 0x5b, 0x36, 0xab, 0x0a, 0x38, 0xe9, 0x1f, 0xc1, 0xfb, 0xef, 0x76, 0x88, 0x50, + 0x17, 0xf9, 0xf6, 0xcf, 0x5c, 0xfd, 0xf0, 0x33, 0x00, 0x00, 0xff, 0xff, 0x61, 0x25, 0x86, 0x64, + 0x72, 0x02, 0x00, 0x00, } func (m *Position) Marshal() (dAtA []byte, err error) { @@ -132,13 +144,21 @@ func (m *Position) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.FrozenUntil, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.FrozenUntil):]) + n1, err1 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.FreezeDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.FreezeDuration):]) if err1 != nil { return 0, err1 } i -= n1 i = encodeVarintPosition(dAtA, i, uint64(n1)) i-- + dAtA[i] = 0x1a + n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.JoinTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.JoinTime):]) + if err2 != nil { + return 0, err2 + } + i -= n2 + i = encodeVarintPosition(dAtA, i, uint64(n2)) + i-- dAtA[i] = 0x12 { size := m.Liquidity.Size() @@ -172,7 +192,9 @@ func (m *Position) Size() (n int) { _ = l l = m.Liquidity.Size() n += 1 + l + sovPosition(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.FrozenUntil) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.JoinTime) + n += 1 + l + sovPosition(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.FreezeDuration) n += 1 + l + sovPosition(uint64(l)) return n } @@ -248,7 +270,40 @@ func (m *Position) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrozenUntil", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field JoinTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPosition + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPosition + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPosition + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.JoinTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FreezeDuration", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -275,7 +330,7 @@ func (m *Position) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.FrozenUntil, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.FreezeDuration, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/concentrated-liquidity/msg_server.go b/x/concentrated-liquidity/msg_server.go index 61d61feb9e5..302a59bedbf 100644 --- a/x/concentrated-liquidity/msg_server.go +++ b/x/concentrated-liquidity/msg_server.go @@ -65,7 +65,7 @@ func (server msgServer) CreatePosition(goCtx context.Context, msg *types.MsgCrea return nil, err } - actualAmount0, actualAmount1, liquidityCreated, err := server.keeper.createPosition(ctx, msg.PoolId, sender, msg.TokenDesired0.Amount, msg.TokenDesired1.Amount, msg.TokenMinAmount0, msg.TokenMinAmount1, msg.LowerTick, msg.UpperTick, msg.FrozenUntil) + actualAmount0, actualAmount1, liquidityCreated, err := server.keeper.createPosition(ctx, msg.PoolId, sender, msg.TokenDesired0.Amount, msg.TokenDesired1.Amount, msg.TokenMinAmount0, msg.TokenMinAmount1, msg.LowerTick, msg.UpperTick, msg.FreezeDuration) if err != nil { return nil, err } @@ -101,7 +101,7 @@ func (server msgServer) WithdrawPosition(goCtx context.Context, msg *types.MsgWi return nil, err } - amount0, amount1, err := server.keeper.withdrawPosition(ctx, msg.PoolId, sender, msg.LowerTick, msg.UpperTick, msg.FrozenUntil, msg.LiquidityAmount) + amount0, amount1, err := server.keeper.withdrawPosition(ctx, msg.PoolId, sender, msg.LowerTick, msg.UpperTick, msg.JoinTime, msg.FreezeDuration, msg.LiquidityAmount) if err != nil { return nil, err } diff --git a/x/concentrated-liquidity/position.go b/x/concentrated-liquidity/position.go index 40a9ca4f9ab..4090accd37d 100644 --- a/x/concentrated-liquidity/position.go +++ b/x/concentrated-liquidity/position.go @@ -19,13 +19,14 @@ func (k Keeper) getOrInitPosition( poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, - frozenUntil time.Time, + joinTime time.Time, + freezeDuration time.Duration, ) (*model.Position, error) { if !k.poolExists(ctx, poolId) { return nil, types.PoolNotFoundError{PoolId: poolId} } - if k.hasFullPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) { - position, err := k.GetPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) + if k.hasFullPosition(ctx, poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) { + position, err := k.GetPosition(ctx, poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) if err != nil { return nil, err } @@ -44,9 +45,10 @@ func (k Keeper) initOrUpdatePosition( owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, - frozenUntil time.Time, + joinTime time.Time, + freezeDuration time.Duration, ) (err error) { - position, err := k.getOrInitPosition(ctx, poolId, owner, lowerTick, upperTick, frozenUntil) + position, err := k.getOrInitPosition(ctx, poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) if err != nil { return err } @@ -61,31 +63,31 @@ func (k Keeper) initOrUpdatePosition( } position.Liquidity = liquidityAfter - - position.FrozenUntil = frozenUntil + position.FreezeDuration = freezeDuration + position.JoinTime = joinTime // TODO: consider deleting position if liquidity becomes zero - err = k.initOrUpdatePositionUptime(ctx, poolId, position, owner, lowerTick, upperTick, liquidityDelta, frozenUntil) + err = k.initOrUpdatePositionUptime(ctx, poolId, position, owner, lowerTick, upperTick, liquidityDelta, joinTime, freezeDuration) if err != nil { return err } - k.setPosition(ctx, poolId, owner, lowerTick, upperTick, position, frozenUntil) + k.setPosition(ctx, poolId, owner, lowerTick, upperTick, position, joinTime, freezeDuration) return nil } -func (k Keeper) hasFullPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) bool { +func (k Keeper) hasFullPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, joinTime time.Time, freezeDuration time.Duration) bool { store := ctx.KVStore(k.storeKey) - key := types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil) + key := types.KeyFullPosition(poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) return store.Has(key) } -// GetPosition checks if a position exists at the provided upper and lower ticks and frozenUntil time for the given owner. Returns position if found. -func (k Keeper) GetPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) (*model.Position, error) { +// GetPosition checks if a position exists at the provided upper and lower ticks and freezeDuration time for the given owner. Returns position if found. +func (k Keeper) GetPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, joinTime time.Time, freezeDuration time.Duration) (*model.Position, error) { store := ctx.KVStore(k.storeKey) positionStruct := &model.Position{} - key := types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil) + key := types.KeyFullPosition(poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) found, err := osmoutils.Get(store, key, positionStruct) if err != nil { @@ -93,7 +95,7 @@ func (k Keeper) GetPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress } if !found { - return nil, types.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick, FrozenUntil: frozenUntil} + return nil, types.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick, JoinTime: joinTime, FreezeDuration: freezeDuration} } return positionStruct, nil @@ -111,10 +113,11 @@ func (k Keeper) setPosition(ctx sdk.Context, owner sdk.AccAddress, lowerTick, upperTick int64, position *model.Position, - frozenUntil time.Time, + joinTime time.Time, + freezeDuration time.Duration, ) { store := ctx.KVStore(k.storeKey) - key := types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil) + key := types.KeyFullPosition(poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) osmoutils.MustSet(store, key, position) } @@ -122,13 +125,14 @@ func (k Keeper) deletePosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, - frozenUntil time.Time, + joinTime time.Time, + freezeDuration time.Duration, ) error { store := ctx.KVStore(k.storeKey) - key := types.KeyFullPosition(poolId, owner, lowerTick, upperTick, frozenUntil) + key := types.KeyFullPosition(poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) if !store.Has(key) { - return types.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick, FrozenUntil: frozenUntil} + return types.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick, JoinTime: joinTime, FreezeDuration: freezeDuration} } store.Delete(key) @@ -137,12 +141,12 @@ func (k Keeper) deletePosition(ctx sdk.Context, // CreateFullRangePosition creates a full range (min to max tick) concentrated liquidity position for the given pool ID, owner, coins, and frozen until time. // The function returns the amounts of token 0 and token 1, and the liquidity created from the position. -func (k Keeper) CreateFullRangePosition(ctx sdk.Context, concentratedPool types.ConcentratedPoolExtension, owner sdk.AccAddress, coins sdk.Coins, frozenUntil time.Time) (amount0, amount1 sdk.Int, liquidity sdk.Dec, err error) { +func (k Keeper) CreateFullRangePosition(ctx sdk.Context, concentratedPool types.ConcentratedPoolExtension, owner sdk.AccAddress, coins sdk.Coins, freezeDuration time.Duration) (amount0, amount1 sdk.Int, liquidity sdk.Dec, err error) { // Determine the max and min ticks for the concentrated pool we are migrating to. minTick, maxTick := GetMinAndMaxTicksFromExponentAtPriceOne(concentratedPool.GetPrecisionFactorAtPriceOne()) // Create a full range (min to max tick) concentrated liquidity position. - amount0, amount1, liquidity, err = k.createPosition(ctx, concentratedPool.GetId(), owner, coins.AmountOf(concentratedPool.GetToken0()), coins.AmountOf(concentratedPool.GetToken1()), sdk.ZeroInt(), sdk.ZeroInt(), minTick, maxTick, frozenUntil) + amount0, amount1, liquidity, err = k.createPosition(ctx, concentratedPool.GetId(), owner, coins.AmountOf(concentratedPool.GetToken0()), coins.AmountOf(concentratedPool.GetToken1()), sdk.ZeroInt(), sdk.ZeroInt(), minTick, maxTick, freezeDuration) if err != nil { return sdk.Int{}, sdk.Int{}, sdk.Dec{}, err } diff --git a/x/concentrated-liquidity/position_test.go b/x/concentrated-liquidity/position_test.go index 284994962a5..37fada470c0 100644 --- a/x/concentrated-liquidity/position_test.go +++ b/x/concentrated-liquidity/position_test.go @@ -1,6 +1,7 @@ package concentrated_liquidity_test import ( + "fmt" "time" sdk "github.com/cosmos/cosmos-sdk/types" @@ -13,10 +14,10 @@ import ( func (s *KeeperTestSuite) TestInitOrUpdatePosition() { const ( - validPoolId = 1 + validPoolId = 1 invalidPoolId = 2 ) - defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + defaultJoinTime := s.Ctx.BlockTime() defaultIncentiveRecords := []types.IncentiveRecord{incentiveRecordOne, incentiveRecordTwo, incentiveRecordThree, incentiveRecordFour} supportedUptimes := types.SupportedUptimes emptyAccumValues := getExpectedUptimes().emptyExpectedAccumValues @@ -24,19 +25,20 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { poolId uint64 lowerTick int64 upperTick int64 - frozenUntil time.Time + joinTime time.Time + freezeDuration time.Duration liquidityDelta sdk.Dec liquidityIn sdk.Dec } tests := []struct { - name string - param param - positionExists bool + name string + param param + positionExists bool timeElapsedSinceInit time.Duration - incentiveRecords []types.IncentiveRecord - expectedLiquidity sdk.Dec - expectedErr error + incentiveRecords []types.IncentiveRecord + expectedLiquidity sdk.Dec + expectedErr error }{ { name: "Init position from -50 to 50 with DefaultLiquidityAmt liquidity and no freeze duration", @@ -45,11 +47,12 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { lowerTick: -50, upperTick: 50, liquidityDelta: DefaultLiquidityAmt, + joinTime: defaultJoinTime, }, timeElapsedSinceInit: time.Hour, - incentiveRecords: defaultIncentiveRecords, - positionExists: false, - expectedLiquidity: DefaultLiquidityAmt, + incentiveRecords: defaultIncentiveRecords, + positionExists: false, + expectedLiquidity: DefaultLiquidityAmt, }, { name: "Update position from -50 to 50 that already contains DefaultLiquidityAmt liquidity with DefaultLiquidityAmt more liquidity", @@ -58,6 +61,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { lowerTick: -50, upperTick: 50, liquidityDelta: DefaultLiquidityAmt, + joinTime: defaultJoinTime, }, positionExists: true, expectedLiquidity: DefaultLiquidityAmt.Add(DefaultLiquidityAmt), @@ -68,11 +72,13 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { poolId: validPoolId, lowerTick: -50, upperTick: 50, - frozenUntil: defaultFrozenUntil, liquidityDelta: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: DefaultFreezeDuration, }, - timeElapsedSinceInit: time.Hour, - incentiveRecords: defaultIncentiveRecords, + // we dont need the timeElapsedSinceInit because we are tracking joinTime at createPosition() + //timeElapsedSinceInit: time.Hour, + incentiveRecords: defaultIncentiveRecords, positionExists: true, expectedLiquidity: DefaultLiquidityAmt.Add(DefaultLiquidityAmt), }, @@ -83,6 +89,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { lowerTick: -50, upperTick: 50, liquidityDelta: DefaultLiquidityAmt, + joinTime: defaultJoinTime, }, positionExists: false, expectedErr: types.PoolNotFoundError{PoolId: 2}, @@ -94,6 +101,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { lowerTick: -50, upperTick: 50, liquidityDelta: DefaultLiquidityAmt.Neg(), + joinTime: defaultJoinTime, }, positionExists: false, expectedErr: types.NegativeLiquidityError{Liquidity: DefaultLiquidityAmt.Neg()}, @@ -106,7 +114,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { s.Setup() // Set blocktime to fixed UTC value for consistency - s.Ctx = s.Ctx.WithBlockTime(time.Unix(1, 1).UTC()) + s.Ctx = s.Ctx.WithBlockTime(defaultJoinTime) // Create a default CL pool clPool := s.PrepareConcentratedPool() @@ -131,9 +139,9 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { if test.positionExists { // We let some fixed amount of time to elapse so we can ensure LastLiquidityUpdate time is // tracked properly even with no liquidity. - s.Ctx = s.Ctx.WithBlockTime(s.Ctx.BlockTime().Add(time.Minute * 5)) + s.Ctx = s.Ctx.WithBlockTime(defaultJoinTime.Add(time.Minute * 5)) - err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, test.param.poolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.liquidityDelta, test.param.frozenUntil) + err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, test.param.poolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.liquidityDelta, test.param.joinTime, test.param.freezeDuration) s.Require().NoError(err) preexistingLiquidity = test.param.liquidityDelta @@ -150,11 +158,10 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { // Move up blocktime by time we want to elapse // We keep track of init blocktime to test error cases - initBlockTime := s.Ctx.BlockTime() s.Ctx = s.Ctx.WithBlockTime(s.Ctx.BlockTime().Add(test.timeElapsedSinceInit)) // Get the position info for poolId 1 - positionInfo, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, validPoolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.frozenUntil) + positionInfo, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, validPoolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.joinTime, test.param.freezeDuration) if test.positionExists { // If we had a position before, ensure the position info displays proper liquidity s.Require().NoError(err) @@ -162,11 +169,11 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { } else { // If we did not have a position before, ensure getting the non-existent position returns an error s.Require().Error(err) - s.Require().ErrorContains(err, types.PositionNotFoundError{PoolId: validPoolId, LowerTick: test.param.lowerTick, UpperTick: test.param.upperTick}.Error()) + s.Require().ErrorContains(err, types.PositionNotFoundError{PoolId: validPoolId, LowerTick: test.param.lowerTick, UpperTick: test.param.upperTick, JoinTime: test.param.joinTime, FreezeDuration: test.param.freezeDuration}.Error()) } // System under test. Initialize or update the position according to the test case - err = s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, test.param.poolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.liquidityDelta, test.param.frozenUntil) + err = s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, test.param.poolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.liquidityDelta, test.param.joinTime, test.param.freezeDuration) if test.expectedErr != nil { s.Require().Error(err) s.Require().ErrorContains(err, test.expectedErr.Error()) @@ -184,15 +191,15 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { // LastLiquidityUpdate should not have moved up since init upon error clPool, err = s.App.ConcentratedLiquidityKeeper.GetPoolById(s.Ctx, clPool.GetId()) s.Require().NoError(err) - s.Require().Equal(initBlockTime, clPool.GetLastLiquidityUpdate()) + s.Require().Equal(defaultJoinTime, clPool.GetLastLiquidityUpdate()) return } s.Require().NoError(err) // Get the tick info for poolId 1 - positionInfo, err = s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, validPoolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.frozenUntil) + positionInfo, err = s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, validPoolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.joinTime, test.param.freezeDuration) s.Require().NoError(err) - + fmt.Println(positionInfo) // Check that the initialized or updated position matches our expectation s.Require().Equal(test.expectedLiquidity, positionInfo.Liquidity) @@ -208,9 +215,9 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { // Setup for checks actualUptimeAccumDelta, expectedUptimeAccumValueGrowth, expectedIncentiveRecords, expectedGrowthCurAccum := emptyAccumValues, emptyAccumValues, test.incentiveRecords, sdk.DecCoins{} - freezePeriod := test.param.frozenUntil.Sub(s.Ctx.BlockTime()) + timeElapsedSec := sdk.NewDec(int64(test.timeElapsedSinceInit)).Quo(sdk.NewDec(10e8)) - positionName := string(types.KeyFullPosition(validPoolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.frozenUntil)) + positionName := string(types.KeyFullPosition(validPoolId, s.TestAccs[0], test.param.lowerTick, test.param.upperTick, test.param.joinTime, test.param.freezeDuration)) // Loop through each supported uptime for pool and ensure that: // 1. Position is properly updated on it @@ -222,7 +229,7 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { // If frozen for more than a specific uptime's period, the record should exist recordExists, err := newUptimeAccums[uptimeIndex].HasPosition(positionName) s.Require().NoError(err) - if freezePeriod >= uptime { + if test.param.freezeDuration >= uptime { s.Require().True(recordExists) // Ensure position's record has correct values @@ -265,14 +272,16 @@ func (s *KeeperTestSuite) TestInitOrUpdatePosition() { } func (s *KeeperTestSuite) TestGetPosition() { - defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + DefaultJoinTime := s.Ctx.BlockTime() + tests := []struct { name string poolToGet uint64 ownerIndex uint64 lowerTick int64 upperTick int64 - frozenUntil time.Time + joinTime time.Time + freezeDuration time.Duration expectedPosition *model.Position expectedErr error }{ @@ -281,42 +290,47 @@ func (s *KeeperTestSuite) TestGetPosition() { poolToGet: validPoolId, lowerTick: DefaultLowerTick, upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil, - expectedPosition: &model.Position{Liquidity: DefaultLiquidityAmt, FrozenUntil: defaultFrozenUntil}, + joinTime: DefaultJoinTime, + freezeDuration: DefaultFreezeDuration, + expectedPosition: &model.Position{Liquidity: DefaultLiquidityAmt, JoinTime: DefaultJoinTime, FreezeDuration: DefaultFreezeDuration}, }, { - name: "Get position info on existing pool and existing position but wrong owner", - poolToGet: validPoolId, - ownerIndex: 1, - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil, - expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick, FrozenUntil: defaultFrozenUntil}, + name: "Get position info on existing pool and existing position but wrong owner", + poolToGet: validPoolId, + ownerIndex: 1, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick, + joinTime: DefaultJoinTime, + freezeDuration: DefaultFreezeDuration, + expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick, JoinTime: DefaultJoinTime, FreezeDuration: DefaultFreezeDuration}, }, { - name: "Get position info on existing pool and existing position but wrong frozenUntil time", - poolToGet: validPoolId, - ownerIndex: 1, - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil.Add(time.Second), - expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick, FrozenUntil: defaultFrozenUntil.Add(time.Second)}, + name: "Get position info on existing pool and existing position but wrong freeze duration", + poolToGet: validPoolId, + ownerIndex: 1, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick, + joinTime: DefaultJoinTime, + freezeDuration: DefaultFreezeDuration + time.Second, + expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick, JoinTime: DefaultJoinTime, FreezeDuration: DefaultFreezeDuration + time.Second}, }, { - name: "Get position info on existing pool with no existing position", - poolToGet: validPoolId, - lowerTick: DefaultLowerTick - 1, - upperTick: DefaultUpperTick + 1, - frozenUntil: defaultFrozenUntil, - expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1, FrozenUntil: defaultFrozenUntil}, + name: "Get position info on existing pool with no existing position", + poolToGet: validPoolId, + lowerTick: DefaultLowerTick - 1, + upperTick: DefaultUpperTick + 1, + joinTime: DefaultJoinTime, + freezeDuration: DefaultFreezeDuration, + expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1, JoinTime: DefaultJoinTime, FreezeDuration: DefaultFreezeDuration}, }, { - name: "Get position info on a non-existing pool with no existing position", - poolToGet: 2, - lowerTick: DefaultLowerTick - 1, - upperTick: DefaultUpperTick + 1, - frozenUntil: defaultFrozenUntil, - expectedErr: types.PositionNotFoundError{PoolId: 2, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1, FrozenUntil: defaultFrozenUntil}, + name: "Get position info on a non-existing pool with no existing position", + poolToGet: 2, + lowerTick: DefaultLowerTick - 1, + upperTick: DefaultUpperTick + 1, + joinTime: DefaultJoinTime, + freezeDuration: DefaultFreezeDuration, + expectedErr: types.PositionNotFoundError{PoolId: 2, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1, JoinTime: DefaultJoinTime, FreezeDuration: DefaultFreezeDuration}, }, } @@ -324,15 +338,15 @@ func (s *KeeperTestSuite) TestGetPosition() { s.Run(test.name, func() { // Init suite for each test. s.Setup() - + s.Ctx = s.Ctx.WithBlockTime(DefaultJoinTime) // Create a default CL pool s.PrepareConcentratedPool() // Set up a default initialized position - err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, validPoolId, s.TestAccs[0], DefaultLowerTick, DefaultUpperTick, DefaultLiquidityAmt, defaultFrozenUntil) + err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, validPoolId, s.TestAccs[0], DefaultLowerTick, DefaultUpperTick, DefaultLiquidityAmt, DefaultJoinTime, DefaultFreezeDuration) // System under test - position, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, test.poolToGet, s.TestAccs[test.ownerIndex], test.lowerTick, test.upperTick, test.frozenUntil) + position, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, test.poolToGet, s.TestAccs[test.ownerIndex], test.lowerTick, test.upperTick, test.joinTime, test.freezeDuration) if test.expectedErr != nil { s.Require().Error(err) s.Require().ErrorIs(err, test.expectedErr) @@ -348,14 +362,16 @@ func (s *KeeperTestSuite) TestGetPosition() { func (s *KeeperTestSuite) TestGetAllUserPositions() { defaultAddress := s.TestAccs[0] secondAddress := s.TestAccs[1] - + defaultJoinTime := s.Ctx.BlockTime() type position struct { - poolId uint64 - acc sdk.AccAddress - coin0 sdk.Coin - coin1 sdk.Coin - lowerTick int64 - upperTick int64 + poolId uint64 + acc sdk.AccAddress + coin0 sdk.Coin + coin1 sdk.Coin + lowerTick int64 + upperTick int64 + joinTime time.Time + freezeDuration time.Duration } tests := []struct { @@ -368,25 +384,25 @@ func (s *KeeperTestSuite) TestGetAllUserPositions() { name: "Get current user one position", sender: defaultAddress, setupPositions: []position{ - {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultJoinTime, DefaultFreezeDuration}, }, }, { name: "Get current users multiple position same pool", sender: defaultAddress, setupPositions: []position{ - {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick}, - {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick + 1, DefaultUpperTick + 1}, - {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick + 2, DefaultUpperTick + 2}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultJoinTime, DefaultFreezeDuration}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick + 1, DefaultUpperTick + 1, defaultJoinTime, DefaultFreezeDuration}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick + 2, DefaultUpperTick + 2, defaultJoinTime, DefaultFreezeDuration}, }, }, { name: "Get current users multiple position multiple pools", sender: secondAddress, setupPositions: []position{ - {1, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick}, - {2, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick + 1, DefaultUpperTick + 1}, - {3, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick + 2, DefaultUpperTick + 2}, + {1, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultJoinTime, DefaultFreezeDuration}, + {2, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick + 1, DefaultUpperTick + 1, defaultJoinTime, DefaultFreezeDuration}, + {3, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick + 2, DefaultUpperTick + 2, defaultJoinTime, DefaultFreezeDuration}, }, }, } @@ -395,6 +411,7 @@ func (s *KeeperTestSuite) TestGetAllUserPositions() { s.Run(test.name, func() { // Init suite for each test. s.Setup() + s.Ctx = s.Ctx.WithBlockTime(defaultJoinTime) // Create a default CL pools s.PrepareMultipleConcentratedPools(3) @@ -402,14 +419,15 @@ func (s *KeeperTestSuite) TestGetAllUserPositions() { expectedUserPositions := []types.FullPositionByOwnerResult{} for _, pos := range test.setupPositions { // if position does not exist this errors - position := s.SetupPosition(pos.poolId, pos.acc, pos.coin0, pos.coin1, pos.lowerTick, pos.upperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) + position := s.SetupPosition(pos.poolId, pos.acc, pos.coin0, pos.coin1, pos.lowerTick, pos.upperTick, pos.joinTime, pos.freezeDuration) if pos.acc.Equals(pos.acc) { expectedUserPositions = append(expectedUserPositions, types.FullPositionByOwnerResult{ - PoolId: pos.poolId, - LowerTick: pos.lowerTick, - UpperTick: pos.upperTick, - FrozenUntil: s.Ctx.BlockTime().Add(DefaultFreezeDuration), - Liquidity: position.Liquidity, + PoolId: pos.poolId, + LowerTick: pos.lowerTick, + UpperTick: pos.upperTick, + JoinTime: pos.joinTime, + FreezeDuration: pos.freezeDuration, + Liquidity: position.Liquidity, }) } } @@ -429,55 +447,61 @@ func (s *KeeperTestSuite) TestGetAllUserPositions() { } func (s *KeeperTestSuite) TestDeletePosition() { - defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) + DefaultJoinTime := s.Ctx.BlockTime() tests := []struct { - name string - poolToGet uint64 - ownerIndex uint64 - lowerTick int64 - upperTick int64 - frozenUntil time.Time - expectedErr error + name string + poolToGet uint64 + ownerIndex uint64 + lowerTick int64 + upperTick int64 + joinTime time.Time + freezeDuration time.Duration + expectedErr error }{ { - name: "Delete position info on existing pool and existing position", - poolToGet: validPoolId, - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil, + name: "Delete position info on existing pool and existing position", + poolToGet: validPoolId, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick, + joinTime: DefaultJoinTime, + freezeDuration: DefaultFreezeDuration, }, { - name: "Delete position on existing pool and existing position but wrong owner", - poolToGet: validPoolId, - ownerIndex: 1, - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil, - expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick, FrozenUntil: defaultFrozenUntil}, + name: "Delete position on existing pool and existing position but wrong owner", + poolToGet: validPoolId, + ownerIndex: 1, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick, + joinTime: DefaultJoinTime, + freezeDuration: DefaultFreezeDuration, + expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick, JoinTime: DefaultJoinTime, FreezeDuration: DefaultFreezeDuration}, }, { - name: "Delete position on existing pool and existing position but wrong frozenUntil time", - poolToGet: validPoolId, - lowerTick: DefaultLowerTick, - upperTick: DefaultUpperTick, - frozenUntil: defaultFrozenUntil.Add(time.Second), - expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick, FrozenUntil: defaultFrozenUntil.Add(time.Second)}, + name: "Delete position on existing pool and existing position but wrong freeze duration", + poolToGet: validPoolId, + lowerTick: DefaultLowerTick, + upperTick: DefaultUpperTick, + joinTime: DefaultJoinTime, + freezeDuration: DefaultFreezeDuration + time.Second, + expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick, UpperTick: DefaultUpperTick, JoinTime: DefaultJoinTime, FreezeDuration: DefaultFreezeDuration + time.Second}, }, { - name: "Delete position on existing pool with no existing position", - poolToGet: validPoolId, - lowerTick: DefaultLowerTick - 1, - upperTick: DefaultUpperTick + 1, - frozenUntil: defaultFrozenUntil, - expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1, FrozenUntil: defaultFrozenUntil}, + name: "Delete position on existing pool with no existing position", + poolToGet: validPoolId, + lowerTick: DefaultLowerTick - 1, + upperTick: DefaultUpperTick + 1, + joinTime: DefaultJoinTime, + freezeDuration: DefaultFreezeDuration, + expectedErr: types.PositionNotFoundError{PoolId: validPoolId, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1, JoinTime: DefaultJoinTime, FreezeDuration: DefaultFreezeDuration}, }, { - name: "Delete position on a non-existing pool with no existing position", - poolToGet: 2, - lowerTick: DefaultLowerTick - 1, - upperTick: DefaultUpperTick + 1, - frozenUntil: defaultFrozenUntil, - expectedErr: types.PositionNotFoundError{PoolId: 2, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1, FrozenUntil: defaultFrozenUntil}, + name: "Delete position on a non-existing pool with no existing position", + poolToGet: 2, + lowerTick: DefaultLowerTick - 1, + upperTick: DefaultUpperTick + 1, + joinTime: DefaultJoinTime, + freezeDuration: DefaultFreezeDuration, + expectedErr: types.PositionNotFoundError{PoolId: 2, LowerTick: DefaultLowerTick - 1, UpperTick: DefaultUpperTick + 1, JoinTime: DefaultJoinTime, FreezeDuration: DefaultFreezeDuration}, }, } @@ -490,10 +514,10 @@ func (s *KeeperTestSuite) TestDeletePosition() { s.PrepareConcentratedPool() // Set up a default initialized position - err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, validPoolId, s.TestAccs[0], DefaultLowerTick, DefaultUpperTick, DefaultLiquidityAmt, defaultFrozenUntil) + err := s.App.ConcentratedLiquidityKeeper.InitOrUpdatePosition(s.Ctx, validPoolId, s.TestAccs[0], DefaultLowerTick, DefaultUpperTick, DefaultLiquidityAmt, DefaultJoinTime, DefaultFreezeDuration) s.Require().NoError(err) - err = s.App.ConcentratedLiquidityKeeper.DeletePosition(s.Ctx, test.poolToGet, s.TestAccs[test.ownerIndex], test.lowerTick, test.upperTick, test.frozenUntil) + err = s.App.ConcentratedLiquidityKeeper.DeletePosition(s.Ctx, test.poolToGet, s.TestAccs[test.ownerIndex], test.lowerTick, test.upperTick, test.joinTime, test.freezeDuration) if test.expectedErr != nil { s.Require().Error(err) s.Require().ErrorIs(err, test.expectedErr) @@ -501,9 +525,9 @@ func (s *KeeperTestSuite) TestDeletePosition() { s.Require().NoError(err) // Since the position is deleted, retrieving it should return an error. - position, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, test.poolToGet, s.TestAccs[test.ownerIndex], test.lowerTick, test.upperTick, test.frozenUntil) + position, err := s.App.ConcentratedLiquidityKeeper.GetPosition(s.Ctx, test.poolToGet, s.TestAccs[test.ownerIndex], test.lowerTick, test.upperTick, test.joinTime, test.freezeDuration) s.Require().Error(err) - s.Require().ErrorIs(err, types.PositionNotFoundError{PoolId: test.poolToGet, LowerTick: test.lowerTick, UpperTick: test.upperTick, FrozenUntil: test.frozenUntil}) + s.Require().ErrorIs(err, types.PositionNotFoundError{PoolId: test.poolToGet, LowerTick: test.lowerTick, UpperTick: test.upperTick, JoinTime: test.joinTime, FreezeDuration: test.freezeDuration}) s.Require().Nil(position) } }) diff --git a/x/concentrated-liquidity/simulation/sim_msgs.go b/x/concentrated-liquidity/simulation/sim_msgs.go index e06dc50bea3..d02ac76a0f0 100644 --- a/x/concentrated-liquidity/simulation/sim_msgs.go +++ b/x/concentrated-liquidity/simulation/sim_msgs.go @@ -3,6 +3,7 @@ package simulation import ( "errors" "fmt" + "time" sdk "github.com/cosmos/cosmos-sdk/types" @@ -99,6 +100,7 @@ func RandMsgCreatePosition(k clkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk. // TODO: Randomize TokenMinAmount0 and TokenMinAmount1 in next iteration TokenMinAmount0: sdk.NewInt(0), TokenMinAmount1: sdk.NewInt(0), + FreezeDuration: time.Hour * 24, }, nil } @@ -128,6 +130,11 @@ func RandMsgWithdrawPosition(k clkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sd // pick a random position randPosition := positions[rand.Intn(len(positions))] + // check if the position is still frozen + if randPosition.JoinTime.Add(randPosition.FreezeDuration).After(ctx.BlockTime()) { + return nil, fmt.Errorf("position is still frozen") + } + // get percentage amount from 1 to 100 to withdraw liquidity randPerc := sim.RandomDecAmount(sdk.OneDec()) @@ -139,6 +146,8 @@ func RandMsgWithdrawPosition(k clkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sd LowerTick: randPosition.LowerTick, UpperTick: randPosition.UpperTick, LiquidityAmount: withdrawAmountInt, + JoinTime: randPosition.JoinTime, + FreezeDuration: randPosition.FreezeDuration, }, nil } diff --git a/x/concentrated-liquidity/store.go b/x/concentrated-liquidity/store.go index 1cf5182742f..ec0645434d0 100644 --- a/x/concentrated-liquidity/store.go +++ b/x/concentrated-liquidity/store.go @@ -33,7 +33,7 @@ func ParsePositionFromBz(bz []byte) (position model.Position, err error) { } // ParseFullPositionFromBytes parses a full position from key and value bytes. -// Returns a struct containing the pool id, lower tick, upper tick, frozen until, and liquidity +// Returns a struct containing the pool id, lower tick, upper tick, join time, freeze duration, and liquidity // associated with the position. // Returns an error if the key or value is not found. // Returns an error if fails to parse either. @@ -52,8 +52,8 @@ func ParseFullPositionFromBytes(key, value []byte) (types.FullPositionByOwnerRes fullPositionKeyComponents := strings.Split(keyStr, types.KeySeparator) if len(fullPositionKeyComponents) < 6 { - return types.FullPositionByOwnerResult{}, fmt.Errorf(`invalid position key (%s), must have at least 5 components: - (position prefix, owner address, pool id, lower tick, upper tick, frozen until), + return types.FullPositionByOwnerResult{}, fmt.Errorf(`invalid position key (%s), must have at least 6 components: + (position prefix, owner address, pool id, lower tick, upper tick, join time, freeze duration), all separated by (%s)`, keyStr, types.KeySeparator) } @@ -61,8 +61,9 @@ func ParseFullPositionFromBytes(key, value []byte) (types.FullPositionByOwnerRes // - pool id // - lower tick // - upper tick - // - frozen until - relevantPositionKeyComponents := fullPositionKeyComponents[len(fullPositionKeyComponents)-4:] + // - join time + // - freeze duration + relevantPositionKeyComponents := fullPositionKeyComponents[len(fullPositionKeyComponents)-5:] positionPrefix := fullPositionKeyComponents[0] if positionPrefix != string(types.PositionPrefix) { @@ -84,7 +85,12 @@ func ParseFullPositionFromBytes(key, value []byte) (types.FullPositionByOwnerRes return types.FullPositionByOwnerResult{}, err } - frozenUntil, err := osmoutils.ParseTimeString(relevantPositionKeyComponents[3]) + joinTime, err := osmoutils.ParseTimeString(relevantPositionKeyComponents[3]) + if err != nil { + return types.FullPositionByOwnerResult{}, err + } + + freezeDuration, err := time.ParseDuration(relevantPositionKeyComponents[4]) if err != nil { return types.FullPositionByOwnerResult{}, err } @@ -95,11 +101,12 @@ func ParseFullPositionFromBytes(key, value []byte) (types.FullPositionByOwnerRes } return types.FullPositionByOwnerResult{ - PoolId: poolId, - LowerTick: lowerTick, - UpperTick: upperTick, - FrozenUntil: frozenUntil, - Liquidity: positionValue.Liquidity, + PoolId: poolId, + LowerTick: lowerTick, + UpperTick: upperTick, + JoinTime: joinTime, + FreezeDuration: freezeDuration, + Liquidity: positionValue.Liquidity, }, nil } diff --git a/x/concentrated-liquidity/store_test.go b/x/concentrated-liquidity/store_test.go index 5fbf6e8d64c..ec046e7ac97 100644 --- a/x/concentrated-liquidity/store_test.go +++ b/x/concentrated-liquidity/store_test.go @@ -14,17 +14,19 @@ import ( ) func (s *KeeperTestSuite) TestGetAllPositionsWithVaryingFreezeTimes() { - defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) defaultAddress := s.TestAccs[0] secondAddress := s.TestAccs[1] + defaultJoinTime := s.Ctx.BlockTime() + type position struct { - poolId uint64 - acc sdk.AccAddress - coin0 sdk.Coin - coin1 sdk.Coin - lowerTick int64 - upperTick int64 - frozenUntil time.Time + poolId uint64 + acc sdk.AccAddress + coin0 sdk.Coin + coin1 sdk.Coin + lowerTick int64 + upperTick int64 + joinTime time.Time + freezeDuration time.Duration } tests := map[string]struct { @@ -35,24 +37,24 @@ func (s *KeeperTestSuite) TestGetAllPositionsWithVaryingFreezeTimes() { }, "one position": { setupPositions: []position{ - {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultJoinTime, DefaultFreezeDuration}, }, }, "multiple positions": { setupPositions: []position{ - {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour)}, - {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 2)}, - {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 3)}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultJoinTime, DefaultFreezeDuration + time.Hour}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultJoinTime, DefaultFreezeDuration + time.Hour*2}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultJoinTime, DefaultFreezeDuration + time.Hour*3}, }, }, "multiple positions, some different owner": { setupPositions: []position{ - {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour)}, - {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 2)}, - {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 3)}, - {1, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour)}, - {1, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 2)}, - {1, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil.Add(time.Hour * 3)}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultJoinTime, DefaultFreezeDuration + time.Hour}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultJoinTime, DefaultFreezeDuration + time.Hour*2}, + {1, defaultAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultJoinTime, DefaultFreezeDuration + time.Hour*3}, + {1, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultJoinTime, DefaultFreezeDuration + time.Hour}, + {1, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultJoinTime, DefaultFreezeDuration + time.Hour*2}, + {1, secondAddress, DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, defaultJoinTime, DefaultFreezeDuration + time.Hour*3}, }, }, } @@ -60,11 +62,12 @@ func (s *KeeperTestSuite) TestGetAllPositionsWithVaryingFreezeTimes() { s.Run(name, func() { // Setup. s.SetupTest() + s.Ctx = s.Ctx.WithBlockTime(defaultJoinTime) ctx := s.Ctx s.PrepareConcentratedPool() expectedPositions := []model.Position{} for _, pos := range tc.setupPositions { - position := s.SetupPosition(pos.poolId, pos.acc, pos.coin0, pos.coin1, pos.lowerTick, pos.upperTick, pos.frozenUntil) + position := s.SetupPosition(pos.poolId, pos.acc, pos.coin0, pos.coin1, pos.lowerTick, pos.upperTick, pos.joinTime, pos.freezeDuration) if pos.acc.Equals(defaultAddress) { expectedPositions = append(expectedPositions, position) } @@ -81,12 +84,11 @@ func (s *KeeperTestSuite) TestGetAllPositionsWithVaryingFreezeTimes() { } func (s *KeeperTestSuite) TestParseFullPositionFromBytes() { - defaultFrozenUntil := s.Ctx.BlockTime().Add(DefaultFreezeDuration) defaultAddress := s.TestAccs[0] cdc := s.App.AppCodec() - - frozenFormat := osmoutils.FormatTimeString + joinTimeFormat := osmoutils.FormatTimeString addrFormat := address.MustLengthPrefix + DefaultJoinTime := s.Ctx.BlockTime() tests := map[string]struct { key []byte @@ -94,63 +96,68 @@ func (s *KeeperTestSuite) TestParseFullPositionFromBytes() { expectingErr bool }{ "Empty val": { - key: types.KeyFullPosition(defaultPoolId, defaultAddress, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil), + key: types.KeyFullPosition(defaultPoolId, defaultAddress, DefaultLowerTick, DefaultUpperTick, DefaultJoinTime, DefaultFreezeDuration), val: []byte{}, expectingErr: true, }, "Empty key": { key: []byte{}, - val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FrozenUntil: defaultFrozenUntil}), + val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FreezeDuration: DefaultFreezeDuration}), expectingErr: true, }, "Random key": { key: []byte{112, 12, 14, 4, 5}, - val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FrozenUntil: defaultFrozenUntil}), + val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FreezeDuration: DefaultFreezeDuration}), expectingErr: true, }, "Using not full key (wrong key)": { key: types.KeyPosition(defaultPoolId, defaultAddress, DefaultLowerTick, DefaultUpperTick), - val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FrozenUntil: defaultFrozenUntil}), + val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FreezeDuration: DefaultFreezeDuration}), expectingErr: true, }, "One key separator missing in key": { - key: []byte(fmt.Sprintf("%s%s%s%d%s%d%s%d%s%s", types.PositionPrefix, addrFormat(defaultAddress.Bytes()), "|", defaultPoolId, "|", DefaultLowerTick, "|", DefaultUpperTick, "|", frozenFormat(defaultFrozenUntil))), - val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FrozenUntil: defaultFrozenUntil}), + key: []byte(fmt.Sprintf("%s%s%s%d%s%d%s%d%s%s%s%s", types.PositionPrefix, addrFormat(defaultAddress.Bytes()), "|", defaultPoolId, "|", DefaultLowerTick, "|", DefaultUpperTick, "|", joinTimeFormat(DefaultJoinTime), "|", DefaultFreezeDuration.String())), + val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FreezeDuration: DefaultFreezeDuration}), expectingErr: true, }, "Wrong position prefix": { - key: []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d%s%s", []byte{0x01}, "|", addrFormat(defaultAddress), "|", defaultPoolId, "|", DefaultLowerTick, "|", DefaultUpperTick, "|", frozenFormat(defaultFrozenUntil))), - val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FrozenUntil: defaultFrozenUntil}), + key: []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d%s%s%s%s", []byte{0x01}, "|", addrFormat(defaultAddress), "|", defaultPoolId, "|", DefaultLowerTick, "|", DefaultUpperTick, "|", joinTimeFormat(DefaultJoinTime), "|", DefaultFreezeDuration.String())), + val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FreezeDuration: DefaultFreezeDuration}), expectingErr: true, }, "Wrong poolid": { - key: []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d%s%s", types.PositionPrefix, "|", addrFormat(defaultAddress), "|", -1, "|", DefaultLowerTick, "|", DefaultUpperTick, "|", frozenFormat(defaultFrozenUntil))), - val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FrozenUntil: defaultFrozenUntil}), + key: []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d%s%s%s%s", types.PositionPrefix, "|", addrFormat(defaultAddress), "|", -1, "|", DefaultLowerTick, "|", DefaultUpperTick, "|", joinTimeFormat(DefaultJoinTime), "|", DefaultFreezeDuration.String())), + val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FreezeDuration: DefaultFreezeDuration}), expectingErr: true, }, "Wrong lower tick": { - key: []byte(fmt.Sprintf("%s%s%s%s%d%s%s%s%d%s%s", types.PositionPrefix, "|", addrFormat(defaultAddress), "|", defaultPoolId, "|", "WrongLowerTick", "|", DefaultUpperTick, "|", frozenFormat(defaultFrozenUntil))), - val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FrozenUntil: defaultFrozenUntil}), + key: []byte(fmt.Sprintf("%s%s%s%s%d%s%s%s%d%s%s%s%s", types.PositionPrefix, "|", addrFormat(defaultAddress), "|", defaultPoolId, "|", "WrongLowerTick", "|", DefaultUpperTick, "|", joinTimeFormat(DefaultJoinTime), "|", DefaultFreezeDuration.String())), + val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FreezeDuration: DefaultFreezeDuration}), expectingErr: true, }, "Wrong upper tick": { - key: []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%s%s%s", types.PositionPrefix, "|", addrFormat(defaultAddress), "|", defaultPoolId, "|", DefaultLowerTick, "|", "WrongUpperTick", "|", frozenFormat(defaultFrozenUntil))), - val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FrozenUntil: defaultFrozenUntil}), + key: []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%s%s%s%s%s", types.PositionPrefix, "|", addrFormat(defaultAddress), "|", defaultPoolId, "|", DefaultLowerTick, "|", "WrongUpperTick", "|", joinTimeFormat(DefaultJoinTime), "|", DefaultFreezeDuration.String())), + val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FreezeDuration: DefaultFreezeDuration}), + expectingErr: true, + }, + "Wrong join time": { + key: []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d%s%s%s%s", types.PositionPrefix, "|", addrFormat(defaultAddress), "|", defaultPoolId, "|", DefaultLowerTick, "|", DefaultUpperTick, "|", DefaultJoinTime, "|", DefaultFreezeDuration.String())), + val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FreezeDuration: DefaultFreezeDuration}), expectingErr: true, }, - "Wrong frozen until": { - key: []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d%s%s", types.PositionPrefix, "|", addrFormat(defaultAddress), "|", defaultPoolId, "|", DefaultLowerTick, "|", DefaultUpperTick, "|", defaultFrozenUntil)), - val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FrozenUntil: defaultFrozenUntil}), + "Wrong freeze duration": { + key: []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d%s%s%s%s", types.PositionPrefix, "|", addrFormat(defaultAddress), "|", defaultPoolId, "|", DefaultLowerTick, "|", DefaultUpperTick, "|", DefaultJoinTime, "|", DefaultFreezeDuration)), + val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FreezeDuration: DefaultFreezeDuration}), expectingErr: true, }, "Invalid val bytes": { - key: types.KeyFullPosition(defaultPoolId, defaultAddress, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil), + key: types.KeyFullPosition(defaultPoolId, defaultAddress, DefaultLowerTick, DefaultUpperTick, DefaultJoinTime, DefaultFreezeDuration), val: []byte{1, 2, 3, 4, 5, 6, 7}, expectingErr: true, }, "Sufficient test case": { - key: types.KeyFullPosition(defaultPoolId, defaultAddress, DefaultLowerTick, DefaultUpperTick, defaultFrozenUntil), - val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FrozenUntil: defaultFrozenUntil}), + key: types.KeyFullPosition(defaultPoolId, defaultAddress, DefaultLowerTick, DefaultUpperTick, DefaultJoinTime, DefaultFreezeDuration), + val: cdc.MustMarshal(&model.Position{Liquidity: DefaultLiquidityAmt, FreezeDuration: DefaultFreezeDuration}), expectingErr: false, }, } @@ -168,7 +175,8 @@ func (s *KeeperTestSuite) TestParseFullPositionFromBytes() { s.Require().Equal(defaultPoolId, fullPosition.PoolId) s.Require().Equal(DefaultLowerTick, fullPosition.LowerTick) s.Require().Equal(DefaultUpperTick, fullPosition.UpperTick) - s.Require().Equal(defaultFrozenUntil, fullPosition.FrozenUntil) + s.Require().Equal(DefaultJoinTime, fullPosition.JoinTime) + s.Require().Equal(DefaultFreezeDuration, fullPosition.FreezeDuration) s.Require().Equal(DefaultLiquidityAmt, fullPosition.Liquidity) } diff --git a/x/concentrated-liquidity/swaps_test.go b/x/concentrated-liquidity/swaps_test.go index ac10962609d..cc8ad52f365 100644 --- a/x/concentrated-liquidity/swaps_test.go +++ b/x/concentrated-liquidity/swaps_test.go @@ -980,6 +980,7 @@ var ( ) func (s *KeeperTestSuite) TestCalcAndSwapOutAmtGivenIn() { + tests := make(map[string]SwapTest, len(swapOutGivenInCases)+len(swapOutGivenInFeeCases)+len(swapOutGivenInErrorCases)) for name, test := range swapOutGivenInCases { tests[name] = test @@ -1014,7 +1015,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapOutAmtGivenIn() { newUpperTick, err := math.PriceToTick(test.secondPositionUpperPrice, DefaultExponentAtPriceOne) s.Require().NoError(err) - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), DefaultFreezeDuration) s.Require().NoError(err) } @@ -1135,6 +1136,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapOutAmtGivenIn() { } func (s *KeeperTestSuite) TestSwapOutAmtGivenIn_TickUpdates() { + tests := make(map[string]SwapTest) for name, test := range swapOutGivenInCases { tests[name] = test @@ -1165,7 +1167,7 @@ func (s *KeeperTestSuite) TestSwapOutAmtGivenIn_TickUpdates() { newUpperTick, err := math.PriceToTick(test.secondPositionUpperPrice, DefaultExponentAtPriceOne) s.Require().NoError(err) - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), DefaultFreezeDuration) s.Require().NoError(err) } @@ -1213,6 +1215,7 @@ func (s *KeeperTestSuite) TestSwapOutAmtGivenIn_TickUpdates() { } func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { + tests := make(map[string]SwapTest, len(swapInGivenOutTestCases)+len(swapInGivenOutFeeTestCases)+len(swapInGivenOutErrorTestCases)) for name, test := range swapInGivenOutTestCases { tests[name] = test @@ -1247,7 +1250,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { newUpperTick, err := math.PriceToTick(test.secondPositionUpperPrice, DefaultExponentAtPriceOne) s.Require().NoError(err) - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), DefaultFreezeDuration) s.Require().NoError(err) } @@ -1383,6 +1386,7 @@ func (s *KeeperTestSuite) TestCalcAndSwapInAmtGivenOut() { } func (s *KeeperTestSuite) TestSwapInAmtGivenOut_TickUpdates() { + tests := make(map[string]SwapTest) for name, test := range swapInGivenOutTestCases { tests[name] = test @@ -1412,7 +1416,7 @@ func (s *KeeperTestSuite) TestSwapInAmtGivenOut_TickUpdates() { newUpperTick, err := math.PriceToTick(test.secondPositionUpperPrice, DefaultExponentAtPriceOne) s.Require().NoError(err) - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), DefaultFreezeDuration) s.Require().NoError(err) } @@ -1757,6 +1761,7 @@ func (s *KeeperTestSuite) TestSwapExactAmountOut() { // TestCalcOutAmtGivenInWriteCtx tests that writeCtx successfully performs state changes as expected. // We expect writeCtx to only change fee accum state, since pool state change is not handled via writeCtx function. func (s *KeeperTestSuite) TestCalcOutAmtGivenInWriteCtx() { + // we only use fee cases here since write Ctx only takes effect in the fee accumulator tests := make(map[string]SwapTest, len(swapOutGivenInFeeCases)) @@ -1784,7 +1789,7 @@ func (s *KeeperTestSuite) TestCalcOutAmtGivenInWriteCtx() { newUpperTick, err := math.PriceToTick(test.secondPositionUpperPrice, DefaultExponentAtPriceOne) s.Require().NoError(err) - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), DefaultFreezeDuration) s.Require().NoError(err) } @@ -1842,6 +1847,7 @@ func (s *KeeperTestSuite) TestCalcOutAmtGivenInWriteCtx() { // TestCalcInAmtGivenOutWriteCtx tests that writeCtx succesfully perfroms state changes as expected. // We expect writeCtx to only change fee accum state, since pool state change is not handled via writeCtx function. func (s *KeeperTestSuite) TestCalcInAmtGivenOutWriteCtx() { + // we only use fee cases here since write Ctx only takes effect in the fee accumulator tests := make(map[string]SwapTest, len(swapInGivenOutFeeTestCases)) @@ -1869,7 +1875,7 @@ func (s *KeeperTestSuite) TestCalcInAmtGivenOutWriteCtx() { newUpperTick, err := math.PriceToTick(test.secondPositionUpperPrice, DefaultExponentAtPriceOne) s.Require().NoError(err) - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), DefaultFreezeDuration) s.Require().NoError(err) } @@ -1924,6 +1930,7 @@ func (s *KeeperTestSuite) TestCalcInAmtGivenOutWriteCtx() { } } func (s *KeeperTestSuite) TestInverseRelationshipSwapOutAmtGivenIn() { + tests := swapOutGivenInCases for name, test := range tests { @@ -1945,7 +1952,7 @@ func (s *KeeperTestSuite) TestInverseRelationshipSwapOutAmtGivenIn() { newUpperTick, err := math.PriceToTick(test.secondPositionUpperPrice, DefaultExponentAtPriceOne) s.Require().NoError(err) - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[0], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), DefaultFreezeDuration) s.Require().NoError(err) } @@ -2015,6 +2022,7 @@ func (suite *KeeperTestSuite) TestUpdateFeeGrowthGlobal() { } func (s *KeeperTestSuite) TestInverseRelationshipSwapInAmtGivenOut() { + tests := swapInGivenOutTestCases for name, test := range tests { @@ -2036,7 +2044,7 @@ func (s *KeeperTestSuite) TestInverseRelationshipSwapInAmtGivenOut() { newUpperTick, err := math.PriceToTick(test.secondPositionUpperPrice, DefaultExponentAtPriceOne) s.Require().NoError(err) - _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), s.Ctx.BlockTime().Add(DefaultFreezeDuration)) + _, _, _, err = s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, pool.GetId(), s.TestAccs[1], DefaultAmt0, DefaultAmt1, sdk.ZeroInt(), sdk.ZeroInt(), newLowerTick.Int64(), newUpperTick.Int64(), DefaultFreezeDuration) s.Require().NoError(err) } diff --git a/x/concentrated-liquidity/tick_test.go b/x/concentrated-liquidity/tick_test.go index 5f9f1695f35..701471df375 100644 --- a/x/concentrated-liquidity/tick_test.go +++ b/x/concentrated-liquidity/tick_test.go @@ -532,8 +532,9 @@ func (s *KeeperTestSuite) TestCrossTick() { clPool.SetCurrentTick(DefaultCurrTick) if test.poolToGet == validPoolId { - s.FundAcc(s.TestAccs[0], sdk.NewCoins(sdk.NewCoin("ETH", sdk.NewInt(10000000000000)), sdk.NewCoin("USDC", sdk.NewInt(1000000000000)))) - s.SetupPosition(test.poolToGet, s.TestAccs[0], DefaultCoin0, DefaultCoin1, DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime().Add(DefaultFreezeDuration)) + s.FundAcc(s.TestAccs[0], sdk.NewCoins(DefaultCoin0, DefaultCoin1)) + _, _, _, err := s.App.ConcentratedLiquidityKeeper.CreatePosition(s.Ctx, test.poolToGet, s.TestAccs[0], DefaultCoin0.Amount, DefaultCoin1.Amount, sdk.ZeroInt(), sdk.ZeroInt(), DefaultLowerTick, DefaultUpperTick, DefaultFreezeDuration) + s.Require().NoError(err) } // Charge fee to make sure that the global fee accumulator is always updated. diff --git a/x/concentrated-liquidity/types/errors.go b/x/concentrated-liquidity/types/errors.go index daf824c767c..3323c51da32 100644 --- a/x/concentrated-liquidity/types/errors.go +++ b/x/concentrated-liquidity/types/errors.go @@ -26,14 +26,15 @@ func (e NotPositiveRequireAmountError) Error() string { } type PositionNotFoundError struct { - PoolId uint64 - LowerTick int64 - UpperTick int64 - FrozenUntil time.Time + PoolId uint64 + LowerTick int64 + UpperTick int64 + JoinTime time.Time + FreezeDuration time.Duration } func (e PositionNotFoundError) Error() string { - return fmt.Sprintf("position not found. pool id (%d), lower tick (%d), upper tick (%d), frozen until (%s)", e.PoolId, e.LowerTick, e.UpperTick, e.FrozenUntil) + return fmt.Sprintf("position not found. pool id (%d), lower tick (%d), upper tick (%d), join time (%s) freeze duration (%s)", e.PoolId, e.LowerTick, e.UpperTick, e.JoinTime, e.FreezeDuration) } type PoolNotFoundError struct { @@ -217,11 +218,11 @@ func (e InvalidSwapFeeError) Error() string { } type PositionStillFrozenError struct { - FrozenUntil time.Time + FreezeDuration time.Duration } func (e PositionStillFrozenError) Error() string { - return fmt.Sprintf("position is still frozen until %s", e.FrozenUntil) + return fmt.Sprintf("position is still under freeze duration %s", e.FreezeDuration) } type IncentiveRecordNotFoundError struct { diff --git a/x/concentrated-liquidity/types/keys.go b/x/concentrated-liquidity/types/keys.go index 5d5f7038fe9..eb768b8ce75 100644 --- a/x/concentrated-liquidity/types/keys.go +++ b/x/concentrated-liquidity/types/keys.go @@ -67,11 +67,13 @@ func KeyTickPrefix(poolId uint64) []byte { return key } -// KeyFullPosition uses pool Id, owner, lower tick, upper tick, and frozenUntil for keys -func KeyFullPosition(poolId uint64, addr sdk.AccAddress, lowerTick, upperTick int64, frozenUntil time.Time) []byte { - frozenUntilKey := osmoutils.FormatTimeString(frozenUntil) +// KeyFullPosition uses pool Id, owner, lower tick, upper tick, joinTime and freezeDuration for keys +func KeyFullPosition(poolId uint64, addr sdk.AccAddress, lowerTick, upperTick int64, joinTime time.Time, freezeDuration time.Duration) []byte { + joinTimeKey := osmoutils.FormatTimeString(joinTime) + // ? Do we want to format in the same way as joinTimeKey or does it not matter? + freezeDurationKey := freezeDuration.String() addrKey := address.MustLengthPrefix(addr.Bytes()) - return []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d%s%s", PositionPrefix, KeySeparator, addrKey, KeySeparator, poolId, KeySeparator, lowerTick, KeySeparator, upperTick, KeySeparator, frozenUntilKey)) + return []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d%s%s%s%s", PositionPrefix, KeySeparator, addrKey, KeySeparator, poolId, KeySeparator, lowerTick, KeySeparator, upperTick, KeySeparator, joinTimeKey, KeySeparator, freezeDurationKey)) } // KeyPosition uses pool Id, owner, lower tick and upper tick for keys diff --git a/x/concentrated-liquidity/types/msgs.go b/x/concentrated-liquidity/types/msgs.go index 7aee8ed2203..2b923f4a450 100644 --- a/x/concentrated-liquidity/types/msgs.go +++ b/x/concentrated-liquidity/types/msgs.go @@ -43,6 +43,10 @@ func (msg MsgCreatePosition) ValidateBasic() error { return NotPositiveRequireAmountError{Amount: msg.TokenMinAmount1.String()} } + if msg.FreezeDuration < 0 { + return fmt.Errorf("Invalid freeze duration") + } + return nil } @@ -76,6 +80,10 @@ func (msg MsgWithdrawPosition) ValidateBasic() error { return NotPositiveRequireAmountError{Amount: msg.LiquidityAmount.String()} } + if msg.FreezeDuration < 0 { + return fmt.Errorf("Invalid freeze duration") + } + return nil } diff --git a/x/concentrated-liquidity/types/query.pb.go b/x/concentrated-liquidity/types/query.pb.go index 35017aaa916..c9670396b07 100644 --- a/x/concentrated-liquidity/types/query.pb.go +++ b/x/concentrated-liquidity/types/query.pb.go @@ -128,11 +128,12 @@ func (m *QueryUserPositionsResponse) GetPositions() []FullPositionByOwnerResult } type FullPositionByOwnerResult struct { - PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` - LowerTick int64 `protobuf:"varint,2,opt,name=lower_tick,json=lowerTick,proto3" json:"lower_tick,omitempty"` - UpperTick int64 `protobuf:"varint,3,opt,name=upper_tick,json=upperTick,proto3" json:"upper_tick,omitempty"` - FrozenUntil time.Time `protobuf:"bytes,4,opt,name=frozen_until,json=frozenUntil,proto3,stdtime" json:"frozen_until" yaml:"frozen_until"` - Liquidity github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=liquidity,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"liquidity" yaml:"liquidity"` + PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + LowerTick int64 `protobuf:"varint,2,opt,name=lower_tick,json=lowerTick,proto3" json:"lower_tick,omitempty"` + UpperTick int64 `protobuf:"varint,3,opt,name=upper_tick,json=upperTick,proto3" json:"upper_tick,omitempty"` + JoinTime time.Time `protobuf:"bytes,4,opt,name=join_time,json=joinTime,proto3,stdtime" json:"join_time" yaml:"join_time"` + FreezeDuration time.Duration `protobuf:"bytes,5,opt,name=freeze_duration,json=freezeDuration,proto3,stdduration" json:"duration,omitempty" yaml:"freeze_duration"` + Liquidity github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=liquidity,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"liquidity" yaml:"liquidity"` } func (m *FullPositionByOwnerResult) Reset() { *m = FullPositionByOwnerResult{} } @@ -189,13 +190,20 @@ func (m *FullPositionByOwnerResult) GetUpperTick() int64 { return 0 } -func (m *FullPositionByOwnerResult) GetFrozenUntil() time.Time { +func (m *FullPositionByOwnerResult) GetJoinTime() time.Time { if m != nil { - return m.FrozenUntil + return m.JoinTime } return time.Time{} } +func (m *FullPositionByOwnerResult) GetFreezeDuration() time.Duration { + if m != nil { + return m.FreezeDuration + } + return 0 +} + // =============================== Pool type QueryPoolRequest struct { PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` @@ -614,73 +622,76 @@ func init() { } var fileDescriptor_ce34c1e206115391 = []byte{ - // 1042 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4f, 0x6f, 0xdc, 0x44, - 0x14, 0xcf, 0x24, 0x9b, 0x94, 0x9d, 0x6d, 0x4b, 0x3a, 0x8d, 0xc4, 0x66, 0x05, 0xeb, 0x68, 0xa0, - 0x25, 0xa2, 0x5d, 0x5b, 0xd9, 0xb2, 0x10, 0x22, 0xfe, 0x34, 0x4e, 0x15, 0x58, 0x40, 0x10, 0xac, - 0xf6, 0x52, 0x2a, 0x16, 0xef, 0x7a, 0xb2, 0xb5, 0xe2, 0xf5, 0x38, 0x9e, 0x71, 0xdb, 0xa5, 0xea, - 0xa5, 0x67, 0x84, 0x2a, 0xc1, 0x89, 0x8f, 0x81, 0x10, 0x12, 0xdf, 0x20, 0xe2, 0x54, 0x89, 0x4b, - 0x05, 0xd2, 0x82, 0x12, 0x3e, 0x41, 0xee, 0x48, 0xc8, 0x33, 0x63, 0xaf, 0x37, 0x7f, 0x9a, 0x75, - 0xcb, 0xc9, 0xf6, 0xbc, 0xf7, 0x7e, 0xef, 0xf7, 0xfe, 0x7a, 0x60, 0x83, 0xb2, 0x1e, 0x65, 0x2e, - 0x33, 0x3a, 0xd4, 0xef, 0x10, 0x9f, 0x87, 0x36, 0x27, 0x4e, 0xcd, 0x73, 0xb7, 0x23, 0xd7, 0x71, - 0x79, 0xdf, 0x08, 0x28, 0xf5, 0x6a, 0x3d, 0xea, 0x10, 0xcf, 0xd8, 0x8e, 0x48, 0xd8, 0xd7, 0x83, - 0x90, 0x72, 0x8a, 0x2e, 0x28, 0x33, 0x3d, 0x6b, 0x96, 0x5a, 0xe9, 0x77, 0x96, 0xda, 0x84, 0xdb, - 0x4b, 0x95, 0xb9, 0x2e, 0xed, 0x52, 0x61, 0x61, 0xc4, 0x6f, 0xd2, 0xb8, 0x72, 0xe9, 0x24, 0x9f, - 0x76, 0x68, 0xf7, 0x98, 0x52, 0xae, 0x76, 0x84, 0xb6, 0xd1, 0xb6, 0x19, 0x31, 0x14, 0xae, 0xd1, - 0xa1, 0xae, 0xaf, 0xe4, 0x6f, 0x64, 0xe5, 0x82, 0x62, 0xaa, 0x15, 0xd8, 0x5d, 0xd7, 0xb7, 0xb9, - 0x4b, 0x13, 0xdd, 0x97, 0xbb, 0x94, 0x76, 0x3d, 0x62, 0xd8, 0x81, 0x6b, 0xd8, 0xbe, 0x4f, 0xb9, - 0x10, 0x26, 0x9e, 0xe6, 0x95, 0x54, 0x7c, 0xb5, 0xa3, 0x4d, 0xc3, 0xf6, 0xfb, 0x89, 0x48, 0x3a, - 0x69, 0xc9, 0x50, 0xe4, 0x87, 0x12, 0x69, 0x07, 0xad, 0xb8, 0xdb, 0x23, 0x8c, 0xdb, 0xbd, 0x40, - 0x2a, 0xe0, 0x26, 0x9c, 0xff, 0x22, 0xa6, 0x75, 0x83, 0x91, 0x70, 0x83, 0x32, 0x57, 0xb8, 0xb4, - 0xc8, 0x76, 0x44, 0x18, 0x47, 0x97, 0xe1, 0x29, 0xdb, 0x71, 0x42, 0xc2, 0x58, 0x19, 0x2c, 0x80, - 0xc5, 0xa2, 0x89, 0xf6, 0x07, 0xda, 0xd9, 0xbe, 0xdd, 0xf3, 0x56, 0xb0, 0x12, 0x60, 0x2b, 0x51, - 0xc1, 0x0f, 0x01, 0xac, 0x1c, 0x85, 0xc5, 0x02, 0xea, 0x33, 0x82, 0x1c, 0x58, 0x0c, 0x92, 0xc3, - 0x32, 0x58, 0x98, 0x5a, 0x2c, 0xd5, 0xaf, 0xea, 0x63, 0x15, 0x4a, 0x5f, 0x8f, 0x3c, 0x2f, 0x01, - 0x34, 0xfb, 0x9f, 0xdf, 0xf5, 0x49, 0x68, 0x11, 0x16, 0x79, 0xdc, 0x2c, 0xec, 0x0c, 0xb4, 0x09, - 0x6b, 0x08, 0x8c, 0x77, 0x26, 0xe1, 0xfc, 0xb1, 0xea, 0xe8, 0x12, 0x3c, 0x15, 0xb7, 0x4c, 0xcb, - 0x75, 0x44, 0x40, 0x85, 0x6c, 0x40, 0x4a, 0x80, 0xad, 0x99, 0xf8, 0xad, 0xe9, 0xa0, 0x57, 0x20, - 0xf4, 0xe8, 0x5d, 0x12, 0xb6, 0xb8, 0xdb, 0xd9, 0x2a, 0x4f, 0x2e, 0x80, 0xc5, 0x29, 0xab, 0x28, - 0x4e, 0xae, 0xbb, 0x9d, 0xad, 0x58, 0x1c, 0x05, 0x41, 0x22, 0x9e, 0x92, 0x62, 0x71, 0x22, 0xc4, - 0x5f, 0xc1, 0xd3, 0x9b, 0x21, 0xfd, 0x86, 0xf8, 0xad, 0xc8, 0xe7, 0xae, 0x57, 0x2e, 0x2c, 0x80, - 0xc5, 0x52, 0xbd, 0xa2, 0xcb, 0x82, 0xe8, 0x49, 0x41, 0xf4, 0xeb, 0x49, 0x41, 0x4c, 0x2d, 0x8e, - 0x65, 0x7f, 0xa0, 0x9d, 0x97, 0x7c, 0xb2, 0xd6, 0xf8, 0xd1, 0x5f, 0x1a, 0xb0, 0x4a, 0xf2, 0xe8, - 0x46, 0x7c, 0x82, 0xbe, 0x86, 0xc5, 0x34, 0x51, 0xe5, 0x69, 0x51, 0x1d, 0x33, 0x06, 0xf8, 0x63, - 0xa0, 0x5d, 0xec, 0xba, 0xfc, 0x76, 0xd4, 0xd6, 0x3b, 0xb4, 0xa7, 0xba, 0x41, 0x3d, 0x6a, 0xcc, - 0xd9, 0x32, 0x78, 0x3f, 0x20, 0x4c, 0xbf, 0x46, 0x3a, 0xfb, 0x03, 0x6d, 0x56, 0xba, 0x4a, 0x81, - 0xb0, 0x35, 0x04, 0xc5, 0x1f, 0xc0, 0x59, 0x51, 0xce, 0x0d, 0x4a, 0xbd, 0xa4, 0x23, 0xf2, 0x24, - 0x10, 0x7f, 0x04, 0xcf, 0x65, 0x00, 0x54, 0x1b, 0x5c, 0x81, 0x85, 0x58, 0x2c, 0xcc, 0x4b, 0xf5, - 0xb9, 0x43, 0xf9, 0x58, 0xf5, 0xfb, 0x66, 0xf1, 0xb7, 0x9f, 0x6b, 0xd3, 0xb1, 0x55, 0xd3, 0x12, - 0xca, 0xf8, 0xcb, 0x0c, 0x52, 0xda, 0x9d, 0xeb, 0x10, 0x0e, 0x67, 0x48, 0xd4, 0xa7, 0x54, 0xbf, - 0xa8, 0xab, 0xf6, 0x8f, 0x07, 0x4e, 0x97, 0x3b, 0x21, 0xe9, 0xa2, 0x0d, 0xbb, 0x4b, 0x94, 0xad, - 0x95, 0xb1, 0xc4, 0x3f, 0x00, 0x88, 0xb2, 0xe8, 0x8a, 0x68, 0x03, 0x4e, 0xc7, 0xbe, 0x93, 0x5e, - 0x3d, 0x91, 0xa9, 0xd4, 0x46, 0x1f, 0x1e, 0xc1, 0xea, 0xf5, 0x13, 0x59, 0x49, 0x9f, 0x23, 0xb4, - 0xe6, 0x12, 0x56, 0x62, 0xdf, 0x28, 0xe2, 0xf8, 0x26, 0x3c, 0x3f, 0x72, 0xaa, 0xc8, 0xae, 0xc1, - 0x19, 0xb9, 0x97, 0x54, 0x5e, 0x2f, 0x9c, 0x30, 0x59, 0xd2, 0x5c, 0x8d, 0x8f, 0x32, 0xc5, 0x3f, - 0x4e, 0xc2, 0x57, 0x05, 0xf8, 0xa7, 0x89, 0xde, 0x35, 0x12, 0xf0, 0xdb, 0x6c, 0x9d, 0x86, 0x96, - 0xed, 0xa7, 0xc9, 0xcb, 0x37, 0x45, 0xed, 0x43, 0x53, 0x54, 0x34, 0xd7, 0x72, 0x34, 0x6a, 0xd3, - 0xe7, 0xfb, 0x03, 0xed, 0x9c, 0x6a, 0xd4, 0x14, 0x09, 0x67, 0x47, 0xb1, 0x7d, 0x68, 0x14, 0x9f, - 0xc3, 0xc7, 0x10, 0x09, 0x67, 0xe6, 0x19, 0x7f, 0x07, 0xe0, 0x6b, 0x4f, 0x4f, 0x8e, 0x2a, 0xc5, - 0x26, 0x9c, 0x4d, 0xf3, 0xdc, 0x72, 0x84, 0x8e, 0x6a, 0xa1, 0xc6, 0x98, 0xeb, 0x6e, 0xd4, 0x83, - 0x2a, 0xd2, 0x8b, 0xde, 0xa8, 0x5f, 0xfc, 0x27, 0x80, 0x67, 0x47, 0x35, 0xd1, 0x16, 0x3c, 0x33, - 0x74, 0xed, 0x13, 0xae, 0xb6, 0xf6, 0x7a, 0xee, 0xbd, 0x30, 0x77, 0x60, 0x2f, 0xc4, 0x60, 0xd8, - 0x3a, 0x9d, 0x7e, 0x7f, 0x46, 0x38, 0xba, 0x05, 0x61, 0x9c, 0xa4, 0x96, 0xeb, 0x3b, 0xe4, 0x9e, - 0x2a, 0xec, 0x7b, 0xb9, 0x93, 0x5e, 0x92, 0x9e, 0x54, 0xba, 0xe3, 0x47, 0x33, 0xc6, 0xab, 0x7f, - 0xfb, 0x02, 0x9c, 0x16, 0xe9, 0x46, 0x3f, 0x01, 0x28, 0x26, 0x8c, 0xa1, 0xe5, 0x31, 0xf3, 0x77, - 0x68, 0x55, 0x54, 0xde, 0x79, 0x06, 0x4b, 0x59, 0x4e, 0xfc, 0xe6, 0xc3, 0xdf, 0xff, 0xf9, 0x7e, - 0x52, 0x47, 0x97, 0x8d, 0xa3, 0xee, 0x05, 0xc3, 0x6b, 0x41, 0xfa, 0x5b, 0x17, 0x54, 0x7f, 0x05, - 0xb0, 0x10, 0xe3, 0xa0, 0xb7, 0xf3, 0x7a, 0x4e, 0x28, 0x2f, 0xe7, 0x37, 0x54, 0x8c, 0xdf, 0x17, - 0x8c, 0x97, 0xd1, 0x5b, 0x79, 0x18, 0x1b, 0xf7, 0xd5, 0xe4, 0x3e, 0x40, 0xbf, 0x00, 0x38, 0x23, - 0xf7, 0x03, 0xca, 0x97, 0xb7, 0xec, 0xa2, 0xaa, 0xac, 0x3c, 0x8b, 0xa9, 0x8a, 0xa0, 0x21, 0x22, - 0x30, 0x50, 0x6d, 0xdc, 0x08, 0x24, 0xdb, 0x7f, 0x01, 0x7c, 0xe9, 0x98, 0xe9, 0x44, 0x1f, 0xe7, - 0xa1, 0xf3, 0xf4, 0xfd, 0x57, 0xf9, 0xe4, 0x7f, 0xc1, 0x52, 0xb1, 0x36, 0x45, 0xac, 0x6b, 0x68, - 0x75, 0xcc, 0x58, 0x0f, 0xee, 0x96, 0xd6, 0x26, 0x0d, 0x5b, 0xa1, 0x88, 0xf1, 0x09, 0x80, 0x67, - 0x46, 0xee, 0x5e, 0xe8, 0x6a, 0x1e, 0xa6, 0x47, 0x5d, 0x01, 0x2b, 0xab, 0xcf, 0x81, 0xa0, 0x22, - 0x34, 0x45, 0x84, 0xef, 0xa2, 0x95, 0xb1, 0xfb, 0x51, 0x21, 0x18, 0xf7, 0xd5, 0xd5, 0xf2, 0x81, - 0x79, 0x6b, 0x67, 0xb7, 0x0a, 0x1e, 0xef, 0x56, 0xc1, 0xdf, 0xbb, 0x55, 0xf0, 0x68, 0xaf, 0x3a, - 0xf1, 0x78, 0xaf, 0x3a, 0xf1, 0x64, 0xaf, 0x3a, 0x71, 0xd3, 0xcc, 0xac, 0x1a, 0x85, 0x5f, 0xf3, - 0xec, 0x36, 0x4b, 0x9d, 0xdd, 0x59, 0x6a, 0x18, 0xf7, 0x8e, 0xbb, 0xcc, 0x8b, 0x55, 0xd4, 0x9e, - 0x11, 0xff, 0xf4, 0x2b, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x8f, 0xe3, 0x38, 0x82, 0x6f, 0x0c, - 0x00, 0x00, + // 1098 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcd, 0x6f, 0x1b, 0x45, + 0x14, 0xcf, 0xe6, 0xc3, 0xad, 0xc7, 0x34, 0x4d, 0x87, 0x08, 0x1c, 0xab, 0xd8, 0xd1, 0x40, 0x4b, + 0x44, 0xe3, 0x5d, 0xc5, 0x6d, 0x20, 0x44, 0x7c, 0x34, 0x9b, 0x28, 0x60, 0x40, 0x10, 0x56, 0xed, + 0xa5, 0x54, 0x32, 0x6b, 0xef, 0xc4, 0x5d, 0xb2, 0xde, 0xd9, 0xec, 0x8c, 0xdb, 0x9a, 0xd2, 0x4b, + 0xcf, 0x08, 0x55, 0x82, 0x03, 0xe2, 0xcf, 0x40, 0x08, 0x89, 0x03, 0xf7, 0x8a, 0x53, 0x25, 0x2e, + 0x15, 0x48, 0x06, 0x25, 0x9c, 0x38, 0xe6, 0x8e, 0x84, 0x66, 0x76, 0x66, 0xbd, 0xb6, 0x93, 0xc6, + 0xdb, 0xf6, 0x64, 0xcf, 0xbc, 0xf7, 0x7e, 0xef, 0xf7, 0x3e, 0x3d, 0x06, 0xcb, 0x84, 0xb6, 0x08, + 0x75, 0xa9, 0xd1, 0x20, 0x7e, 0x03, 0xfb, 0x2c, 0xb4, 0x19, 0x76, 0xca, 0x9e, 0xbb, 0xdb, 0x76, + 0x1d, 0x97, 0x75, 0x8c, 0x80, 0x10, 0xaf, 0xdc, 0x22, 0x0e, 0xf6, 0x8c, 0xdd, 0x36, 0x0e, 0x3b, + 0x7a, 0x10, 0x12, 0x46, 0xe0, 0x39, 0x69, 0xa6, 0x27, 0xcd, 0x62, 0x2b, 0xfd, 0xe6, 0x52, 0x1d, + 0x33, 0x7b, 0xa9, 0x30, 0xdb, 0x24, 0x4d, 0x22, 0x2c, 0x0c, 0xfe, 0x2d, 0x32, 0x2e, 0x5c, 0x38, + 0xce, 0xa7, 0x1d, 0xda, 0x2d, 0x2a, 0x95, 0x8b, 0x0d, 0xa1, 0x6d, 0xd4, 0x6d, 0x8a, 0x0d, 0x89, + 0x6b, 0x34, 0x88, 0xeb, 0x4b, 0xf9, 0x6b, 0x49, 0xb9, 0xa0, 0x18, 0x6b, 0x05, 0x76, 0xd3, 0xf5, + 0x6d, 0xe6, 0x12, 0xa5, 0x7b, 0xb6, 0x49, 0x48, 0xd3, 0xc3, 0x86, 0x1d, 0xb8, 0x86, 0xed, 0xfb, + 0x84, 0x09, 0xa1, 0xf2, 0x34, 0x27, 0xa5, 0xe2, 0x54, 0x6f, 0x6f, 0x1b, 0xb6, 0xdf, 0x51, 0xa2, + 0xc8, 0x49, 0x2d, 0x0a, 0x25, 0x3a, 0x48, 0x51, 0x69, 0xd0, 0x8a, 0xb9, 0x2d, 0x4c, 0x99, 0xdd, + 0x0a, 0x54, 0x00, 0x83, 0x0a, 0x4e, 0x3b, 0x4c, 0x90, 0x42, 0x55, 0x30, 0xf7, 0x29, 0xa7, 0x7d, + 0x95, 0xe2, 0x70, 0x8b, 0x50, 0x57, 0x50, 0xb2, 0xf0, 0x6e, 0x1b, 0x53, 0x06, 0x17, 0xc1, 0x09, + 0xdb, 0x71, 0x42, 0x4c, 0x69, 0x5e, 0x9b, 0xd7, 0x16, 0xb2, 0x26, 0x3c, 0xe8, 0x96, 0xa6, 0x3b, + 0x76, 0xcb, 0x5b, 0x45, 0x52, 0x80, 0x2c, 0xa5, 0x82, 0xee, 0x69, 0xa0, 0x70, 0x18, 0x16, 0x0d, + 0x88, 0x4f, 0x31, 0x74, 0x40, 0x36, 0x50, 0x97, 0x79, 0x6d, 0x7e, 0x62, 0x21, 0x57, 0xb9, 0xac, + 0x8f, 0x54, 0x48, 0x7d, 0xb3, 0xed, 0x79, 0x0a, 0xd0, 0xec, 0x7c, 0x72, 0xcb, 0xc7, 0xa1, 0x85, + 0x69, 0xdb, 0x63, 0xe6, 0xe4, 0x83, 0x6e, 0x69, 0xcc, 0xea, 0x01, 0xa3, 0x5f, 0x27, 0xc0, 0xdc, + 0x91, 0xea, 0xf0, 0x02, 0x38, 0xc1, 0x5b, 0xaa, 0xe6, 0x3a, 0x22, 0xa0, 0xc9, 0x64, 0x40, 0x52, + 0x80, 0xac, 0x0c, 0xff, 0x56, 0x75, 0xe0, 0x4b, 0x00, 0x78, 0xe4, 0x16, 0x0e, 0x6b, 0xcc, 0x6d, + 0xec, 0xe4, 0xc7, 0xe7, 0xb5, 0x85, 0x09, 0x2b, 0x2b, 0x6e, 0xae, 0xb8, 0x8d, 0x1d, 0x2e, 0x6e, + 0x07, 0x81, 0x12, 0x4f, 0x44, 0x62, 0x71, 0x23, 0xc4, 0x57, 0x41, 0xf6, 0x0b, 0xe2, 0xfa, 0x35, + 0x5e, 0x90, 0xfc, 0xe4, 0xbc, 0xb6, 0x90, 0xab, 0x14, 0xf4, 0xa8, 0x18, 0xba, 0x2a, 0x86, 0x7e, + 0x45, 0x55, 0xcb, 0x3c, 0xcb, 0x03, 0x39, 0xe8, 0x96, 0x66, 0x22, 0x32, 0xb1, 0x29, 0xba, 0xff, + 0x57, 0x49, 0xb3, 0x4e, 0xf2, 0x33, 0x57, 0x86, 0x5f, 0x81, 0xd3, 0xdb, 0x21, 0xc6, 0x5f, 0xe2, + 0x9a, 0x2a, 0x64, 0x7e, 0x4a, 0x80, 0xcf, 0x0d, 0x81, 0x6f, 0x48, 0x05, 0x73, 0x85, 0x63, 0xff, + 0xdb, 0x2d, 0x41, 0x65, 0xb2, 0x48, 0x5a, 0x2e, 0xc3, 0xad, 0x80, 0x75, 0x0e, 0xba, 0xa5, 0x17, + 0x22, 0x8f, 0x03, 0xa8, 0xe8, 0x7b, 0xee, 0x77, 0x3a, 0xba, 0x55, 0x48, 0xf0, 0x73, 0x90, 0x8d, + 0xab, 0x93, 0xcf, 0x88, 0x96, 0x30, 0x39, 0xf8, 0x1f, 0xdd, 0xd2, 0xf9, 0xa6, 0xcb, 0x6e, 0xb4, + 0xeb, 0x7a, 0x83, 0xb4, 0x64, 0x8b, 0xca, 0x8f, 0x32, 0x75, 0x76, 0x0c, 0xd6, 0x09, 0x30, 0xd5, + 0x37, 0x70, 0xa3, 0x17, 0x62, 0x0c, 0x84, 0xac, 0x1e, 0x28, 0x7a, 0x17, 0xcc, 0x88, 0x1e, 0xda, + 0x22, 0xc4, 0x53, 0x6d, 0x98, 0xa6, 0x6a, 0xe8, 0x7d, 0x70, 0x26, 0x01, 0x20, 0x7b, 0xef, 0x22, + 0x98, 0xe4, 0x62, 0x61, 0x9e, 0xab, 0xcc, 0x0e, 0xa5, 0x6a, 0xcd, 0xef, 0x98, 0xd9, 0xdf, 0x7e, + 0x2a, 0x4f, 0x71, 0xab, 0xaa, 0x25, 0x94, 0xd1, 0x67, 0x09, 0xa4, 0x78, 0x24, 0x36, 0x01, 0xe8, + 0x0d, 0xb6, 0x68, 0x8a, 0x5c, 0xe5, 0xbc, 0x2e, 0x67, 0x92, 0x6f, 0x01, 0x3d, 0x5a, 0x54, 0xaa, + 0x75, 0xb7, 0xec, 0x26, 0x96, 0xb6, 0x56, 0xc2, 0x12, 0x7d, 0xa7, 0x01, 0x98, 0x44, 0x97, 0x44, + 0x97, 0xc1, 0x14, 0xf7, 0xad, 0x06, 0xe4, 0x58, 0xa6, 0x91, 0x36, 0x7c, 0xef, 0x10, 0x56, 0xaf, + 0x1e, 0xcb, 0x2a, 0xf2, 0xd9, 0x47, 0x6b, 0x56, 0xb1, 0x12, 0x4b, 0x50, 0x12, 0x47, 0xd7, 0xc0, + 0xf3, 0x7d, 0xb7, 0x92, 0xec, 0x3a, 0xc8, 0x44, 0xcb, 0x52, 0xe6, 0xf5, 0xdc, 0x31, 0xe3, 0x1c, + 0x99, 0xcb, 0x99, 0x95, 0xa6, 0xe8, 0x87, 0x71, 0xf0, 0xb2, 0x00, 0xff, 0x48, 0xe9, 0x6d, 0xe0, + 0x80, 0xdd, 0xa0, 0x9b, 0x24, 0xb4, 0x6c, 0x3f, 0x4e, 0x5e, 0xba, 0xd1, 0xad, 0x0f, 0x8d, 0x6e, + 0xd6, 0x5c, 0x4f, 0xd1, 0xa8, 0x55, 0x9f, 0x1d, 0x74, 0x4b, 0x67, 0x64, 0xa3, 0xc6, 0x48, 0x28, + 0x39, 0xff, 0xf5, 0xa1, 0xf9, 0x7f, 0x0a, 0x1f, 0x3d, 0x24, 0x94, 0x58, 0x22, 0xe8, 0x1b, 0x0d, + 0xbc, 0xf2, 0xf8, 0xe4, 0xc8, 0x52, 0x6c, 0x83, 0x99, 0x38, 0xcf, 0x35, 0x47, 0xe8, 0xc8, 0x16, + 0x5a, 0x1e, 0x71, 0xc7, 0xf6, 0x7b, 0x90, 0x45, 0x3a, 0xed, 0xf5, 0xfb, 0x45, 0x7f, 0x6a, 0x60, + 0xba, 0x5f, 0x13, 0xee, 0x80, 0x53, 0x3d, 0xd7, 0x3e, 0x66, 0xf2, 0xa7, 0x62, 0x33, 0xf5, 0x5e, + 0x98, 0x1d, 0xd8, 0x0b, 0x1c, 0x0c, 0x59, 0xcf, 0xc5, 0xe7, 0x8f, 0x31, 0x83, 0xd7, 0x01, 0xe0, + 0x49, 0xaa, 0xb9, 0xbe, 0x83, 0x6f, 0xcb, 0xc2, 0xbe, 0x9d, 0x3a, 0xe9, 0xb9, 0xc8, 0x93, 0x4c, + 0x37, 0xff, 0xa8, 0x72, 0xbc, 0xca, 0xd7, 0x27, 0xc1, 0x94, 0x48, 0x37, 0xfc, 0x51, 0x03, 0x62, + 0xc2, 0x28, 0x5c, 0x19, 0x31, 0x7f, 0x43, 0xab, 0xa2, 0xf0, 0xe6, 0x13, 0x58, 0x46, 0xe5, 0x44, + 0x97, 0xee, 0xfd, 0xfe, 0xcf, 0xb7, 0xe3, 0x3a, 0x5c, 0x34, 0x0e, 0x7b, 0xac, 0xf4, 0xde, 0x2a, + 0xf1, 0x5b, 0x43, 0x50, 0xfd, 0x45, 0x03, 0x93, 0x1c, 0x07, 0xbe, 0x91, 0xd6, 0xb3, 0xa2, 0xbc, + 0x92, 0xde, 0x50, 0x32, 0x7e, 0x47, 0x30, 0x5e, 0x81, 0xaf, 0xa7, 0x61, 0x6c, 0xdc, 0x91, 0x93, + 0x7b, 0x17, 0xfe, 0xac, 0x81, 0x4c, 0xb4, 0x1f, 0x60, 0xba, 0xbc, 0x25, 0x17, 0x55, 0x61, 0xf5, + 0x49, 0x4c, 0x65, 0x04, 0xcb, 0x22, 0x02, 0x03, 0x96, 0x47, 0x8d, 0x20, 0x62, 0xfb, 0x9f, 0x06, + 0x5e, 0x3c, 0x62, 0x3a, 0xe1, 0x07, 0x69, 0xe8, 0x3c, 0x7e, 0xff, 0x15, 0x3e, 0x7c, 0x26, 0x58, + 0x32, 0xd6, 0xaa, 0x88, 0x75, 0x1d, 0xae, 0x8d, 0x18, 0xeb, 0xe0, 0x6e, 0xa9, 0x6d, 0x93, 0xb0, + 0x16, 0x8a, 0x18, 0x1f, 0x69, 0xe0, 0x54, 0xdf, 0x83, 0x0f, 0x5e, 0x4e, 0xc3, 0xf4, 0xb0, 0x77, + 0x67, 0x61, 0xed, 0x29, 0x10, 0x64, 0x84, 0xa6, 0x88, 0xf0, 0x2d, 0xb8, 0x3a, 0x72, 0x3f, 0x4a, + 0x04, 0xe3, 0x8e, 0x7c, 0xcf, 0xde, 0x35, 0xaf, 0x3f, 0xd8, 0x2b, 0x6a, 0x0f, 0xf7, 0x8a, 0xda, + 0xdf, 0x7b, 0x45, 0xed, 0xfe, 0x7e, 0x71, 0xec, 0xe1, 0x7e, 0x71, 0xec, 0xd1, 0x7e, 0x71, 0xec, + 0x9a, 0x99, 0x58, 0x35, 0x12, 0xbf, 0xec, 0xd9, 0x75, 0x1a, 0x3b, 0xbb, 0xb9, 0x74, 0xc9, 0xb8, + 0x7d, 0xd4, 0x3f, 0x0c, 0xb1, 0x8a, 0xea, 0x19, 0xf1, 0x9b, 0x7e, 0xf1, 0xff, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xc1, 0xd2, 0x9c, 0x0e, 0x04, 0x0d, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1013,14 +1024,22 @@ func (m *FullPositionByOwnerResult) MarshalToSizedBuffer(dAtA []byte) (int, erro i = encodeVarintQuery(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x2a - n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.FrozenUntil, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.FrozenUntil):]) + dAtA[i] = 0x32 + n1, err1 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.FreezeDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.FreezeDuration):]) if err1 != nil { return 0, err1 } i -= n1 i = encodeVarintQuery(dAtA, i, uint64(n1)) i-- + dAtA[i] = 0x2a + n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.JoinTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.JoinTime):]) + if err2 != nil { + return 0, err2 + } + i -= n2 + i = encodeVarintQuery(dAtA, i, uint64(n2)) + i-- dAtA[i] = 0x22 if m.UpperTick != 0 { i = encodeVarintQuery(dAtA, i, uint64(m.UpperTick)) @@ -1425,7 +1444,9 @@ func (m *FullPositionByOwnerResult) Size() (n int) { if m.UpperTick != 0 { n += 1 + sovQuery(uint64(m.UpperTick)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.FrozenUntil) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.JoinTime) + n += 1 + l + sovQuery(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.FreezeDuration) n += 1 + l + sovQuery(uint64(l)) l = m.Liquidity.Size() n += 1 + l + sovQuery(uint64(l)) @@ -1813,7 +1834,7 @@ func (m *FullPositionByOwnerResult) Unmarshal(dAtA []byte) error { } case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrozenUntil", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field JoinTime", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -1840,11 +1861,44 @@ func (m *FullPositionByOwnerResult) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.FrozenUntil, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.JoinTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FreezeDuration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.FreezeDuration, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Liquidity", wireType) } diff --git a/x/concentrated-liquidity/types/tx.pb.go b/x/concentrated-liquidity/types/tx.pb.go index ffbb1b746db..86dd5c81ce3 100644 --- a/x/concentrated-liquidity/types/tx.pb.go +++ b/x/concentrated-liquidity/types/tx.pb.go @@ -44,7 +44,7 @@ type MsgCreatePosition struct { TokenDesired1 types.Coin `protobuf:"bytes,6,opt,name=token_desired1,json=tokenDesired1,proto3" json:"token_desired1" yaml:"token_desired1"` TokenMinAmount0 github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,7,opt,name=token_min_amount0,json=tokenMinAmount0,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"token_min_amount0" yaml:"token_min_amount0"` TokenMinAmount1 github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,8,opt,name=token_min_amount1,json=tokenMinAmount1,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"token_min_amount1" yaml:"token_min_amount1"` - FrozenUntil time.Time `protobuf:"bytes,9,opt,name=frozen_until,json=frozenUntil,proto3,stdtime" json:"frozen_until" yaml:"frozen_until"` + FreezeDuration time.Duration `protobuf:"bytes,9,opt,name=freeze_duration,json=freezeDuration,proto3,stdduration" json:"duration,omitempty" yaml:"freeze_duration"` } func (m *MsgCreatePosition) Reset() { *m = MsgCreatePosition{} } @@ -122,11 +122,11 @@ func (m *MsgCreatePosition) GetTokenDesired1() types.Coin { return types.Coin{} } -func (m *MsgCreatePosition) GetFrozenUntil() time.Time { +func (m *MsgCreatePosition) GetFreezeDuration() time.Duration { if m != nil { - return m.FrozenUntil + return m.FreezeDuration } - return time.Time{} + return 0 } type MsgCreatePositionResponse struct { @@ -175,7 +175,8 @@ type MsgWithdrawPosition struct { LowerTick int64 `protobuf:"varint,3,opt,name=lower_tick,json=lowerTick,proto3" json:"lower_tick,omitempty" yaml:"lower_tick"` UpperTick int64 `protobuf:"varint,4,opt,name=upper_tick,json=upperTick,proto3" json:"upper_tick,omitempty" yaml:"upper_tick"` LiquidityAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=liquidity_amount,json=liquidityAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"liquidity_amount" yaml:"liquidity_amount"` - FrozenUntil time.Time `protobuf:"bytes,6,opt,name=frozen_until,json=frozenUntil,proto3,stdtime" json:"frozen_until" yaml:"frozen_until"` + JoinTime time.Time `protobuf:"bytes,6,opt,name=join_time,json=joinTime,proto3,stdtime" json:"join_time" yaml:"join_time"` + FreezeDuration time.Duration `protobuf:"bytes,7,opt,name=freeze_duration,json=freezeDuration,proto3,stdduration" json:"duration,omitempty" yaml:"freeze_duration"` } func (m *MsgWithdrawPosition) Reset() { *m = MsgWithdrawPosition{} } @@ -239,13 +240,20 @@ func (m *MsgWithdrawPosition) GetUpperTick() int64 { return 0 } -func (m *MsgWithdrawPosition) GetFrozenUntil() time.Time { +func (m *MsgWithdrawPosition) GetJoinTime() time.Time { if m != nil { - return m.FrozenUntil + return m.JoinTime } return time.Time{} } +func (m *MsgWithdrawPosition) GetFreezeDuration() time.Duration { + if m != nil { + return m.FreezeDuration + } + return 0 +} + type MsgWithdrawPositionResponse struct { Amount0 github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=amount0,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"amount0" yaml:"amount0"` Amount1 github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=amount1,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"amount1" yaml:"amount1"` @@ -411,57 +419,61 @@ func init() { } var fileDescriptor_1f1fff802923d7db = []byte{ - // 793 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x56, 0x41, 0x4f, 0xdb, 0x48, - 0x14, 0xce, 0x10, 0x08, 0x9b, 0x61, 0x09, 0xc4, 0x2c, 0xbb, 0x26, 0xab, 0x8d, 0x23, 0x4b, 0xbb, - 0x9b, 0xd5, 0x0a, 0x1b, 0xb3, 0x8b, 0xb4, 0x42, 0x5a, 0x89, 0x1a, 0x54, 0x89, 0x4a, 0x91, 0x2a, - 0x8b, 0xaa, 0x12, 0xaa, 0x6a, 0x39, 0xf6, 0x60, 0x46, 0x71, 0x3c, 0xa9, 0x67, 0x02, 0xa4, 0xd7, - 0x5e, 0x7b, 0x40, 0xfd, 0x23, 0xfc, 0x0d, 0x0e, 0x3d, 0x70, 0x68, 0xa5, 0xaa, 0x87, 0xb4, 0x82, - 0x53, 0xaf, 0xf9, 0x05, 0x95, 0x3d, 0xb6, 0x13, 0x12, 0x2a, 0x11, 0xe0, 0x52, 0x4e, 0xf1, 0x7c, - 0xf3, 0xbe, 0xef, 0xf9, 0x7d, 0xf3, 0xde, 0xc4, 0xf0, 0x4f, 0x42, 0x9b, 0x84, 0x62, 0xaa, 0xda, - 0xc4, 0xb7, 0x91, 0xcf, 0x02, 0x8b, 0x21, 0x67, 0xd9, 0xc3, 0x2f, 0xda, 0xd8, 0xc1, 0xac, 0xa3, - 0xb2, 0x23, 0xa5, 0x15, 0x10, 0x46, 0x84, 0xdf, 0xe3, 0x40, 0x65, 0x30, 0x30, 0x8d, 0x53, 0x0e, - 0xb4, 0x3a, 0x62, 0x96, 0x56, 0xfa, 0xc9, 0x25, 0x2e, 0x89, 0x18, 0x6a, 0xf8, 0xc4, 0xc9, 0x25, - 0xc9, 0x25, 0xc4, 0xf5, 0x90, 0x1a, 0xad, 0xea, 0xed, 0x3d, 0x95, 0xe1, 0x26, 0xa2, 0xcc, 0x6a, - 0xb6, 0xe2, 0x80, 0xb2, 0x1d, 0xc9, 0xab, 0x75, 0x8b, 0x22, 0x35, 0xd6, 0x52, 0x6d, 0x82, 0x7d, - 0xbe, 0x2f, 0x7f, 0x99, 0x82, 0xc5, 0x1a, 0x75, 0x37, 0x03, 0x64, 0x31, 0xf4, 0x98, 0x50, 0xcc, - 0x30, 0xf1, 0x85, 0xbf, 0xe1, 0x74, 0x8b, 0x10, 0xcf, 0xc4, 0x8e, 0x08, 0x2a, 0xa0, 0x3a, 0xa9, - 0x0b, 0xbd, 0xae, 0x54, 0xe8, 0x58, 0x4d, 0x6f, 0x5d, 0x8e, 0x37, 0x64, 0x23, 0x17, 0x3e, 0x6d, - 0x3b, 0xc2, 0x5f, 0x30, 0x47, 0x91, 0xef, 0xa0, 0x40, 0x9c, 0xa8, 0x80, 0x6a, 0x5e, 0x2f, 0xf6, - 0xba, 0xd2, 0x2c, 0x8f, 0xe5, 0xb8, 0x6c, 0xc4, 0x01, 0xc2, 0xbf, 0x10, 0x7a, 0xe4, 0x10, 0x05, - 0x26, 0xc3, 0x76, 0x43, 0xcc, 0x56, 0x40, 0x35, 0xab, 0x2f, 0xf6, 0xba, 0x52, 0x91, 0x87, 0xf7, - 0xf7, 0x64, 0x23, 0x1f, 0x2d, 0x76, 0xb0, 0xdd, 0x08, 0x59, 0xed, 0x56, 0x2b, 0x61, 0x4d, 0x0e, - 0xb3, 0xfa, 0x7b, 0xb2, 0x91, 0x8f, 0x16, 0x11, 0xcb, 0x84, 0x05, 0x46, 0x1a, 0xc8, 0x37, 0x1d, - 0x44, 0x71, 0x80, 0x9c, 0x15, 0x71, 0xaa, 0x02, 0xaa, 0x33, 0xab, 0x4b, 0x0a, 0xb7, 0x44, 0x09, - 0x2d, 0x49, 0xec, 0x55, 0x36, 0x09, 0xf6, 0xf5, 0xdf, 0x4e, 0xbb, 0x52, 0xa6, 0xd7, 0x95, 0x16, - 0xb9, 0xf0, 0x65, 0xba, 0x6c, 0xcc, 0x46, 0xc0, 0x56, 0xbc, 0x1e, 0x49, 0xa0, 0x89, 0xb9, 0xdb, - 0x24, 0xd0, 0x86, 0x12, 0x68, 0xc2, 0x01, 0x2c, 0xf2, 0x88, 0x26, 0xf6, 0x4d, 0xab, 0x49, 0xda, - 0x3e, 0x5b, 0x11, 0xa7, 0x23, 0x8f, 0x1f, 0x85, 0x42, 0x1f, 0xbb, 0xd2, 0x1f, 0x2e, 0x66, 0xfb, - 0xed, 0xba, 0x62, 0x93, 0xa6, 0x1a, 0x9f, 0x34, 0xff, 0x59, 0xa6, 0x4e, 0x43, 0x65, 0x9d, 0x16, - 0xa2, 0xca, 0xb6, 0xcf, 0x7a, 0x5d, 0x49, 0x1c, 0x4c, 0x39, 0x20, 0x28, 0x1b, 0x73, 0x11, 0x56, - 0xc3, 0xfe, 0x03, 0x8e, 0x5c, 0x95, 0x57, 0x13, 0x7f, 0xb8, 0xdb, 0xbc, 0xda, 0x48, 0x5e, 0x4d, - 0x78, 0x0e, 0x7f, 0xdc, 0x0b, 0xc8, 0x4b, 0xe4, 0x9b, 0x6d, 0x9f, 0x61, 0x4f, 0xcc, 0x47, 0x76, - 0x96, 0x14, 0xde, 0xe3, 0x4a, 0xd2, 0xe3, 0xca, 0x4e, 0xd2, 0xe3, 0xba, 0x14, 0xfb, 0xb9, 0xc0, - 0x93, 0x0c, 0xb2, 0xe5, 0xe3, 0x4f, 0x12, 0x30, 0x66, 0x38, 0xf4, 0x24, 0x42, 0xde, 0x4e, 0xc0, - 0xa5, 0x91, 0x5e, 0x37, 0x10, 0x6d, 0x11, 0x9f, 0x22, 0x61, 0x17, 0x4e, 0x27, 0x1e, 0x83, 0xa8, - 0xd6, 0x8d, 0xb1, 0x6b, 0x8d, 0x27, 0x24, 0x75, 0x36, 0x11, 0xec, 0x6b, 0x6b, 0xf1, 0x8c, 0xdc, - 0x52, 0x5b, 0x4b, 0xb5, 0x35, 0xe1, 0x10, 0x16, 0xd3, 0xdb, 0xc2, 0xb4, 0xa3, 0xda, 0x9c, 0xa8, - 0xd5, 0xc7, 0x3b, 0xad, 0x2d, 0x64, 0xf7, 0x4f, 0x6b, 0x44, 0x50, 0x36, 0xe6, 0x53, 0x6c, 0x33, - 0x86, 0x4e, 0xb2, 0x70, 0xa1, 0x46, 0xdd, 0xa7, 0x98, 0xed, 0x3b, 0x81, 0x75, 0x78, 0xaf, 0x2e, - 0x0f, 0x06, 0xfb, 0xf5, 0xc6, 0x1d, 0x1b, 0x7b, 0xba, 0x3d, 0xb6, 0xa7, 0xbf, 0x0c, 0x7b, 0xca, - 0xf5, 0x64, 0x63, 0x2e, 0x85, 0xf8, 0x04, 0x8c, 0x0c, 0x40, 0xee, 0x8e, 0x07, 0xe0, 0x3d, 0x80, - 0xbf, 0x5e, 0x71, 0x62, 0xdf, 0xfb, 0x08, 0xc8, 0xef, 0x00, 0x2c, 0x84, 0x83, 0x4d, 0x3c, 0x0f, - 0xd9, 0xec, 0x21, 0x42, 0xf4, 0x3e, 0x34, 0xa1, 0xdc, 0x81, 0x3f, 0x5f, 0xae, 0x2a, 0x3d, 0x28, - 0x13, 0x16, 0x6c, 0x0e, 0x23, 0xc7, 0xdc, 0x43, 0x88, 0x8a, 0xa0, 0x92, 0x1d, 0xeb, 0xaf, 0xe7, - 0x32, 0x5d, 0x36, 0x66, 0x53, 0x20, 0x4c, 0xb4, 0x7a, 0x92, 0x85, 0xd9, 0x1a, 0x75, 0x85, 0xd7, - 0x00, 0x16, 0x86, 0xbe, 0x0d, 0xfe, 0x53, 0xae, 0xf5, 0xc1, 0xa2, 0x8c, 0xdc, 0xb4, 0xa5, 0x8d, - 0x9b, 0x32, 0xd3, 0xba, 0xdf, 0x00, 0x38, 0x3f, 0x72, 0xdf, 0xac, 0x5f, 0x5f, 0x76, 0x98, 0x5b, - 0xd2, 0x6f, 0xce, 0x4d, 0x5f, 0xea, 0x15, 0x80, 0x33, 0x83, 0xad, 0xb7, 0x36, 0x46, 0x99, 0x7d, - 0x5a, 0xe9, 0xff, 0x1b, 0xd1, 0x92, 0xb7, 0xd0, 0x9f, 0x9d, 0x9e, 0x97, 0xc1, 0xd9, 0x79, 0x19, - 0x7c, 0x3e, 0x2f, 0x83, 0xe3, 0x8b, 0x72, 0xe6, 0xec, 0xa2, 0x9c, 0xf9, 0x70, 0x51, 0xce, 0xec, - 0xea, 0x03, 0x03, 0x16, 0xa7, 0x58, 0xf6, 0xac, 0x3a, 0x4d, 0x16, 0xea, 0x81, 0xb6, 0xa6, 0x1e, - 0x7d, 0xf3, 0x3b, 0x35, 0x1c, 0xc0, 0x7a, 0x2e, 0xba, 0x7b, 0xfe, 0xf9, 0x1a, 0x00, 0x00, 0xff, - 0xff, 0x54, 0x0e, 0x4f, 0xe7, 0xd6, 0x0a, 0x00, 0x00, + // 856 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x56, 0x41, 0x8f, 0xdb, 0x44, + 0x14, 0xce, 0x34, 0x4b, 0xd2, 0x4c, 0xb5, 0xd9, 0x8d, 0xa1, 0xc5, 0x0d, 0x10, 0x47, 0x23, 0x01, + 0x41, 0xb0, 0x76, 0x5d, 0x8a, 0x54, 0x55, 0x42, 0x2a, 0xde, 0x15, 0xd2, 0x22, 0x45, 0x42, 0x56, + 0x11, 0x52, 0x85, 0x64, 0x39, 0xf6, 0xac, 0x3b, 0xc4, 0xf6, 0x18, 0xcf, 0x64, 0xb7, 0x41, 0xdc, + 0x38, 0x70, 0xe1, 0x50, 0x71, 0xe2, 0x07, 0x70, 0xe7, 0x6f, 0xf4, 0xc0, 0xa1, 0x07, 0x90, 0x10, + 0x07, 0x83, 0x76, 0x6f, 0x1c, 0xf3, 0x0b, 0x90, 0x3d, 0x63, 0x27, 0x9b, 0x2c, 0x52, 0xb3, 0x8b, + 0x90, 0xba, 0xa7, 0xe4, 0xbd, 0x79, 0xdf, 0xf7, 0x79, 0xde, 0xbc, 0xf7, 0x66, 0xe0, 0xdb, 0x94, + 0x45, 0x94, 0x11, 0x66, 0x78, 0x34, 0xf6, 0x70, 0xcc, 0x53, 0x97, 0x63, 0x7f, 0x27, 0x24, 0x5f, + 0x4d, 0x88, 0x4f, 0xf8, 0xd4, 0xe0, 0x8f, 0xf5, 0x24, 0xa5, 0x9c, 0x2a, 0x6f, 0xca, 0x40, 0x7d, + 0x31, 0xb0, 0x8a, 0xd3, 0x0f, 0xcd, 0x11, 0xe6, 0xae, 0xd9, 0x7d, 0x25, 0xa0, 0x01, 0x2d, 0x10, + 0x46, 0xfe, 0x4f, 0x80, 0xbb, 0x5a, 0x40, 0x69, 0x10, 0x62, 0xa3, 0xb0, 0x46, 0x93, 0x03, 0x83, + 0x93, 0x08, 0x33, 0xee, 0x46, 0x89, 0x0c, 0xe8, 0x2d, 0x07, 0xf8, 0x93, 0xd4, 0xe5, 0x84, 0xc6, + 0xe5, 0xba, 0x57, 0xc8, 0x1b, 0x23, 0x97, 0x61, 0x43, 0x6a, 0x19, 0x1e, 0x25, 0x72, 0x1d, 0x7d, + 0xd7, 0x80, 0x9d, 0x21, 0x0b, 0x76, 0x53, 0xec, 0x72, 0xfc, 0x29, 0x65, 0x24, 0xc7, 0x2a, 0xef, + 0xc2, 0x66, 0x42, 0x69, 0xe8, 0x10, 0x5f, 0x05, 0x7d, 0x30, 0xd8, 0xb0, 0x94, 0x59, 0xa6, 0xb5, + 0xa7, 0x6e, 0x14, 0xde, 0x43, 0x72, 0x01, 0xd9, 0x8d, 0xfc, 0xdf, 0xbe, 0xaf, 0xbc, 0x03, 0x1b, + 0x0c, 0xc7, 0x3e, 0x4e, 0xd5, 0x2b, 0x7d, 0x30, 0x68, 0x59, 0x9d, 0x59, 0xa6, 0x6d, 0x8a, 0x58, + 0xe1, 0x47, 0xb6, 0x0c, 0x50, 0xee, 0x40, 0x18, 0xd2, 0x23, 0x9c, 0x3a, 0x9c, 0x78, 0x63, 0xb5, + 0xde, 0x07, 0x83, 0xba, 0x75, 0x7d, 0x96, 0x69, 0x1d, 0x11, 0x3e, 0x5f, 0x43, 0x76, 0xab, 0x30, + 0x1e, 0x10, 0x6f, 0x9c, 0xa3, 0x26, 0x49, 0x52, 0xa2, 0x36, 0x96, 0x51, 0xf3, 0x35, 0x64, 0xb7, + 0x0a, 0xa3, 0x40, 0x39, 0xb0, 0xcd, 0xe9, 0x18, 0xc7, 0x8e, 0x8f, 0x19, 0x49, 0xb1, 0x7f, 0x4b, + 0x7d, 0xa9, 0x0f, 0x06, 0xd7, 0x6e, 0xdf, 0xd4, 0x45, 0x4a, 0xf4, 0x3c, 0x25, 0x65, 0xfa, 0xf5, + 0x5d, 0x4a, 0x62, 0xeb, 0x8d, 0xa7, 0x99, 0x56, 0x9b, 0x65, 0xda, 0x75, 0x41, 0x7c, 0x1a, 0x8e, + 0xec, 0xcd, 0xc2, 0xb1, 0x27, 0xed, 0x15, 0x01, 0x53, 0x6d, 0x5c, 0x44, 0xc0, 0x5c, 0x12, 0x30, + 0x95, 0x43, 0xd8, 0x11, 0x11, 0x11, 0x89, 0x1d, 0x37, 0xa2, 0x93, 0x98, 0xdf, 0x52, 0x9b, 0x45, + 0x8e, 0x3f, 0xc9, 0x89, 0xfe, 0xc8, 0xb4, 0xb7, 0x02, 0xc2, 0x1f, 0x4d, 0x46, 0xba, 0x47, 0x23, + 0x43, 0x9e, 0xb4, 0xf8, 0xd9, 0x61, 0xfe, 0xd8, 0xe0, 0xd3, 0x04, 0x33, 0x7d, 0x3f, 0xe6, 0xb3, + 0x4c, 0x53, 0x17, 0x25, 0x17, 0x08, 0x91, 0xbd, 0x55, 0xf8, 0x86, 0x24, 0xfe, 0x48, 0x78, 0xce, + 0xd2, 0x35, 0xd5, 0xab, 0xff, 0xad, 0xae, 0xb9, 0xa2, 0x6b, 0x2a, 0xdf, 0xc0, 0xad, 0x83, 0x14, + 0xe3, 0xaf, 0xb1, 0x53, 0x16, 0xb1, 0xda, 0x92, 0x19, 0x15, 0x55, 0xae, 0x97, 0x55, 0xae, 0xef, + 0xc9, 0x00, 0xeb, 0x6e, 0xfe, 0x41, 0x7f, 0x67, 0x9a, 0x52, 0x42, 0xde, 0xa3, 0x11, 0xe1, 0x38, + 0x4a, 0xf8, 0x74, 0x96, 0x69, 0x37, 0x84, 0xf8, 0x12, 0x2b, 0xfa, 0xf1, 0x4f, 0x0d, 0xd8, 0x6d, + 0xe1, 0x2d, 0x99, 0xd0, 0x2f, 0x57, 0xe0, 0xcd, 0x95, 0x4e, 0xb0, 0x31, 0x4b, 0x68, 0xcc, 0xb0, + 0xf2, 0x10, 0x36, 0xcb, 0x13, 0x00, 0x45, 0x26, 0xee, 0xaf, 0x9d, 0x09, 0xd9, 0x3f, 0x55, 0xde, + 0x4b, 0xc2, 0x39, 0xb7, 0x29, 0x3b, 0xe8, 0x82, 0xdc, 0x66, 0xc5, 0x6d, 0x2a, 0x47, 0xb0, 0x53, + 0xcd, 0x1a, 0xc7, 0x2b, 0xf6, 0xe6, 0x17, 0x8d, 0xb0, 0xde, 0x59, 0xee, 0x61, 0x6f, 0x7e, 0x96, + 0x2b, 0x84, 0xc8, 0xde, 0xae, 0x7c, 0xbb, 0xd2, 0xf5, 0xd3, 0x06, 0x7c, 0x79, 0xc8, 0x82, 0xcf, + 0x09, 0x7f, 0xe4, 0xa7, 0xee, 0xd1, 0xa5, 0x1a, 0x2d, 0x1c, 0xce, 0xf7, 0x2b, 0xeb, 0x59, 0xe6, + 0x74, 0x7f, 0xed, 0x9c, 0xbe, 0xba, 0x9c, 0x53, 0xc1, 0x87, 0xec, 0xad, 0xca, 0x25, 0xfa, 0x43, + 0xf9, 0x0c, 0xb6, 0xbe, 0xa4, 0x24, 0x76, 0xf2, 0x2b, 0x40, 0x8e, 0x9a, 0xee, 0x4a, 0x63, 0x3c, + 0x28, 0xef, 0x07, 0xeb, 0x75, 0x39, 0x6b, 0xb6, 0x85, 0x40, 0x05, 0x45, 0x4f, 0xf2, 0xea, 0xbf, + 0x9a, 0xdb, 0x79, 0xf0, 0x59, 0x5d, 0xd7, 0xfc, 0xff, 0xba, 0xee, 0x37, 0x00, 0x5f, 0x3b, 0xa3, + 0x4c, 0x5e, 0xf4, 0xbe, 0x43, 0xbf, 0x02, 0xd8, 0xce, 0xa7, 0x09, 0x0d, 0x43, 0xec, 0xf1, 0x8f, + 0x31, 0x66, 0x97, 0xa1, 0xf2, 0xd1, 0x14, 0xde, 0x38, 0xbd, 0xab, 0xea, 0xa0, 0x1c, 0xd8, 0xf6, + 0x84, 0x1b, 0xfb, 0xce, 0x01, 0xc6, 0x4c, 0x05, 0xfd, 0xfa, 0x5a, 0xb7, 0xe1, 0x69, 0x38, 0xb2, + 0x37, 0x2b, 0x47, 0x2e, 0x74, 0xfb, 0xe7, 0x3a, 0xac, 0x0f, 0x59, 0xa0, 0x7c, 0x0f, 0x60, 0x7b, + 0xe9, 0xb9, 0x72, 0x57, 0x7f, 0xae, 0x37, 0x96, 0xbe, 0x32, 0xde, 0xbb, 0xf7, 0xcf, 0x8b, 0xac, + 0xf6, 0xfd, 0x03, 0x80, 0xdb, 0x2b, 0x43, 0xee, 0xde, 0xf3, 0xd3, 0x2e, 0x63, 0xbb, 0xd6, 0xf9, + 0xb1, 0xd5, 0x47, 0x7d, 0x0b, 0xe0, 0xb5, 0xc5, 0xd2, 0xfb, 0x60, 0x8d, 0x6d, 0xce, 0x61, 0xdd, + 0x0f, 0xcf, 0x05, 0x2b, 0xbf, 0xc2, 0xfa, 0xe2, 0xe9, 0x71, 0x0f, 0x3c, 0x3b, 0xee, 0x81, 0xbf, + 0x8e, 0x7b, 0xe0, 0xc9, 0x49, 0xaf, 0xf6, 0xec, 0xa4, 0x57, 0xfb, 0xfd, 0xa4, 0x57, 0x7b, 0x68, + 0x2d, 0x34, 0x98, 0x94, 0xd8, 0x09, 0xdd, 0x11, 0x2b, 0x0d, 0xe3, 0xd0, 0xbc, 0x63, 0x3c, 0xfe, + 0xd7, 0xa7, 0x75, 0xde, 0x80, 0xa3, 0x46, 0x31, 0x96, 0xde, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, + 0x83, 0x05, 0x07, 0x41, 0x89, 0x0b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -636,7 +648,7 @@ func (m *MsgCreatePosition) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.FrozenUntil, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.FrozenUntil):]) + n1, err1 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.FreezeDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.FreezeDuration):]) if err1 != nil { return 0, err1 } @@ -782,13 +794,21 @@ func (m *MsgWithdrawPosition) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - n4, err4 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.FrozenUntil, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.FrozenUntil):]) + n4, err4 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.FreezeDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.FreezeDuration):]) if err4 != nil { return 0, err4 } i -= n4 i = encodeVarintTx(dAtA, i, uint64(n4)) i-- + dAtA[i] = 0x3a + n5, err5 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.JoinTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.JoinTime):]) + if err5 != nil { + return 0, err5 + } + i -= n5 + i = encodeVarintTx(dAtA, i, uint64(n5)) + i-- dAtA[i] = 0x32 { size := m.LiquidityAmount.Size() @@ -988,7 +1008,7 @@ func (m *MsgCreatePosition) Size() (n int) { n += 1 + l + sovTx(uint64(l)) l = m.TokenMinAmount1.Size() n += 1 + l + sovTx(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.FrozenUntil) + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.FreezeDuration) n += 1 + l + sovTx(uint64(l)) return n } @@ -1029,7 +1049,9 @@ func (m *MsgWithdrawPosition) Size() (n int) { } l = m.LiquidityAmount.Size() n += 1 + l + sovTx(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.FrozenUntil) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.JoinTime) + n += 1 + l + sovTx(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.FreezeDuration) n += 1 + l + sovTx(uint64(l)) return n } @@ -1344,7 +1366,7 @@ func (m *MsgCreatePosition) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrozenUntil", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FreezeDuration", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -1371,7 +1393,7 @@ func (m *MsgCreatePosition) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.FrozenUntil, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.FreezeDuration, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -1702,7 +1724,40 @@ func (m *MsgWithdrawPosition) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrozenUntil", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field JoinTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.JoinTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FreezeDuration", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -1729,7 +1784,7 @@ func (m *MsgWithdrawPosition) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.FrozenUntil, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.FreezeDuration, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/gamm/keeper/migrate.go b/x/gamm/keeper/migrate.go index 37214d4672d..33814257501 100644 --- a/x/gamm/keeper/migrate.go +++ b/x/gamm/keeper/migrate.go @@ -3,7 +3,6 @@ package keeper import ( "fmt" "sort" - "time" "github.com/osmosis-labs/osmosis/osmoutils" cltypes "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/types" @@ -45,7 +44,7 @@ func (k Keeper) MigrateFromBalancerToConcentrated(ctx sdk.Context, sender sdk.Ac } // Create a full range (min to max tick) concentrated liquidity position. - amount0, amount1, liquidity, err = k.clKeeper.CreateFullRangePosition(ctx, concentratedPool, sender, exitCoins, time.Time{}) + amount0, amount1, liquidity, err = k.clKeeper.CreateFullRangePosition(ctx, concentratedPool, sender, exitCoins, 0) if err != nil { return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, err } diff --git a/x/gamm/keeper/migrate_test.go b/x/gamm/keeper/migrate_test.go index ce12fc2c7a5..fd7cce20f2f 100644 --- a/x/gamm/keeper/migrate_test.go +++ b/x/gamm/keeper/migrate_test.go @@ -2,7 +2,6 @@ package keeper_test import ( "fmt" - "time" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -22,6 +21,7 @@ func (suite *KeeperTestSuite) TestMigrate() { AdditiveTolerance: sdk.NewDec(100), RoundingDir: osmomath.RoundDown, } + defaultJoinTime := suite.Ctx.BlockTime() type param struct { sender sdk.AccAddress @@ -46,7 +46,7 @@ func (suite *KeeperTestSuite) TestMigrate() { sharesToMigrateAmount: defaultGammShares.Amount, }, sharesToCreate: defaultGammShares.Amount, - expectedPosition: &model.Position{Liquidity: sdk.MustNewDecFromStr("100000000000.000000010000000000")}, + expectedPosition: &model.Position{Liquidity: sdk.MustNewDecFromStr("100000000000.000000010000000000"), JoinTime: defaultJoinTime}, setupPoolMigrationLink: true, errTolerance: defaultErrorTolerance, }, @@ -58,7 +58,7 @@ func (suite *KeeperTestSuite) TestMigrate() { sharesToMigrateAmount: defaultGammShares.Amount, }, sharesToCreate: defaultGammShares.Amount, - expectedPosition: &model.Position{Liquidity: sdk.MustNewDecFromStr("100000000000.000000010000000000")}, + expectedPosition: &model.Position{Liquidity: sdk.MustNewDecFromStr("100000000000.000000010000000000"), JoinTime: defaultJoinTime}, setupPoolMigrationLink: false, expectedErr: types.PoolMigrationLinkNotFoundError{PoolIdLeaving: 1}, errTolerance: defaultErrorTolerance, @@ -71,7 +71,7 @@ func (suite *KeeperTestSuite) TestMigrate() { sharesToMigrateAmount: defaultGammShares.Amount.Quo(sdk.NewInt(2)), }, sharesToCreate: defaultGammShares.Amount, - expectedPosition: &model.Position{Liquidity: sdk.MustNewDecFromStr("50000000000.000000005000000000")}, + expectedPosition: &model.Position{Liquidity: sdk.MustNewDecFromStr("50000000000.000000005000000000"), JoinTime: defaultJoinTime}, setupPoolMigrationLink: true, errTolerance: defaultErrorTolerance, }, @@ -83,7 +83,7 @@ func (suite *KeeperTestSuite) TestMigrate() { sharesToMigrateAmount: defaultGammShares.Amount.Quo(sdk.NewInt(2)), }, sharesToCreate: defaultGammShares.Amount.Mul(sdk.NewInt(2)), - expectedPosition: &model.Position{Liquidity: sdk.MustNewDecFromStr("49999999999.000000004999999999")}, + expectedPosition: &model.Position{Liquidity: sdk.MustNewDecFromStr("49999999999.000000004999999999"), JoinTime: defaultJoinTime}, setupPoolMigrationLink: true, errTolerance: defaultErrorTolerance, }, @@ -95,7 +95,7 @@ func (suite *KeeperTestSuite) TestMigrate() { sharesToMigrateAmount: invalidGammShares.Amount, }, sharesToCreate: defaultGammShares.Amount, - expectedPosition: &model.Position{Liquidity: sdk.MustNewDecFromStr("100000000000.000000010000000000")}, + expectedPosition: &model.Position{Liquidity: sdk.MustNewDecFromStr("100000000000.000000010000000000"), JoinTime: defaultJoinTime}, setupPoolMigrationLink: true, expectedErr: sdkerrors.Wrap(sdkerrors.ErrInsufficientFunds, fmt.Sprintf("%s is smaller than %s", defaultGammShares, invalidGammShares)), }, @@ -103,6 +103,7 @@ func (suite *KeeperTestSuite) TestMigrate() { for _, test := range tests { suite.SetupTest() + suite.Ctx = suite.Ctx.WithBlockTime(defaultJoinTime) keeper := suite.App.GAMMKeeper // Prepare both balancer and concentrated pools @@ -166,7 +167,7 @@ func (suite *KeeperTestSuite) TestMigrate() { // Assure the position was not created. // TODO: When we implement lock breaking, we need to change time.Time{} to the lock's end time. - _, err := suite.App.ConcentratedLiquidityKeeper.GetPosition(suite.Ctx, clPool.GetId(), test.param.sender, minTick, maxTick, time.Time{}) + _, err := suite.App.ConcentratedLiquidityKeeper.GetPosition(suite.Ctx, clPool.GetId(), test.param.sender, minTick, maxTick, defaultJoinTime, 0) suite.Require().Error(err) continue } @@ -186,7 +187,7 @@ func (suite *KeeperTestSuite) TestMigrate() { // Assure the expected position was created. // TODO: When we implement lock breaking, we need to change time.Time{} to the lock's end time. - position, err := suite.App.ConcentratedLiquidityKeeper.GetPosition(suite.Ctx, clPool.GetId(), test.param.sender, minTick, maxTick, time.Time{}) + position, err := suite.App.ConcentratedLiquidityKeeper.GetPosition(suite.Ctx, clPool.GetId(), test.param.sender, minTick, maxTick, defaultJoinTime, 0) suite.Require().NoError(err) suite.Require().Equal(test.expectedPosition, position) diff --git a/x/gamm/types/expected_keepers.go b/x/gamm/types/expected_keepers.go index 76bc5a0d1af..6bc5f90d391 100644 --- a/x/gamm/types/expected_keepers.go +++ b/x/gamm/types/expected_keepers.go @@ -50,7 +50,7 @@ type CommunityPoolKeeper interface { // CLKeeper defines the contract needed to be fulfilled for the concentrated liquidity keeper. type CLKeeper interface { GetPoolFromPoolIdAndConvertToConcentrated(ctx sdk.Context, poolId uint64) (cltypes.ConcentratedPoolExtension, error) - CreateFullRangePosition(ctx sdk.Context, concentratedPool cltypes.ConcentratedPoolExtension, owner sdk.AccAddress, coins sdk.Coins, frozenUntil time.Time) (amount0, amount1 sdk.Int, liquidity sdk.Dec, err error) + CreateFullRangePosition(ctx sdk.Context, concentratedPool cltypes.ConcentratedPoolExtension, owner sdk.AccAddress, coins sdk.Coins, freezeDuration time.Duration) (amount0, amount1 sdk.Int, liquidity sdk.Dec, err error) } // PoolManager defines the interface needed to be fulfilled for diff --git a/x/superfluid/keeper/migrate.go b/x/superfluid/keeper/migrate.go index 28bc2ad6cad..4dca4989cc3 100644 --- a/x/superfluid/keeper/migrate.go +++ b/x/superfluid/keeper/migrate.go @@ -12,46 +12,46 @@ import ( // UnlockAndMigrate unlocks a balancer pool lock, exits the pool and migrates the LP position to a full range concentrated liquidity position. // If the lock is superfluid delegated, it will undelegate the superfluid position. // Errors if the lock is not found, if the lock is not a balancer pool lock, or if the lock is not owned by the sender. -func (k Keeper) UnlockAndMigrate(ctx sdk.Context, sender sdk.AccAddress, lockId uint64, sharesToMigrate sdk.Coin) (amount0, amount1 sdk.Int, liquidity sdk.Dec, poolIdLeaving, poolIdEntering, newLockId uint64, frozenUntil time.Time, err error) { +func (k Keeper) UnlockAndMigrate(ctx sdk.Context, sender sdk.AccAddress, lockId uint64, sharesToMigrate sdk.Coin) (amount0, amount1 sdk.Int, liquidity sdk.Dec, poolIdLeaving, poolIdEntering, newLockId uint64, freezeDuration time.Duration, err error) { // Get the balancer poolId by parsing the gamm share denom. poolIdLeaving = gammtypes.MustGetPoolIdFromShareDenom(sharesToMigrate.Denom) // Ensure a governance sanctioned link exists between the balancer pool and the concentrated pool. poolIdEntering, err = k.gk.GetLinkedConcentratedPoolID(ctx, poolIdLeaving) if err != nil { - return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, time.Time{}, err + return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, 0, err } // Get the concentrated pool from the provided ID and type cast it to ConcentratedPoolExtension. concentratedPool, err := k.clk.GetPoolFromPoolIdAndConvertToConcentrated(ctx, poolIdEntering) if err != nil { - return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, time.Time{}, err + return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, 0, err } // Check that lockID corresponds to sender, and contains correct denomination of LP shares. lock, err := k.validateLockForUnpool(ctx, sender, poolIdLeaving, lockId) if err != nil { - return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, time.Time{}, err + return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, 0, err } gammSharesInLock := lock.Coins[0] preUnlockLock := *lock // Before we break the lock, we must note the time remaining on the lock. // We will be freezing the concentrated liquidity position for this duration. - freezeDuration := k.getExistingLockRemainingDuration(ctx, lock) + freezeDuration = k.getExistingLockRemainingDuration(ctx, lock) // If superfluid delegated, superfluid undelegate // This also burns the underlying synthetic osmo err = k.unbondSuperfluidIfExists(ctx, sender, lockId) if err != nil { - return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, time.Time{}, err + return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, 0, err } // Finish unlocking directly for locked locks // this also unlocks locks that were in the unlocking queue err = k.lk.ForceUnlock(ctx, *lock) if err != nil { - return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, time.Time{}, err + return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, 0, err } // If shares to migrate is not specified, we migrate all shares. @@ -61,25 +61,23 @@ func (k Keeper) UnlockAndMigrate(ctx sdk.Context, sender sdk.AccAddress, lockId // Otherwise, we must ensure that the shares to migrate is less than or equal to the shares in the lock. if sharesToMigrate.Amount.GT(gammSharesInLock.Amount) { - return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, time.Time{}, fmt.Errorf("shares to migrate must be less than or equal to shares in lock") + return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, 0, fmt.Errorf("shares to migrate must be less than or equal to shares in lock") } // Exit the balancer pool position. exitCoins, err := k.gk.ExitPool(ctx, sender, poolIdLeaving, sharesToMigrate.Amount, sdk.NewCoins()) if err != nil { - return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, time.Time{}, err + return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, 0, err } // Defense in depth, ensuring we are returning exactly two coins. if len(exitCoins) != 2 { - return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, time.Time{}, fmt.Errorf("Balancer pool must have exactly two tokens") + return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, 0, fmt.Errorf("Balancer pool must have exactly two tokens") } - frozenUntil = ctx.BlockTime().Add(freezeDuration) - // Create a full range (min to max tick) concentrated liquidity position. - amount0, amount1, liquidity, err = k.clk.CreateFullRangePosition(ctx, concentratedPool, sender, exitCoins, frozenUntil) + amount0, amount1, liquidity, err = k.clk.CreateFullRangePosition(ctx, concentratedPool, sender, exitCoins, freezeDuration) if err != nil { - return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, time.Time{}, err + return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, 0, err } // If there are remaining gamm shares, we must re-lock them. @@ -88,16 +86,16 @@ func (k Keeper) UnlockAndMigrate(ctx sdk.Context, sender sdk.AccAddress, lockId newLock, err := k.lk.CreateLock(ctx, sender, sdk.NewCoins(remainingGammShares), freezeDuration) newLockId = newLock.ID if err != nil { - return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, time.Time{}, err + return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, 0, err } // If the lock was unlocking, we begin the unlock from where it left off. if preUnlockLock.IsUnlocking() { _, err := k.lk.BeginForceUnlock(ctx, newLock.ID, newLock.Coins) if err != nil { - return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, time.Time{}, err + return sdk.Int{}, sdk.Int{}, sdk.Dec{}, 0, 0, 0, 0, err } } } - return amount0, amount1, liquidity, poolIdLeaving, poolIdEntering, newLockId, frozenUntil, nil + return amount0, amount1, liquidity, poolIdLeaving, poolIdEntering, newLockId, freezeDuration, nil } diff --git a/x/superfluid/keeper/migrate_test.go b/x/superfluid/keeper/migrate_test.go index 1af63ec95de..a66d331adf4 100644 --- a/x/superfluid/keeper/migrate_test.go +++ b/x/superfluid/keeper/migrate_test.go @@ -1,8 +1,6 @@ package keeper_test import ( - "time" - "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -23,6 +21,7 @@ import ( // 4. Migrating lock that is superfluid undelegating, not unlocking. // 5. Migrating lock that is superfluid undelegating, unlocking. func (suite *KeeperTestSuite) TestUnlockAndMigrate() { + defaultJoinTime := suite.Ctx.BlockTime() testCases := []struct { name string superfluidDelegated bool @@ -71,6 +70,7 @@ func (suite *KeeperTestSuite) TestUnlockAndMigrate() { tc := tc suite.Run(tc.name, func() { suite.SetupTest() + suite.Ctx = suite.Ctx.WithBlockTime(defaultJoinTime) ctx := suite.Ctx bankKeeper := suite.App.BankKeeper gammKeeper := suite.App.GAMMKeeper @@ -172,9 +172,6 @@ func (suite *KeeperTestSuite) TestUnlockAndMigrate() { } } - // add time to current time to test lock end time - ctx = ctx.WithBlockTime(ctx.BlockTime().Add(time.Hour * 24)) - lock, err := lockupKeeper.GetLockByID(ctx, lockID) suite.Require().NoError(err) @@ -183,7 +180,7 @@ func (suite *KeeperTestSuite) TestUnlockAndMigrate() { coinsToMigrate.Amount = coinsToMigrate.Amount.ToDec().Mul(tc.percentOfSharesToMigrate).RoundInt() // Run the unlock and migrate logic. - amount0, amount1, _, poolIdLeaving, poolIdEntering, newLockId, frozenUntil, err := superfluidKeeper.UnlockAndMigrate(ctx, poolJoinAcc, lockID, coinsToMigrate) + amount0, amount1, _, poolIdLeaving, poolIdEntering, newLockId, freezeDuration, err := superfluidKeeper.UnlockAndMigrate(ctx, poolJoinAcc, lockID, coinsToMigrate) suite.Require().NoError(err) suite.AssertEventEmitted(ctx, gammtypes.TypeEvtPoolExited, 1) @@ -200,7 +197,7 @@ func (suite *KeeperTestSuite) TestUnlockAndMigrate() { // Check that concentrated liquidity position now exists minTick, maxTick := cl.GetMinAndMaxTicksFromExponentAtPriceOne(clPool.GetPrecisionFactorAtPriceOne()) - position, err := suite.App.ConcentratedLiquidityKeeper.GetPosition(ctx, poolIdEntering, poolJoinAcc, minTick, maxTick, frozenUntil) + position, err := suite.App.ConcentratedLiquidityKeeper.GetPosition(ctx, poolIdEntering, poolJoinAcc, minTick, maxTick, defaultJoinTime, freezeDuration) suite.Require().NoError(err) suite.Require().NotNil(position) diff --git a/x/superfluid/keeper/msg_server.go b/x/superfluid/keeper/msg_server.go index 1c351372c7b..4137281949a 100644 --- a/x/superfluid/keeper/msg_server.go +++ b/x/superfluid/keeper/msg_server.go @@ -173,7 +173,7 @@ func (server msgServer) UnlockAndMigrateSharesToFullRangeConcentratedPosition(go return nil, err } - amount0, amount1, liquidity, poolIdLeaving, poolIdEntering, newLockId, frozenUntil, err := server.keeper.UnlockAndMigrate(ctx, sender, msg.LockId, msg.SharesToMigrate) + amount0, amount1, liquidity, poolIdLeaving, poolIdEntering, newLockId, freezeDuration, err := server.keeper.UnlockAndMigrate(ctx, sender, msg.LockId, msg.SharesToMigrate) if err != nil { return nil, err } @@ -184,7 +184,7 @@ func (server msgServer) UnlockAndMigrateSharesToFullRangeConcentratedPosition(go sdk.NewAttribute(types.AttributeKeyPoolIdEntering, strconv.FormatUint(poolIdEntering, 10)), sdk.NewAttribute(types.AttributeKeyPoolIdLeaving, strconv.FormatUint(poolIdLeaving, 10)), sdk.NewAttribute(types.AttributeNewLockId, strconv.FormatUint(newLockId, 10)), - sdk.NewAttribute(types.AttributeKeyPoolIdLeaving, frozenUntil.String()), + sdk.NewAttribute(types.AttributeKeyPoolIdLeaving, freezeDuration.String()), ), }) diff --git a/x/superfluid/types/events.go b/x/superfluid/types/events.go index 9405e560233..15156d6d908 100644 --- a/x/superfluid/types/events.go +++ b/x/superfluid/types/events.go @@ -17,7 +17,8 @@ const ( AttributeKeyPoolIdEntering = "pool_id_entering" AttributeKeyPoolIdLeaving = "pool_id_leaving" AttributeNewLockId = "new_lock_id" - AttributeFrozenUntil = "frozen_until" + AttributeFreezeDuration = "freeze_duration" + AttributeJoinTime = "join_time" AttributeDenom = "denom" AttributeSuperfluidAssetType = "superfluid_asset_type" diff --git a/x/superfluid/types/expected_keepers.go b/x/superfluid/types/expected_keepers.go index 1cc2f37e8d7..6c2bad9d131 100644 --- a/x/superfluid/types/expected_keepers.go +++ b/x/superfluid/types/expected_keepers.go @@ -101,5 +101,5 @@ type EpochKeeper interface { type ConcentratedKeeper interface { GetPoolFromPoolIdAndConvertToConcentrated(ctx sdk.Context, poolId uint64) (cltypes.ConcentratedPoolExtension, error) - CreateFullRangePosition(ctx sdk.Context, concentratedPool cltypes.ConcentratedPoolExtension, owner sdk.AccAddress, coins sdk.Coins, frozenUntil time.Time) (amount0, amount1 sdk.Int, liquidity sdk.Dec, err error) + CreateFullRangePosition(ctx sdk.Context, concentratedPool cltypes.ConcentratedPoolExtension, owner sdk.AccAddress, coins sdk.Coins, freezeDuration time.Duration) (amount0, amount1 sdk.Int, liquidity sdk.Dec, err error) } From 78090a5a9f87281fd8c09af42fcb7603557f7d81 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Fri, 3 Mar 2023 02:28:45 -0800 Subject: [PATCH 108/136] e2e passing --- go.sum | 5 - osmoutils/encoding_helper_test.go | 19 --- proto/osmosis/protorev/v1beta1/query.proto | 6 +- tests/e2e/configurer/chain/commands.go | 1 + x/concentrated-liquidity/model/position.pb.go | 44 +++--- x/concentrated-liquidity/types/query.pb.go | 130 +++++++++--------- x/concentrated-liquidity/types/tx.pb.go | 68 ++++----- 7 files changed, 126 insertions(+), 147 deletions(-) diff --git a/go.sum b/go.sum index 953954f8c2d..3b70fbb4b48 100644 --- a/go.sum +++ b/go.sum @@ -861,13 +861,8 @@ github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 h1:Ylmch github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3/go.mod h1:lV6KnqXYD/ayTe7310MHtM3I2q8Z6bBfMAi+bhwPYtI= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260 h1:+EbINXzHQyDtHje2CND357A22H2zUpceTtwJClC9IAM= github.com/osmosis-labs/osmosis/osmomath v0.0.0-20230105183030-bccf5202f260/go.mod h1:KrzYoNtnWUH75rj1XAsSR4nymlHFU7jeVOx7/1KMe0k= -<<<<<<< HEAD -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303071320-b117f72bd7ae h1:zQJWOnUMiUWCzqTdOsPLJHEnt08UV4qvCzl6NrDEYvc= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303071320-b117f72bd7ae/go.mod h1:fHfEDIHu347XE+64DISa7LJ5OOWpubz+6H28huZ90fo= -======= github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303084731-71ab5decdfa1 h1:PeBYW7Jze++bdl0PddxTVh/2xllNuu7Wol8cPEsnZXE= github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303084731-71ab5decdfa1/go.mod h1:fHfEDIHu347XE+64DISa7LJ5OOWpubz+6H28huZ90fo= ->>>>>>> b00f5461b ([CL Incentives][bugfix]: Replace all uses of frozenUntil with joinTime and freezeDuration) github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8 h1:Ov+gyEBpU2hJkLIFAHCcQZwehCSCXFNYzqQY1zJqSXk= github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8/go.mod h1:Kh2V4fLvLM4/EagRX53CYDJnILAz9NzCCETKXoH/sno= github.com/osmosis-labs/wasmd v0.30.0-osmo-v15 h1:vjbzq9ta/KmQwUM6PcRmrBJuDwILgLbV4POypC1Uhn8= diff --git a/osmoutils/encoding_helper_test.go b/osmoutils/encoding_helper_test.go index e1f83080373..35690501b34 100644 --- a/osmoutils/encoding_helper_test.go +++ b/osmoutils/encoding_helper_test.go @@ -1,10 +1,8 @@ package osmoutils import ( - "fmt" "math" "testing" - "time" "github.com/stretchr/testify/assert" ) @@ -29,20 +27,3 @@ func TestFormatFixedLengthU64(t *testing.T) { }) } } - -func TestParseTimeString(t *testing.T) { - tests := map[string]struct { - timeStr string - want time.Time - }{ - "0": {"2023-03-03 08:59:42.68331893 +0000 UTC", time.Now()}, - } - for name, tt := range tests { - t.Run(name, func(t *testing.T) { - got, err := ParseTimeString(tt.timeStr) - assert.NoError(t, err) - fmt.Println(got) - - }) - } -} diff --git a/proto/osmosis/protorev/v1beta1/query.proto b/proto/osmosis/protorev/v1beta1/query.proto index 6c95dcfae42..7e92e4e1e0b 100644 --- a/proto/osmosis/protorev/v1beta1/query.proto +++ b/proto/osmosis/protorev/v1beta1/query.proto @@ -245,8 +245,10 @@ message QueryGetProtoRevPoolWeightsRequest {} // Query/GetProtoRevPoolWeights RPC method. message QueryGetProtoRevPoolWeightsResponse { // pool_weights is a list of all of the pool weights - PoolWeights pool_weights = 1 - [ (gogoproto.moretags) = "yaml:\"pool_weights\"", (gogoproto.nullable) = false ]; + PoolWeights pool_weights = 1 [ + (gogoproto.moretags) = "yaml:\"pool_weights\"", + (gogoproto.nullable) = false + ]; } // QueryGetProtoRevMaxPoolPointsPerBlockRequest is request type for the diff --git a/tests/e2e/configurer/chain/commands.go b/tests/e2e/configurer/chain/commands.go index 20a524124fd..b579232fc27 100644 --- a/tests/e2e/configurer/chain/commands.go +++ b/tests/e2e/configurer/chain/commands.go @@ -11,6 +11,7 @@ import ( "github.com/tendermint/tendermint/libs/bytes" + "github.com/osmosis-labs/osmosis/osmoutils" appparams "github.com/osmosis-labs/osmosis/v15/app/params" "github.com/osmosis-labs/osmosis/v15/tests/e2e/configurer/config" "github.com/osmosis-labs/osmosis/v15/tests/e2e/initialization" diff --git a/x/concentrated-liquidity/model/position.pb.go b/x/concentrated-liquidity/model/position.pb.go index 56505b09777..4d8edc29c9e 100644 --- a/x/concentrated-liquidity/model/position.pb.go +++ b/x/concentrated-liquidity/model/position.pb.go @@ -99,28 +99,28 @@ var fileDescriptor_ffdfd7b30d37d326 = []byte{ // 388 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0x4d, 0x4b, 0xe3, 0x40, 0x18, 0xc7, 0x93, 0x2e, 0x2c, 0x6d, 0x16, 0x76, 0x97, 0xb0, 0x2c, 0x6d, 0x90, 0xa4, 0x04, 0x94, - 0x1e, 0xcc, 0x0c, 0x55, 0x0f, 0xe2, 0x31, 0xf4, 0x03, 0x48, 0xd1, 0x8b, 0x08, 0x35, 0x2f, 0xd3, - 0x38, 0x9a, 0xc9, 0xc4, 0xcc, 0xa4, 0x18, 0xf1, 0x43, 0xf4, 0xe8, 0xd7, 0xf1, 0xd6, 0x63, 0x8f, - 0xe2, 0x21, 0x4a, 0x7b, 0xf3, 0xd8, 0x4f, 0x20, 0x79, 0x6d, 0xa9, 0x78, 0x4a, 0x9e, 0xe1, 0xff, - 0xfc, 0x9e, 0xdf, 0x0c, 0x8f, 0x64, 0x50, 0x46, 0x28, 0xc3, 0x0c, 0x3a, 0x34, 0x70, 0x50, 0xc0, - 0x23, 0x8b, 0x23, 0xd7, 0xf0, 0xf1, 0x5d, 0x8c, 0x5d, 0xcc, 0x13, 0x18, 0x52, 0x86, 0x39, 0xa6, - 0x01, 0x08, 0x23, 0xca, 0xa9, 0xbc, 0x5b, 0xc6, 0xc1, 0x66, 0xbc, 0x4e, 0x83, 0x49, 0xdf, 0x46, - 0xdc, 0xea, 0x2b, 0x1d, 0x27, 0xcf, 0x8d, 0xf2, 0x26, 0x58, 0x14, 0x05, 0x41, 0xd1, 0x3c, 0x4a, - 0x3d, 0x1f, 0xc1, 0xbc, 0xb2, 0xe3, 0x31, 0xe4, 0x98, 0x20, 0xc6, 0x2d, 0x12, 0x96, 0x01, 0x75, - 0x3b, 0xe0, 0xc6, 0x91, 0xb5, 0x56, 0x50, 0xfe, 0x79, 0xd4, 0xa3, 0x05, 0x38, 0xfb, 0x2b, 0x4e, - 0xf5, 0xe7, 0x86, 0xd4, 0x3c, 0x2d, 0x5d, 0xe5, 0x2b, 0xa9, 0x55, 0x3b, 0xb5, 0xc5, 0xae, 0xd8, - 0x6b, 0x99, 0xe6, 0x2c, 0xd5, 0x84, 0xd7, 0x54, 0xdb, 0xf3, 0x30, 0xbf, 0x8e, 0x6d, 0xe0, 0x50, - 0x52, 0x7a, 0x95, 0x1f, 0x83, 0xb9, 0xb7, 0x90, 0x27, 0x21, 0x62, 0x60, 0x80, 0x9c, 0x55, 0xaa, - 0xfd, 0x4d, 0x2c, 0xe2, 0x9f, 0xe8, 0x35, 0x48, 0x1f, 0xae, 0xa1, 0xf2, 0xb9, 0xd4, 0xba, 0xa1, - 0x38, 0x18, 0x65, 0xf2, 0xed, 0x46, 0x57, 0xec, 0xfd, 0x3a, 0x50, 0x40, 0x21, 0x0e, 0x2a, 0x71, - 0x70, 0x56, 0xdd, 0xcc, 0xdc, 0xc9, 0xa6, 0xaf, 0x99, 0x75, 0xab, 0x3e, 0x7d, 0xd3, 0xc4, 0x61, - 0x33, 0xab, 0xb3, 0xb0, 0xfc, 0x28, 0xfd, 0x19, 0x47, 0x08, 0x3d, 0xa0, 0x51, 0x75, 0xe9, 0xf6, - 0x8f, 0x1c, 0xde, 0xf9, 0x02, 0x1f, 0x94, 0x01, 0xf3, 0x38, 0x63, 0x7f, 0xa4, 0x9a, 0x5c, 0xb5, - 0xec, 0x53, 0x82, 0x39, 0x22, 0x21, 0x4f, 0x56, 0xa9, 0xf6, 0xbf, 0x98, 0xb8, 0x45, 0xd5, 0x9f, - 0xb2, 0xb9, 0xbf, 0x8b, 0xd3, 0x9a, 0x74, 0x39, 0x5b, 0xa8, 0xe2, 0x7c, 0xa1, 0x8a, 0xef, 0x0b, - 0x55, 0x9c, 0x2e, 0x55, 0x61, 0xbe, 0x54, 0x85, 0x97, 0xa5, 0x2a, 0x5c, 0x98, 0x1b, 0xaf, 0x56, - 0x6e, 0x80, 0xe1, 0x5b, 0x36, 0xab, 0x0a, 0x38, 0xe9, 0x1f, 0xc1, 0xfb, 0xef, 0x76, 0x88, 0x50, - 0x17, 0xf9, 0xf6, 0xcf, 0x5c, 0xfd, 0xf0, 0x33, 0x00, 0x00, 0xff, 0xff, 0x61, 0x25, 0x86, 0x64, + 0x1e, 0xcc, 0x0c, 0x55, 0x04, 0xf1, 0x18, 0xfa, 0x01, 0xa4, 0xe8, 0x45, 0x84, 0x9a, 0x97, 0x69, + 0x1c, 0xcd, 0x64, 0x62, 0x66, 0x52, 0x8c, 0xf8, 0x21, 0x7a, 0xf4, 0xeb, 0x78, 0xeb, 0xb1, 0x47, + 0xf1, 0x10, 0xa5, 0xbd, 0x79, 0xec, 0x27, 0x90, 0xbc, 0xb6, 0x54, 0x3c, 0x25, 0xcf, 0xf0, 0x7f, + 0x7e, 0xcf, 0x6f, 0x86, 0x47, 0x32, 0x28, 0x23, 0x94, 0x61, 0x06, 0x1d, 0x1a, 0x38, 0x28, 0xe0, + 0x91, 0xc5, 0x91, 0x6b, 0xf8, 0xf8, 0x2e, 0xc6, 0x2e, 0xe6, 0x09, 0x0c, 0x29, 0xc3, 0x1c, 0xd3, + 0x00, 0x84, 0x11, 0xe5, 0x54, 0xde, 0x2d, 0xe3, 0x60, 0x33, 0x5e, 0xa7, 0xc1, 0xa4, 0x6f, 0x23, + 0x6e, 0xf5, 0x95, 0x8e, 0x93, 0xe7, 0x46, 0x79, 0x13, 0x2c, 0x8a, 0x82, 0xa0, 0x68, 0x1e, 0xa5, + 0x9e, 0x8f, 0x60, 0x5e, 0xd9, 0xf1, 0x18, 0x72, 0x4c, 0x10, 0xe3, 0x16, 0x09, 0xcb, 0x80, 0xba, + 0x1d, 0x70, 0xe3, 0xc8, 0x5a, 0x2b, 0x28, 0xff, 0x3c, 0xea, 0xd1, 0x02, 0x9c, 0xfd, 0x15, 0xa7, + 0xfa, 0x73, 0x43, 0x6a, 0x9e, 0x96, 0xae, 0xf2, 0x95, 0xd4, 0xaa, 0x9d, 0xda, 0x62, 0x57, 0xec, + 0xb5, 0x4c, 0x73, 0x96, 0x6a, 0xc2, 0x6b, 0xaa, 0xed, 0x79, 0x98, 0x5f, 0xc7, 0x36, 0x70, 0x28, + 0x29, 0xbd, 0xca, 0x8f, 0xc1, 0xdc, 0x5b, 0xc8, 0x93, 0x10, 0x31, 0x30, 0x40, 0xce, 0x2a, 0xd5, + 0xfe, 0x26, 0x16, 0xf1, 0x4f, 0xf4, 0x1a, 0xa4, 0x0f, 0xd7, 0x50, 0xf9, 0x5c, 0x6a, 0xdd, 0x50, + 0x1c, 0x8c, 0x32, 0xf9, 0x76, 0xa3, 0x2b, 0xf6, 0x7e, 0x1d, 0x28, 0xa0, 0x10, 0x07, 0x95, 0x38, + 0x38, 0xab, 0x6e, 0x66, 0xee, 0x64, 0xd3, 0xd7, 0xcc, 0xba, 0x55, 0x9f, 0xbe, 0x69, 0xe2, 0xb0, + 0x99, 0xd5, 0x59, 0x58, 0x7e, 0x94, 0xfe, 0x8c, 0x23, 0x84, 0x1e, 0xd0, 0xa8, 0xba, 0x74, 0xfb, + 0x47, 0x0e, 0xef, 0x7c, 0x81, 0x0f, 0xca, 0x80, 0x79, 0x9c, 0xb1, 0x3f, 0x52, 0x4d, 0xae, 0x5a, + 0xf6, 0x29, 0xc1, 0x1c, 0x91, 0x90, 0x27, 0xab, 0x54, 0xfb, 0x5f, 0x4c, 0xdc, 0xa2, 0xea, 0x4f, + 0xd9, 0xdc, 0xdf, 0xc5, 0x69, 0x4d, 0xba, 0x9c, 0x2d, 0x54, 0x71, 0xbe, 0x50, 0xc5, 0xf7, 0x85, + 0x2a, 0x4e, 0x97, 0xaa, 0x30, 0x5f, 0xaa, 0xc2, 0xcb, 0x52, 0x15, 0x2e, 0xcc, 0x8d, 0x57, 0x2b, + 0x37, 0xc0, 0xf0, 0x2d, 0x9b, 0x55, 0x05, 0x9c, 0xf4, 0x8f, 0xe0, 0xfd, 0x77, 0x3b, 0x44, 0xa8, + 0x8b, 0x7c, 0xfb, 0x67, 0xae, 0x7e, 0xf8, 0x19, 0x00, 0x00, 0xff, 0xff, 0x26, 0xb7, 0xc2, 0xcb, 0x72, 0x02, 0x00, 0x00, } diff --git a/x/concentrated-liquidity/types/query.pb.go b/x/concentrated-liquidity/types/query.pb.go index c9670396b07..8a9b8898c27 100644 --- a/x/concentrated-liquidity/types/query.pb.go +++ b/x/concentrated-liquidity/types/query.pb.go @@ -622,76 +622,76 @@ func init() { } var fileDescriptor_ce34c1e206115391 = []byte{ - // 1098 bytes of a gzipped FileDescriptorProto + // 1097 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcd, 0x6f, 0x1b, 0x45, - 0x14, 0xcf, 0xe6, 0xc3, 0xad, 0xc7, 0x34, 0x4d, 0x87, 0x08, 0x1c, 0xab, 0xd8, 0xd1, 0x40, 0x4b, - 0x44, 0xe3, 0x5d, 0xc5, 0x6d, 0x20, 0x44, 0x7c, 0x34, 0x9b, 0x28, 0x60, 0x40, 0x10, 0x56, 0xed, + 0x14, 0xcf, 0x36, 0x89, 0x5b, 0x8f, 0x69, 0x9a, 0x0e, 0x11, 0x38, 0x56, 0xb1, 0xa3, 0x81, 0x96, + 0x88, 0xc6, 0xbb, 0x8a, 0x8b, 0x21, 0x44, 0x7c, 0x34, 0x9b, 0x28, 0x60, 0x40, 0x10, 0x56, 0xed, 0xa5, 0x54, 0x32, 0x6b, 0xef, 0xc4, 0x5d, 0xb2, 0xde, 0xd9, 0xec, 0x8c, 0xdb, 0x9a, 0xd2, 0x4b, 0xcf, 0x08, 0x55, 0x82, 0x03, 0xe2, 0xcf, 0x40, 0x08, 0x89, 0x03, 0xf7, 0x8a, 0x53, 0x25, 0x2e, 0x15, 0x48, 0x06, 0x25, 0x9c, 0x38, 0xe6, 0x8e, 0x84, 0x66, 0x76, 0x66, 0xbd, 0xb6, 0x93, 0xc6, - 0xdb, 0xf6, 0x64, 0xcf, 0xbc, 0xf7, 0x7e, 0xef, 0xf7, 0x3e, 0x3d, 0x06, 0xcb, 0x84, 0xb6, 0x08, - 0x75, 0xa9, 0xd1, 0x20, 0x7e, 0x03, 0xfb, 0x2c, 0xb4, 0x19, 0x76, 0xca, 0x9e, 0xbb, 0xdb, 0x76, - 0x1d, 0x97, 0x75, 0x8c, 0x80, 0x10, 0xaf, 0xdc, 0x22, 0x0e, 0xf6, 0x8c, 0xdd, 0x36, 0x0e, 0x3b, - 0x7a, 0x10, 0x12, 0x46, 0xe0, 0x39, 0x69, 0xa6, 0x27, 0xcd, 0x62, 0x2b, 0xfd, 0xe6, 0x52, 0x1d, - 0x33, 0x7b, 0xa9, 0x30, 0xdb, 0x24, 0x4d, 0x22, 0x2c, 0x0c, 0xfe, 0x2d, 0x32, 0x2e, 0x5c, 0x38, - 0xce, 0xa7, 0x1d, 0xda, 0x2d, 0x2a, 0x95, 0x8b, 0x0d, 0xa1, 0x6d, 0xd4, 0x6d, 0x8a, 0x0d, 0x89, - 0x6b, 0x34, 0x88, 0xeb, 0x4b, 0xf9, 0x6b, 0x49, 0xb9, 0xa0, 0x18, 0x6b, 0x05, 0x76, 0xd3, 0xf5, - 0x6d, 0xe6, 0x12, 0xa5, 0x7b, 0xb6, 0x49, 0x48, 0xd3, 0xc3, 0x86, 0x1d, 0xb8, 0x86, 0xed, 0xfb, - 0x84, 0x09, 0xa1, 0xf2, 0x34, 0x27, 0xa5, 0xe2, 0x54, 0x6f, 0x6f, 0x1b, 0xb6, 0xdf, 0x51, 0xa2, - 0xc8, 0x49, 0x2d, 0x0a, 0x25, 0x3a, 0x48, 0x51, 0x69, 0xd0, 0x8a, 0xb9, 0x2d, 0x4c, 0x99, 0xdd, - 0x0a, 0x54, 0x00, 0x83, 0x0a, 0x4e, 0x3b, 0x4c, 0x90, 0x42, 0x55, 0x30, 0xf7, 0x29, 0xa7, 0x7d, - 0x95, 0xe2, 0x70, 0x8b, 0x50, 0x57, 0x50, 0xb2, 0xf0, 0x6e, 0x1b, 0x53, 0x06, 0x17, 0xc1, 0x09, - 0xdb, 0x71, 0x42, 0x4c, 0x69, 0x5e, 0x9b, 0xd7, 0x16, 0xb2, 0x26, 0x3c, 0xe8, 0x96, 0xa6, 0x3b, - 0x76, 0xcb, 0x5b, 0x45, 0x52, 0x80, 0x2c, 0xa5, 0x82, 0xee, 0x69, 0xa0, 0x70, 0x18, 0x16, 0x0d, - 0x88, 0x4f, 0x31, 0x74, 0x40, 0x36, 0x50, 0x97, 0x79, 0x6d, 0x7e, 0x62, 0x21, 0x57, 0xb9, 0xac, - 0x8f, 0x54, 0x48, 0x7d, 0xb3, 0xed, 0x79, 0x0a, 0xd0, 0xec, 0x7c, 0x72, 0xcb, 0xc7, 0xa1, 0x85, - 0x69, 0xdb, 0x63, 0xe6, 0xe4, 0x83, 0x6e, 0x69, 0xcc, 0xea, 0x01, 0xa3, 0x5f, 0x27, 0xc0, 0xdc, - 0x91, 0xea, 0xf0, 0x02, 0x38, 0xc1, 0x5b, 0xaa, 0xe6, 0x3a, 0x22, 0xa0, 0xc9, 0x64, 0x40, 0x52, - 0x80, 0xac, 0x0c, 0xff, 0x56, 0x75, 0xe0, 0x4b, 0x00, 0x78, 0xe4, 0x16, 0x0e, 0x6b, 0xcc, 0x6d, - 0xec, 0xe4, 0xc7, 0xe7, 0xb5, 0x85, 0x09, 0x2b, 0x2b, 0x6e, 0xae, 0xb8, 0x8d, 0x1d, 0x2e, 0x6e, - 0x07, 0x81, 0x12, 0x4f, 0x44, 0x62, 0x71, 0x23, 0xc4, 0x57, 0x41, 0xf6, 0x0b, 0xe2, 0xfa, 0x35, - 0x5e, 0x90, 0xfc, 0xe4, 0xbc, 0xb6, 0x90, 0xab, 0x14, 0xf4, 0xa8, 0x18, 0xba, 0x2a, 0x86, 0x7e, - 0x45, 0x55, 0xcb, 0x3c, 0xcb, 0x03, 0x39, 0xe8, 0x96, 0x66, 0x22, 0x32, 0xb1, 0x29, 0xba, 0xff, - 0x57, 0x49, 0xb3, 0x4e, 0xf2, 0x33, 0x57, 0x86, 0x5f, 0x81, 0xd3, 0xdb, 0x21, 0xc6, 0x5f, 0xe2, - 0x9a, 0x2a, 0x64, 0x7e, 0x4a, 0x80, 0xcf, 0x0d, 0x81, 0x6f, 0x48, 0x05, 0x73, 0x85, 0x63, 0xff, - 0xdb, 0x2d, 0x41, 0x65, 0xb2, 0x48, 0x5a, 0x2e, 0xc3, 0xad, 0x80, 0x75, 0x0e, 0xba, 0xa5, 0x17, - 0x22, 0x8f, 0x03, 0xa8, 0xe8, 0x7b, 0xee, 0x77, 0x3a, 0xba, 0x55, 0x48, 0xf0, 0x73, 0x90, 0x8d, - 0xab, 0x93, 0xcf, 0x88, 0x96, 0x30, 0x39, 0xf8, 0x1f, 0xdd, 0xd2, 0xf9, 0xa6, 0xcb, 0x6e, 0xb4, - 0xeb, 0x7a, 0x83, 0xb4, 0x64, 0x8b, 0xca, 0x8f, 0x32, 0x75, 0x76, 0x0c, 0xd6, 0x09, 0x30, 0xd5, - 0x37, 0x70, 0xa3, 0x17, 0x62, 0x0c, 0x84, 0xac, 0x1e, 0x28, 0x7a, 0x17, 0xcc, 0x88, 0x1e, 0xda, - 0x22, 0xc4, 0x53, 0x6d, 0x98, 0xa6, 0x6a, 0xe8, 0x7d, 0x70, 0x26, 0x01, 0x20, 0x7b, 0xef, 0x22, - 0x98, 0xe4, 0x62, 0x61, 0x9e, 0xab, 0xcc, 0x0e, 0xa5, 0x6a, 0xcd, 0xef, 0x98, 0xd9, 0xdf, 0x7e, - 0x2a, 0x4f, 0x71, 0xab, 0xaa, 0x25, 0x94, 0xd1, 0x67, 0x09, 0xa4, 0x78, 0x24, 0x36, 0x01, 0xe8, - 0x0d, 0xb6, 0x68, 0x8a, 0x5c, 0xe5, 0xbc, 0x2e, 0x67, 0x92, 0x6f, 0x01, 0x3d, 0x5a, 0x54, 0xaa, - 0x75, 0xb7, 0xec, 0x26, 0x96, 0xb6, 0x56, 0xc2, 0x12, 0x7d, 0xa7, 0x01, 0x98, 0x44, 0x97, 0x44, - 0x97, 0xc1, 0x14, 0xf7, 0xad, 0x06, 0xe4, 0x58, 0xa6, 0x91, 0x36, 0x7c, 0xef, 0x10, 0x56, 0xaf, - 0x1e, 0xcb, 0x2a, 0xf2, 0xd9, 0x47, 0x6b, 0x56, 0xb1, 0x12, 0x4b, 0x50, 0x12, 0x47, 0xd7, 0xc0, - 0xf3, 0x7d, 0xb7, 0x92, 0xec, 0x3a, 0xc8, 0x44, 0xcb, 0x52, 0xe6, 0xf5, 0xdc, 0x31, 0xe3, 0x1c, - 0x99, 0xcb, 0x99, 0x95, 0xa6, 0xe8, 0x87, 0x71, 0xf0, 0xb2, 0x00, 0xff, 0x48, 0xe9, 0x6d, 0xe0, - 0x80, 0xdd, 0xa0, 0x9b, 0x24, 0xb4, 0x6c, 0x3f, 0x4e, 0x5e, 0xba, 0xd1, 0xad, 0x0f, 0x8d, 0x6e, - 0xd6, 0x5c, 0x4f, 0xd1, 0xa8, 0x55, 0x9f, 0x1d, 0x74, 0x4b, 0x67, 0x64, 0xa3, 0xc6, 0x48, 0x28, - 0x39, 0xff, 0xf5, 0xa1, 0xf9, 0x7f, 0x0a, 0x1f, 0x3d, 0x24, 0x94, 0x58, 0x22, 0xe8, 0x1b, 0x0d, - 0xbc, 0xf2, 0xf8, 0xe4, 0xc8, 0x52, 0x6c, 0x83, 0x99, 0x38, 0xcf, 0x35, 0x47, 0xe8, 0xc8, 0x16, - 0x5a, 0x1e, 0x71, 0xc7, 0xf6, 0x7b, 0x90, 0x45, 0x3a, 0xed, 0xf5, 0xfb, 0x45, 0x7f, 0x6a, 0x60, - 0xba, 0x5f, 0x13, 0xee, 0x80, 0x53, 0x3d, 0xd7, 0x3e, 0x66, 0xf2, 0xa7, 0x62, 0x33, 0xf5, 0x5e, - 0x98, 0x1d, 0xd8, 0x0b, 0x1c, 0x0c, 0x59, 0xcf, 0xc5, 0xe7, 0x8f, 0x31, 0x83, 0xd7, 0x01, 0xe0, - 0x49, 0xaa, 0xb9, 0xbe, 0x83, 0x6f, 0xcb, 0xc2, 0xbe, 0x9d, 0x3a, 0xe9, 0xb9, 0xc8, 0x93, 0x4c, - 0x37, 0xff, 0xa8, 0x72, 0xbc, 0xca, 0xd7, 0x27, 0xc1, 0x94, 0x48, 0x37, 0xfc, 0x51, 0x03, 0x62, - 0xc2, 0x28, 0x5c, 0x19, 0x31, 0x7f, 0x43, 0xab, 0xa2, 0xf0, 0xe6, 0x13, 0x58, 0x46, 0xe5, 0x44, - 0x97, 0xee, 0xfd, 0xfe, 0xcf, 0xb7, 0xe3, 0x3a, 0x5c, 0x34, 0x0e, 0x7b, 0xac, 0xf4, 0xde, 0x2a, - 0xf1, 0x5b, 0x43, 0x50, 0xfd, 0x45, 0x03, 0x93, 0x1c, 0x07, 0xbe, 0x91, 0xd6, 0xb3, 0xa2, 0xbc, - 0x92, 0xde, 0x50, 0x32, 0x7e, 0x47, 0x30, 0x5e, 0x81, 0xaf, 0xa7, 0x61, 0x6c, 0xdc, 0x91, 0x93, - 0x7b, 0x17, 0xfe, 0xac, 0x81, 0x4c, 0xb4, 0x1f, 0x60, 0xba, 0xbc, 0x25, 0x17, 0x55, 0x61, 0xf5, - 0x49, 0x4c, 0x65, 0x04, 0xcb, 0x22, 0x02, 0x03, 0x96, 0x47, 0x8d, 0x20, 0x62, 0xfb, 0x9f, 0x06, - 0x5e, 0x3c, 0x62, 0x3a, 0xe1, 0x07, 0x69, 0xe8, 0x3c, 0x7e, 0xff, 0x15, 0x3e, 0x7c, 0x26, 0x58, - 0x32, 0xd6, 0xaa, 0x88, 0x75, 0x1d, 0xae, 0x8d, 0x18, 0xeb, 0xe0, 0x6e, 0xa9, 0x6d, 0x93, 0xb0, - 0x16, 0x8a, 0x18, 0x1f, 0x69, 0xe0, 0x54, 0xdf, 0x83, 0x0f, 0x5e, 0x4e, 0xc3, 0xf4, 0xb0, 0x77, - 0x67, 0x61, 0xed, 0x29, 0x10, 0x64, 0x84, 0xa6, 0x88, 0xf0, 0x2d, 0xb8, 0x3a, 0x72, 0x3f, 0x4a, + 0xdb, 0x72, 0xb2, 0x67, 0xde, 0x7b, 0xbf, 0xf7, 0x7b, 0x9f, 0x1e, 0x83, 0x2a, 0xa1, 0x6d, 0x42, + 0x5d, 0x6a, 0x34, 0x89, 0xdf, 0xc4, 0x3e, 0x0b, 0x6d, 0x86, 0x9d, 0xb2, 0xe7, 0xee, 0x76, 0x5c, + 0xc7, 0x65, 0x5d, 0x23, 0x20, 0xc4, 0x2b, 0xb7, 0x89, 0x83, 0x3d, 0x63, 0xb7, 0x83, 0xc3, 0xae, + 0x1e, 0x84, 0x84, 0x11, 0x78, 0x5e, 0x9a, 0xe9, 0x49, 0xb3, 0xd8, 0x4a, 0xbf, 0xb9, 0xdc, 0xc0, + 0xcc, 0x5e, 0x2e, 0xcc, 0xb5, 0x48, 0x8b, 0x08, 0x0b, 0x83, 0x7f, 0x8b, 0x8c, 0x0b, 0x17, 0x8f, + 0xf3, 0x69, 0x87, 0x76, 0x9b, 0x4a, 0xe5, 0x62, 0x53, 0x68, 0x1b, 0x0d, 0x9b, 0x62, 0x43, 0xe2, + 0x1a, 0x4d, 0xe2, 0xfa, 0x52, 0xfe, 0x4a, 0x52, 0x2e, 0x28, 0xc6, 0x5a, 0x81, 0xdd, 0x72, 0x7d, + 0x9b, 0xb9, 0x44, 0xe9, 0x9e, 0x6b, 0x11, 0xd2, 0xf2, 0xb0, 0x61, 0x07, 0xae, 0x61, 0xfb, 0x3e, + 0x61, 0x42, 0xa8, 0x3c, 0xcd, 0x4b, 0xa9, 0x38, 0x35, 0x3a, 0xdb, 0x86, 0xed, 0x77, 0x95, 0x28, + 0x72, 0x52, 0x8f, 0x42, 0x89, 0x0e, 0x52, 0x54, 0x1a, 0xb6, 0x62, 0x6e, 0x1b, 0x53, 0x66, 0xb7, + 0x03, 0x15, 0xc0, 0xb0, 0x82, 0xd3, 0x09, 0x13, 0xa4, 0x50, 0x0d, 0xcc, 0x7f, 0xc2, 0x69, 0x5f, + 0xa5, 0x38, 0xdc, 0x22, 0xd4, 0x15, 0x94, 0x2c, 0xbc, 0xdb, 0xc1, 0x94, 0xc1, 0x25, 0x70, 0xd2, + 0x76, 0x9c, 0x10, 0x53, 0x9a, 0xd7, 0x16, 0xb4, 0xc5, 0xac, 0x09, 0x0f, 0x7a, 0xa5, 0x99, 0xae, + 0xdd, 0xf6, 0x56, 0x91, 0x14, 0x20, 0x4b, 0xa9, 0xa0, 0x7b, 0x1a, 0x28, 0x1c, 0x86, 0x45, 0x03, + 0xe2, 0x53, 0x0c, 0x1d, 0x90, 0x0d, 0xd4, 0x65, 0x5e, 0x5b, 0x98, 0x5c, 0xcc, 0x55, 0x2e, 0xeb, + 0x63, 0x15, 0x52, 0xdf, 0xec, 0x78, 0x9e, 0x02, 0x34, 0xbb, 0x1f, 0xdf, 0xf2, 0x71, 0x68, 0x61, + 0xda, 0xf1, 0x98, 0x39, 0xf5, 0xa0, 0x57, 0x9a, 0xb0, 0xfa, 0xc0, 0xe8, 0x97, 0x49, 0x30, 0x7f, + 0xa4, 0x3a, 0xbc, 0x08, 0x4e, 0xf2, 0x96, 0xaa, 0xbb, 0x8e, 0x08, 0x68, 0x2a, 0x19, 0x90, 0x14, + 0x20, 0x2b, 0xc3, 0xbf, 0xd5, 0x1c, 0xf8, 0x02, 0x00, 0x1e, 0xb9, 0x85, 0xc3, 0x3a, 0x73, 0x9b, + 0x3b, 0xf9, 0x13, 0x0b, 0xda, 0xe2, 0xa4, 0x95, 0x15, 0x37, 0x57, 0xdc, 0xe6, 0x0e, 0x17, 0x77, + 0x82, 0x40, 0x89, 0x27, 0x23, 0xb1, 0xb8, 0x11, 0xe2, 0xab, 0x20, 0xfb, 0x39, 0x71, 0xfd, 0x3a, + 0x2f, 0x48, 0x7e, 0x6a, 0x41, 0x5b, 0xcc, 0x55, 0x0a, 0x7a, 0x54, 0x0c, 0x5d, 0x15, 0x43, 0xbf, + 0xa2, 0xaa, 0x65, 0x9e, 0xe3, 0x81, 0x1c, 0xf4, 0x4a, 0xb3, 0x11, 0x99, 0xd8, 0x14, 0xdd, 0xff, + 0xb3, 0xa4, 0x59, 0xa7, 0xf8, 0x99, 0x2b, 0xc3, 0x2f, 0xc1, 0x99, 0xed, 0x10, 0xe3, 0x2f, 0x70, + 0x5d, 0x15, 0x32, 0x3f, 0x2d, 0xc0, 0xe7, 0x47, 0xc0, 0x37, 0xa4, 0x82, 0xb9, 0xc2, 0xb1, 0xff, + 0xe9, 0x95, 0xa0, 0x32, 0x59, 0x22, 0x6d, 0x97, 0xe1, 0x76, 0xc0, 0xba, 0x07, 0xbd, 0xd2, 0x73, + 0x91, 0xc7, 0x21, 0x54, 0xf4, 0x1d, 0xf7, 0x3b, 0x13, 0xdd, 0x2a, 0x24, 0xf8, 0x19, 0xc8, 0xc6, + 0xd5, 0xc9, 0x67, 0x44, 0x4b, 0x98, 0x1c, 0xfc, 0xf7, 0x5e, 0xe9, 0x42, 0xcb, 0x65, 0x37, 0x3a, + 0x0d, 0xbd, 0x49, 0xda, 0xb2, 0x45, 0xe5, 0x47, 0x99, 0x3a, 0x3b, 0x06, 0xeb, 0x06, 0x98, 0xea, + 0x1b, 0xb8, 0xd9, 0x0f, 0x31, 0x06, 0x42, 0x56, 0x1f, 0x14, 0xbd, 0x03, 0x66, 0x45, 0x0f, 0x6d, + 0x11, 0xe2, 0xa9, 0x36, 0x4c, 0x53, 0x35, 0xf4, 0x1e, 0x38, 0x9b, 0x00, 0x90, 0xbd, 0x77, 0x09, + 0x4c, 0x71, 0xb1, 0x30, 0xcf, 0x55, 0xe6, 0x46, 0x52, 0xb5, 0xe6, 0x77, 0xcd, 0xec, 0xaf, 0x3f, + 0x96, 0xa7, 0xb9, 0x55, 0xcd, 0x12, 0xca, 0xe8, 0xd3, 0x04, 0x52, 0x3c, 0x12, 0x9b, 0x00, 0xf4, + 0x07, 0x5b, 0x34, 0x45, 0xae, 0x72, 0x41, 0x97, 0x33, 0xc9, 0xb7, 0x80, 0x1e, 0x2d, 0x2a, 0xd5, + 0xba, 0x5b, 0x76, 0x0b, 0x4b, 0x5b, 0x2b, 0x61, 0x89, 0xbe, 0xd5, 0x00, 0x4c, 0xa2, 0x4b, 0xa2, + 0x55, 0x30, 0xcd, 0x7d, 0xab, 0x01, 0x39, 0x96, 0x69, 0xa4, 0x0d, 0xdf, 0x3d, 0x84, 0xd5, 0xcb, + 0xc7, 0xb2, 0x8a, 0x7c, 0x0e, 0xd0, 0x9a, 0x53, 0xac, 0xc4, 0x12, 0x94, 0xc4, 0xd1, 0x35, 0xf0, + 0xec, 0xc0, 0xad, 0x24, 0xbb, 0x0e, 0x32, 0xd1, 0xb2, 0x94, 0x79, 0x3d, 0x7f, 0xcc, 0x38, 0x47, + 0xe6, 0x72, 0x66, 0xa5, 0x29, 0xfa, 0xfe, 0x04, 0x78, 0x51, 0x80, 0x7f, 0xa8, 0xf4, 0x36, 0x70, + 0xc0, 0x6e, 0xd0, 0x4d, 0x12, 0x5a, 0xb6, 0x1f, 0x27, 0x2f, 0xdd, 0xe8, 0x36, 0x46, 0x46, 0x37, + 0x6b, 0xae, 0xa7, 0x68, 0xd4, 0x9a, 0xcf, 0x0e, 0x7a, 0xa5, 0xb3, 0xb2, 0x51, 0x63, 0x24, 0x94, + 0x9c, 0xff, 0xc6, 0xc8, 0xfc, 0x3f, 0x85, 0x8f, 0x3e, 0x12, 0x4a, 0x2c, 0x11, 0xf4, 0xb5, 0x06, + 0x5e, 0x7a, 0x7c, 0x72, 0x64, 0x29, 0xb6, 0xc1, 0x6c, 0x9c, 0xe7, 0xba, 0x23, 0x74, 0x64, 0x0b, + 0x55, 0xc7, 0xdc, 0xb1, 0x83, 0x1e, 0x64, 0x91, 0xce, 0x78, 0x83, 0x7e, 0xd1, 0x1f, 0x1a, 0x98, + 0x19, 0xd4, 0x84, 0x3b, 0xe0, 0x74, 0xdf, 0xb5, 0x8f, 0x99, 0xfc, 0xa9, 0xd8, 0x4c, 0xbd, 0x17, + 0xe6, 0x86, 0xf6, 0x02, 0x07, 0x43, 0xd6, 0x33, 0xf1, 0xf9, 0x23, 0xcc, 0xe0, 0x75, 0x00, 0x78, + 0x92, 0xea, 0xae, 0xef, 0xe0, 0xdb, 0xb2, 0xb0, 0x6f, 0xa5, 0x4e, 0x7a, 0x2e, 0xf2, 0x24, 0xd3, + 0xcd, 0x3f, 0x6a, 0x1c, 0xaf, 0xf2, 0xd5, 0x29, 0x30, 0x2d, 0xd2, 0x0d, 0x7f, 0xd0, 0x80, 0x98, + 0x30, 0x0a, 0x57, 0xc6, 0xcc, 0xdf, 0xc8, 0xaa, 0x28, 0xbc, 0xf1, 0x04, 0x96, 0x51, 0x39, 0xd1, + 0xab, 0xf7, 0x7e, 0xfb, 0xfb, 0x9b, 0x13, 0x3a, 0x5c, 0x32, 0x0e, 0x7b, 0xac, 0xf4, 0xdf, 0x2a, + 0xf1, 0x5b, 0x43, 0x50, 0xfd, 0x59, 0x03, 0x53, 0x1c, 0x07, 0xbe, 0x9e, 0xd6, 0xb3, 0xa2, 0xbc, + 0x92, 0xde, 0x50, 0x32, 0x7e, 0x5b, 0x30, 0x5e, 0x81, 0xaf, 0xa5, 0x61, 0x6c, 0xdc, 0x91, 0x93, + 0x7b, 0x17, 0xfe, 0xa4, 0x81, 0x4c, 0xb4, 0x1f, 0x60, 0xba, 0xbc, 0x25, 0x17, 0x55, 0x61, 0xf5, + 0x49, 0x4c, 0x65, 0x04, 0x55, 0x11, 0x81, 0x01, 0xcb, 0xe3, 0x46, 0x10, 0xb1, 0xfd, 0x57, 0x03, + 0xcf, 0x1f, 0x31, 0x9d, 0xf0, 0xfd, 0x34, 0x74, 0x1e, 0xbf, 0xff, 0x0a, 0x1f, 0xfc, 0x2f, 0x58, + 0x32, 0xd6, 0x9a, 0x88, 0x75, 0x1d, 0xae, 0x8d, 0x19, 0xeb, 0xf0, 0x6e, 0xa9, 0x6f, 0x93, 0xb0, + 0x1e, 0x8a, 0x18, 0x1f, 0x69, 0xe0, 0xf4, 0xc0, 0x83, 0x0f, 0x5e, 0x4e, 0xc3, 0xf4, 0xb0, 0x77, + 0x67, 0x61, 0xed, 0x29, 0x10, 0x64, 0x84, 0xa6, 0x88, 0xf0, 0x4d, 0xb8, 0x3a, 0x76, 0x3f, 0x4a, 0x04, 0xe3, 0x8e, 0x7c, 0xcf, 0xde, 0x35, 0xaf, 0x3f, 0xd8, 0x2b, 0x6a, 0x0f, 0xf7, 0x8a, 0xda, - 0xdf, 0x7b, 0x45, 0xed, 0xfe, 0x7e, 0x71, 0xec, 0xe1, 0x7e, 0x71, 0xec, 0xd1, 0x7e, 0x71, 0xec, - 0x9a, 0x99, 0x58, 0x35, 0x12, 0xbf, 0xec, 0xd9, 0x75, 0x1a, 0x3b, 0xbb, 0xb9, 0x74, 0xc9, 0xb8, - 0x7d, 0xd4, 0x3f, 0x0c, 0xb1, 0x8a, 0xea, 0x19, 0xf1, 0x9b, 0x7e, 0xf1, 0xff, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xc1, 0xd2, 0x9c, 0x0e, 0x04, 0x0d, 0x00, 0x00, + 0x5f, 0x7b, 0x45, 0xed, 0xfe, 0x7e, 0x71, 0xe2, 0xe1, 0x7e, 0x71, 0xe2, 0xd1, 0x7e, 0x71, 0xe2, + 0x9a, 0x99, 0x58, 0x35, 0x12, 0xbf, 0xec, 0xd9, 0x0d, 0x1a, 0x3b, 0xbb, 0xb9, 0x5c, 0x35, 0x6e, + 0x1f, 0xf5, 0x0f, 0x43, 0xac, 0xa2, 0x46, 0x46, 0xfc, 0xa6, 0x5f, 0xfa, 0x2f, 0x00, 0x00, 0xff, + 0xff, 0x86, 0x40, 0xd8, 0xa1, 0x04, 0x0d, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/concentrated-liquidity/types/tx.pb.go b/x/concentrated-liquidity/types/tx.pb.go index 86dd5c81ce3..2af0060f337 100644 --- a/x/concentrated-liquidity/types/tx.pb.go +++ b/x/concentrated-liquidity/types/tx.pb.go @@ -422,7 +422,7 @@ var fileDescriptor_1f1fff802923d7db = []byte{ // 856 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x56, 0x41, 0x8f, 0xdb, 0x44, 0x14, 0xce, 0x34, 0x4b, 0xd2, 0x4c, 0xb5, 0xd9, 0x8d, 0xa1, 0xc5, 0x0d, 0x10, 0x47, 0x23, 0x01, - 0x41, 0xb0, 0x76, 0x5d, 0x8a, 0x54, 0x55, 0x42, 0x2a, 0xde, 0x15, 0xd2, 0x22, 0x45, 0x42, 0x56, + 0x41, 0xb0, 0x76, 0x5d, 0xa8, 0x54, 0x55, 0x42, 0x2a, 0xde, 0x15, 0xd2, 0x22, 0x45, 0x42, 0x56, 0x11, 0x52, 0x85, 0x64, 0x39, 0xf6, 0xac, 0x3b, 0xc4, 0xf6, 0x18, 0xcf, 0x64, 0xb7, 0x41, 0xdc, 0x38, 0x70, 0xe1, 0x50, 0x71, 0xe2, 0x07, 0x70, 0xe7, 0x6f, 0xf4, 0xc0, 0xa1, 0x07, 0x90, 0x10, 0x07, 0x83, 0x76, 0x6f, 0x1c, 0xf3, 0x0b, 0x90, 0x3d, 0x63, 0x27, 0x9b, 0x2c, 0x52, 0xb3, 0x8b, @@ -437,43 +437,43 @@ var fileDescriptor_1f1fff802923d7db = []byte{ 0xc2, 0x66, 0x42, 0x69, 0xe8, 0x10, 0x5f, 0x05, 0x7d, 0x30, 0xd8, 0xb0, 0x94, 0x59, 0xa6, 0xb5, 0xa7, 0x6e, 0x14, 0xde, 0x43, 0x72, 0x01, 0xd9, 0x8d, 0xfc, 0xdf, 0xbe, 0xaf, 0xbc, 0x03, 0x1b, 0x0c, 0xc7, 0x3e, 0x4e, 0xd5, 0x2b, 0x7d, 0x30, 0x68, 0x59, 0x9d, 0x59, 0xa6, 0x6d, 0x8a, 0x58, - 0xe1, 0x47, 0xb6, 0x0c, 0x50, 0xee, 0x40, 0x18, 0xd2, 0x23, 0x9c, 0x3a, 0x9c, 0x78, 0x63, 0xb5, - 0xde, 0x07, 0x83, 0xba, 0x75, 0x7d, 0x96, 0x69, 0x1d, 0x11, 0x3e, 0x5f, 0x43, 0x76, 0xab, 0x30, - 0x1e, 0x10, 0x6f, 0x9c, 0xa3, 0x26, 0x49, 0x52, 0xa2, 0x36, 0x96, 0x51, 0xf3, 0x35, 0x64, 0xb7, - 0x0a, 0xa3, 0x40, 0x39, 0xb0, 0xcd, 0xe9, 0x18, 0xc7, 0x8e, 0x8f, 0x19, 0x49, 0xb1, 0x7f, 0x4b, - 0x7d, 0xa9, 0x0f, 0x06, 0xd7, 0x6e, 0xdf, 0xd4, 0x45, 0x4a, 0xf4, 0x3c, 0x25, 0x65, 0xfa, 0xf5, - 0x5d, 0x4a, 0x62, 0xeb, 0x8d, 0xa7, 0x99, 0x56, 0x9b, 0x65, 0xda, 0x75, 0x41, 0x7c, 0x1a, 0x8e, - 0xec, 0xcd, 0xc2, 0xb1, 0x27, 0xed, 0x15, 0x01, 0x53, 0x6d, 0x5c, 0x44, 0xc0, 0x5c, 0x12, 0x30, - 0x95, 0x43, 0xd8, 0x11, 0x11, 0x11, 0x89, 0x1d, 0x37, 0xa2, 0x93, 0x98, 0xdf, 0x52, 0x9b, 0x45, - 0x8e, 0x3f, 0xc9, 0x89, 0xfe, 0xc8, 0xb4, 0xb7, 0x02, 0xc2, 0x1f, 0x4d, 0x46, 0xba, 0x47, 0x23, - 0x43, 0x9e, 0xb4, 0xf8, 0xd9, 0x61, 0xfe, 0xd8, 0xe0, 0xd3, 0x04, 0x33, 0x7d, 0x3f, 0xe6, 0xb3, - 0x4c, 0x53, 0x17, 0x25, 0x17, 0x08, 0x91, 0xbd, 0x55, 0xf8, 0x86, 0x24, 0xfe, 0x48, 0x78, 0xce, - 0xd2, 0x35, 0xd5, 0xab, 0xff, 0xad, 0xae, 0xb9, 0xa2, 0x6b, 0x2a, 0xdf, 0xc0, 0xad, 0x83, 0x14, - 0xe3, 0xaf, 0xb1, 0x53, 0x16, 0xb1, 0xda, 0x92, 0x19, 0x15, 0x55, 0xae, 0x97, 0x55, 0xae, 0xef, - 0xc9, 0x00, 0xeb, 0x6e, 0xfe, 0x41, 0x7f, 0x67, 0x9a, 0x52, 0x42, 0xde, 0xa3, 0x11, 0xe1, 0x38, - 0x4a, 0xf8, 0x74, 0x96, 0x69, 0x37, 0x84, 0xf8, 0x12, 0x2b, 0xfa, 0xf1, 0x4f, 0x0d, 0xd8, 0x6d, - 0xe1, 0x2d, 0x99, 0xd0, 0x2f, 0x57, 0xe0, 0xcd, 0x95, 0x4e, 0xb0, 0x31, 0x4b, 0x68, 0xcc, 0xb0, - 0xf2, 0x10, 0x36, 0xcb, 0x13, 0x00, 0x45, 0x26, 0xee, 0xaf, 0x9d, 0x09, 0xd9, 0x3f, 0x55, 0xde, - 0x4b, 0xc2, 0x39, 0xb7, 0x29, 0x3b, 0xe8, 0x82, 0xdc, 0x66, 0xc5, 0x6d, 0x2a, 0x47, 0xb0, 0x53, - 0xcd, 0x1a, 0xc7, 0x2b, 0xf6, 0xe6, 0x17, 0x8d, 0xb0, 0xde, 0x59, 0xee, 0x61, 0x6f, 0x7e, 0x96, - 0x2b, 0x84, 0xc8, 0xde, 0xae, 0x7c, 0xbb, 0xd2, 0xf5, 0xd3, 0x06, 0x7c, 0x79, 0xc8, 0x82, 0xcf, - 0x09, 0x7f, 0xe4, 0xa7, 0xee, 0xd1, 0xa5, 0x1a, 0x2d, 0x1c, 0xce, 0xf7, 0x2b, 0xeb, 0x59, 0xe6, - 0x74, 0x7f, 0xed, 0x9c, 0xbe, 0xba, 0x9c, 0x53, 0xc1, 0x87, 0xec, 0xad, 0xca, 0x25, 0xfa, 0x43, - 0xf9, 0x0c, 0xb6, 0xbe, 0xa4, 0x24, 0x76, 0xf2, 0x2b, 0x40, 0x8e, 0x9a, 0xee, 0x4a, 0x63, 0x3c, - 0x28, 0xef, 0x07, 0xeb, 0x75, 0x39, 0x6b, 0xb6, 0x85, 0x40, 0x05, 0x45, 0x4f, 0xf2, 0xea, 0xbf, - 0x9a, 0xdb, 0x79, 0xf0, 0x59, 0x5d, 0xd7, 0xfc, 0xff, 0xba, 0xee, 0x37, 0x00, 0x5f, 0x3b, 0xa3, - 0x4c, 0x5e, 0xf4, 0xbe, 0x43, 0xbf, 0x02, 0xd8, 0xce, 0xa7, 0x09, 0x0d, 0x43, 0xec, 0xf1, 0x8f, - 0x31, 0x66, 0x97, 0xa1, 0xf2, 0xd1, 0x14, 0xde, 0x38, 0xbd, 0xab, 0xea, 0xa0, 0x1c, 0xd8, 0xf6, - 0x84, 0x1b, 0xfb, 0xce, 0x01, 0xc6, 0x4c, 0x05, 0xfd, 0xfa, 0x5a, 0xb7, 0xe1, 0x69, 0x38, 0xb2, - 0x37, 0x2b, 0x47, 0x2e, 0x74, 0xfb, 0xe7, 0x3a, 0xac, 0x0f, 0x59, 0xa0, 0x7c, 0x0f, 0x60, 0x7b, - 0xe9, 0xb9, 0x72, 0x57, 0x7f, 0xae, 0x37, 0x96, 0xbe, 0x32, 0xde, 0xbb, 0xf7, 0xcf, 0x8b, 0xac, - 0xf6, 0xfd, 0x03, 0x80, 0xdb, 0x2b, 0x43, 0xee, 0xde, 0xf3, 0xd3, 0x2e, 0x63, 0xbb, 0xd6, 0xf9, - 0xb1, 0xd5, 0x47, 0x7d, 0x0b, 0xe0, 0xb5, 0xc5, 0xd2, 0xfb, 0x60, 0x8d, 0x6d, 0xce, 0x61, 0xdd, + 0xe1, 0x47, 0xb6, 0x0c, 0x50, 0x3e, 0x80, 0x30, 0xa4, 0x47, 0x38, 0x75, 0x38, 0xf1, 0xc6, 0x6a, + 0xbd, 0x0f, 0x06, 0x75, 0xeb, 0xfa, 0x2c, 0xd3, 0x3a, 0x22, 0x7c, 0xbe, 0x86, 0xec, 0x56, 0x61, + 0x3c, 0x20, 0xde, 0x38, 0x47, 0x4d, 0x92, 0xa4, 0x44, 0x6d, 0x2c, 0xa3, 0xe6, 0x6b, 0xc8, 0x6e, + 0x15, 0x46, 0x81, 0x72, 0x60, 0x9b, 0xd3, 0x31, 0x8e, 0x1d, 0x1f, 0x33, 0x92, 0x62, 0xff, 0x96, + 0xfa, 0x52, 0x1f, 0x0c, 0xae, 0xdd, 0xbe, 0xa9, 0x8b, 0x94, 0xe8, 0x79, 0x4a, 0xca, 0xf4, 0xeb, + 0xbb, 0x94, 0xc4, 0xd6, 0x1b, 0x4f, 0x33, 0xad, 0x36, 0xcb, 0xb4, 0xeb, 0x82, 0xf8, 0x34, 0x1c, + 0xd9, 0x9b, 0x85, 0x63, 0x4f, 0xda, 0x2b, 0x02, 0xa6, 0xda, 0xb8, 0x88, 0x80, 0xb9, 0x24, 0x60, + 0x2a, 0x87, 0xb0, 0x23, 0x22, 0x22, 0x12, 0x3b, 0x6e, 0x44, 0x27, 0x31, 0xbf, 0xa5, 0x36, 0x8b, + 0x1c, 0x7f, 0x92, 0x13, 0xfd, 0x91, 0x69, 0x6f, 0x05, 0x84, 0x3f, 0x9a, 0x8c, 0x74, 0x8f, 0x46, + 0x86, 0x3c, 0x69, 0xf1, 0xb3, 0xc3, 0xfc, 0xb1, 0xc1, 0xa7, 0x09, 0x66, 0xfa, 0x7e, 0xcc, 0x67, + 0x99, 0xa6, 0x2e, 0x4a, 0x2e, 0x10, 0x22, 0x7b, 0xab, 0xf0, 0x0d, 0x49, 0xfc, 0x91, 0xf0, 0x9c, + 0xa5, 0x6b, 0xaa, 0x57, 0xff, 0x5b, 0x5d, 0x73, 0x45, 0xd7, 0x54, 0xbe, 0x81, 0x5b, 0x07, 0x29, + 0xc6, 0x5f, 0x63, 0xa7, 0x2c, 0x62, 0xb5, 0x25, 0x33, 0x2a, 0xaa, 0x5c, 0x2f, 0xab, 0x5c, 0xdf, + 0x93, 0x01, 0xd6, 0xdd, 0xfc, 0x83, 0xfe, 0xce, 0x34, 0xa5, 0x84, 0xbc, 0x47, 0x23, 0xc2, 0x71, + 0x94, 0xf0, 0xe9, 0x2c, 0xd3, 0x6e, 0x08, 0xf1, 0x25, 0x56, 0xf4, 0xe3, 0x9f, 0x1a, 0xb0, 0xdb, + 0xc2, 0x5b, 0x32, 0xa1, 0x5f, 0xae, 0xc0, 0x9b, 0x2b, 0x9d, 0x60, 0x63, 0x96, 0xd0, 0x98, 0x61, + 0xe5, 0x21, 0x6c, 0x96, 0x27, 0x00, 0x8a, 0x4c, 0xdc, 0x5f, 0x3b, 0x13, 0xb2, 0x7f, 0xaa, 0xbc, + 0x97, 0x84, 0x73, 0x6e, 0x53, 0x76, 0xd0, 0x05, 0xb9, 0xcd, 0x8a, 0xdb, 0x54, 0x8e, 0x60, 0xa7, + 0x9a, 0x35, 0x8e, 0x57, 0xec, 0xcd, 0x2f, 0x1a, 0x61, 0xbd, 0xb3, 0xdc, 0xc3, 0xde, 0xfc, 0x2c, + 0x57, 0x08, 0x91, 0xbd, 0x5d, 0xf9, 0x76, 0xa5, 0xeb, 0xa7, 0x0d, 0xf8, 0xf2, 0x90, 0x05, 0x9f, + 0x13, 0xfe, 0xc8, 0x4f, 0xdd, 0xa3, 0x4b, 0x35, 0x5a, 0x38, 0x9c, 0xef, 0x57, 0xd6, 0xb3, 0xcc, + 0xe9, 0xfe, 0xda, 0x39, 0x7d, 0x75, 0x39, 0xa7, 0x82, 0x0f, 0xd9, 0x5b, 0x95, 0x4b, 0xf4, 0x87, + 0xf2, 0x19, 0x6c, 0x7d, 0x49, 0x49, 0xec, 0xe4, 0x57, 0x80, 0x1c, 0x35, 0xdd, 0x95, 0xc6, 0x78, + 0x50, 0xde, 0x0f, 0xd6, 0xeb, 0x72, 0xd6, 0x6c, 0x0b, 0x81, 0x0a, 0x8a, 0x9e, 0xe4, 0xd5, 0x7f, + 0x35, 0xb7, 0xf3, 0xe0, 0xb3, 0xba, 0xae, 0xf9, 0xff, 0x75, 0xdd, 0x6f, 0x00, 0xbe, 0x76, 0x46, + 0x99, 0xbc, 0xe8, 0x7d, 0x87, 0x7e, 0x05, 0xb0, 0x9d, 0x4f, 0x13, 0x1a, 0x86, 0xd8, 0xe3, 0x1f, + 0x63, 0xcc, 0x2e, 0x43, 0xe5, 0xa3, 0x29, 0xbc, 0x71, 0x7a, 0x57, 0xd5, 0x41, 0x39, 0xb0, 0xed, + 0x09, 0x37, 0xf6, 0x9d, 0x03, 0x8c, 0x99, 0x0a, 0xfa, 0xf5, 0xb5, 0x6e, 0xc3, 0xd3, 0x70, 0x64, + 0x6f, 0x56, 0x8e, 0x5c, 0xe8, 0xf6, 0xcf, 0x75, 0x58, 0x1f, 0xb2, 0x40, 0xf9, 0x1e, 0xc0, 0xf6, + 0xd2, 0x73, 0xe5, 0xae, 0xfe, 0x5c, 0x6f, 0x2c, 0x7d, 0x65, 0xbc, 0x77, 0xef, 0x9f, 0x17, 0x59, + 0xed, 0xfb, 0x07, 0x00, 0xb7, 0x57, 0x86, 0xdc, 0xbd, 0xe7, 0xa7, 0x5d, 0xc6, 0x76, 0xad, 0xf3, + 0x63, 0xab, 0x8f, 0xfa, 0x16, 0xc0, 0x6b, 0x8b, 0xa5, 0x77, 0x67, 0x8d, 0x6d, 0xce, 0x61, 0xdd, 0x0f, 0xcf, 0x05, 0x2b, 0xbf, 0xc2, 0xfa, 0xe2, 0xe9, 0x71, 0x0f, 0x3c, 0x3b, 0xee, 0x81, 0xbf, 0x8e, 0x7b, 0xe0, 0xc9, 0x49, 0xaf, 0xf6, 0xec, 0xa4, 0x57, 0xfb, 0xfd, 0xa4, 0x57, 0x7b, 0x68, 0x2d, 0x34, 0x98, 0x94, 0xd8, 0x09, 0xdd, 0x11, 0x2b, 0x0d, 0xe3, 0xd0, 0xbc, 0x63, 0x3c, 0xfe, 0xd7, 0xa7, 0x75, 0xde, 0x80, 0xa3, 0x46, 0x31, 0x96, 0xde, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, - 0x83, 0x05, 0x07, 0x41, 0x89, 0x0b, 0x00, 0x00, + 0xc4, 0x97, 0x43, 0xee, 0x89, 0x0b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. From 5089a8e68f8a07ac4d986beca0ffd2ef25db0d32 Mon Sep 17 00:00:00 2001 From: alpo Date: Fri, 3 Mar 2023 10:30:27 -0800 Subject: [PATCH 109/136] implement message, proto, and core logic --- proto/osmosis/concentrated-liquidity/tx.proto | 15 + x/concentrated-liquidity/incentives.go | 65 ++ x/concentrated-liquidity/msg_server.go | 33 + x/concentrated-liquidity/types/events.go | 1 + x/concentrated-liquidity/types/tx.pb.go | 570 ++++++++++++++++-- 5 files changed, 629 insertions(+), 55 deletions(-) diff --git a/proto/osmosis/concentrated-liquidity/tx.proto b/proto/osmosis/concentrated-liquidity/tx.proto index 6f4c2c27edc..d43766326d2 100644 --- a/proto/osmosis/concentrated-liquidity/tx.proto +++ b/proto/osmosis/concentrated-liquidity/tx.proto @@ -116,3 +116,18 @@ message MsgCollectFeesResponse { (gogoproto.nullable) = false ]; } + +// ===================== MsgCollectIncentives +message MsgCollectIncentives { + uint64 pool_id = 1 [ (gogoproto.moretags) = "yaml:\"pool_id\"" ]; + string sender = 2 [ (gogoproto.moretags) = "yaml:\"sender\"" ]; + int64 lower_tick = 3 [ (gogoproto.moretags) = "yaml:\"lower_tick\"" ]; + int64 upper_tick = 4 [ (gogoproto.moretags) = "yaml:\"upper_tick\"" ]; +} + +message MsgCollectIncentivesResponse { + repeated cosmos.base.v1beta1.Coin collected_incentives = 1 [ + (gogoproto.moretags) = "yaml:\"collected_incentives\"", + (gogoproto.nullable) = false + ]; +} \ No newline at end of file diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 16296aeab50..4a575e565d4 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -415,3 +415,68 @@ func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, posit return nil } + +// collectIncentives collects incentives for all uptime accumulators for the position given by pool id, owner, lower tick, upper tick, join time, and freeze duration. +// Upon successful collection, it bank sends the incentives from the pool address to the owner and returns the collected coins. +// Returns error if: +// - pool with the given id does not exist +// - position given by pool id, owner, lower tick and upper tick does not exist +// - other internal database or math errors. +func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64, joinTime time.Time, freezeDuration time.Duration) (sdk.Coins, error) { + uptimeAccumulators, err := k.getUptimeAccumulators(ctx, poolId) + if err != nil { + return sdk.Coins{}, err + } + + // compute uptime growth outside of the range between lower tick and upper tick. + uptimeGrowthOutside, err := k.GetUptimeGrowthOutsideRange(ctx, poolId, lowerTick, upperTick) + if err != nil { + return sdk.Coins{}, err + } + + positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, joinTime, freezeDuration)) + incentivesClaimed := sdk.Coins(nil) + for uptimeIndex, uptimeAccum := range uptimeAccumulators { + hasPosition, err := uptimeAccum.HasPosition(positionName) + if err != nil { + return sdk.Coins{}, err + } + + // replace position's accumulator before calculating unclaimed rewards + err = preparePositionAccumulator(uptimeAccum, positionName, uptimeGrowthOutside[uptimeIndex]) + if err != nil { + return sdk.Coins{}, err + } + + // claim incentives. + incentivesClaimedCurrAccum, err := uptimeAccum.ClaimRewards(positionName) + if err != nil { + return sdk.Coins{}, err + } + incentivesClaimed = incentivesClaimed.Add(incentivesClaimedCurrAccum...) + + // Check if position record was deleted after claiming rewards. If not, we update the custom accumulator value. + hasPosition, err = uptimeAccum.HasPosition(positionName) + if err != nil { + return sdk.Coins{}, err + } + + if hasPosition { + customAccumulatorValue := uptimeAccum.GetValue().Sub(uptimeGrowthOutside[uptimeIndex]) + err := uptimeAccum.SetPositionCustomAcc(positionName, customAccumulatorValue) + if err != nil { + return sdk.Coins{}, err + } + } + } + + // Once we have iterated through all the positions, we do a single bank send from the pool to the owner. + pool, err := k.getPoolById(ctx, poolId) + if err != nil { + return sdk.Coins{}, err + } + if err := k.bankKeeper.SendCoins(ctx, pool.GetAddress(), owner, incentivesClaimed); err != nil { + return sdk.Coins{}, err + } + return incentivesClaimed, nil +} \ No newline at end of file diff --git a/x/concentrated-liquidity/msg_server.go b/x/concentrated-liquidity/msg_server.go index 302a59bedbf..5ac9ba531a8 100644 --- a/x/concentrated-liquidity/msg_server.go +++ b/x/concentrated-liquidity/msg_server.go @@ -160,3 +160,36 @@ func (server msgServer) CollectFees(goCtx context.Context, msg *types.MsgCollect return &types.MsgCollectFeesResponse{CollectedFees: collectedFees}, nil } + +func (server msgServer) CollectIncentives(goCtx context.Context, msg *types.MsgCollectIncentives) (*types.MsgCollectIncentivesResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + return nil, err + } + + collectedIncentives, err := server.keeper.collectFees(ctx, msg.PoolId, sender, msg.LowerTick, msg.UpperTick) + if err != nil { + return nil, err + } + + ctx.EventManager().EmitEvents(sdk.Events{ + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender), + ), + sdk.NewEvent( + types.TypeEvtCollectIncentives, + sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender), + sdk.NewAttribute(types.AttributeKeyPoolId, strconv.FormatUint(msg.PoolId, 10)), + sdk.NewAttribute(types.AttributeKeyTokensOut, collectedIncentives.String()), + sdk.NewAttribute(types.AttributeLowerTick, strconv.FormatInt(msg.LowerTick, 10)), + sdk.NewAttribute(types.AttributeUpperTick, strconv.FormatInt(msg.UpperTick, 10)), + ), + }) + + return &types.MsgCollectIncentivesResponse{CollectedIncentives: collectedIncentives}, nil +} diff --git a/x/concentrated-liquidity/types/events.go b/x/concentrated-liquidity/types/events.go index 64cb680973b..5054e5c7210 100644 --- a/x/concentrated-liquidity/types/events.go +++ b/x/concentrated-liquidity/types/events.go @@ -4,6 +4,7 @@ const ( TypeEvtCreatePosition = "create_position" TypeEvtWithdrawPosition = "withdraw_position" TypeEvtCollectFees = "collect_fees" + TypeEvtCollectIncentives = "collect_incentives" AttributeValueCategory = ModuleName AttributeKeyPoolId = "pool_id" diff --git a/x/concentrated-liquidity/types/tx.pb.go b/x/concentrated-liquidity/types/tx.pb.go index 2af0060f337..c5777268d28 100644 --- a/x/concentrated-liquidity/types/tx.pb.go +++ b/x/concentrated-liquidity/types/tx.pb.go @@ -405,6 +405,119 @@ func (m *MsgCollectFeesResponse) GetCollectedFees() []types.Coin { return nil } +// ===================== MsgCollectIncentives +type MsgCollectIncentives struct { + PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + Sender string `protobuf:"bytes,2,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + LowerTick int64 `protobuf:"varint,3,opt,name=lower_tick,json=lowerTick,proto3" json:"lower_tick,omitempty" yaml:"lower_tick"` + UpperTick int64 `protobuf:"varint,4,opt,name=upper_tick,json=upperTick,proto3" json:"upper_tick,omitempty" yaml:"upper_tick"` +} + +func (m *MsgCollectIncentives) Reset() { *m = MsgCollectIncentives{} } +func (m *MsgCollectIncentives) String() string { return proto.CompactTextString(m) } +func (*MsgCollectIncentives) ProtoMessage() {} +func (*MsgCollectIncentives) Descriptor() ([]byte, []int) { + return fileDescriptor_1f1fff802923d7db, []int{6} +} +func (m *MsgCollectIncentives) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCollectIncentives) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCollectIncentives.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCollectIncentives) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCollectIncentives.Merge(m, src) +} +func (m *MsgCollectIncentives) XXX_Size() int { + return m.Size() +} +func (m *MsgCollectIncentives) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCollectIncentives.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCollectIncentives proto.InternalMessageInfo + +func (m *MsgCollectIncentives) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *MsgCollectIncentives) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgCollectIncentives) GetLowerTick() int64 { + if m != nil { + return m.LowerTick + } + return 0 +} + +func (m *MsgCollectIncentives) GetUpperTick() int64 { + if m != nil { + return m.UpperTick + } + return 0 +} + +type MsgCollectIncentivesResponse struct { + CollectedIncentives []types.Coin `protobuf:"bytes,1,rep,name=collected_incentives,json=collectedIncentives,proto3" json:"collected_incentives" yaml:"collected_incentives"` +} + +func (m *MsgCollectIncentivesResponse) Reset() { *m = MsgCollectIncentivesResponse{} } +func (m *MsgCollectIncentivesResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCollectIncentivesResponse) ProtoMessage() {} +func (*MsgCollectIncentivesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_1f1fff802923d7db, []int{7} +} +func (m *MsgCollectIncentivesResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCollectIncentivesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCollectIncentivesResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCollectIncentivesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCollectIncentivesResponse.Merge(m, src) +} +func (m *MsgCollectIncentivesResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCollectIncentivesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCollectIncentivesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCollectIncentivesResponse proto.InternalMessageInfo + +func (m *MsgCollectIncentivesResponse) GetCollectedIncentives() []types.Coin { + if m != nil { + return m.CollectedIncentives + } + return nil +} + func init() { proto.RegisterType((*MsgCreatePosition)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCreatePosition") proto.RegisterType((*MsgCreatePositionResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCreatePositionResponse") @@ -412,6 +525,8 @@ func init() { proto.RegisterType((*MsgWithdrawPositionResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgWithdrawPositionResponse") proto.RegisterType((*MsgCollectFees)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCollectFees") proto.RegisterType((*MsgCollectFeesResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCollectFeesResponse") + proto.RegisterType((*MsgCollectIncentives)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCollectIncentives") + proto.RegisterType((*MsgCollectIncentivesResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCollectIncentivesResponse") } func init() { @@ -419,61 +534,64 @@ func init() { } var fileDescriptor_1f1fff802923d7db = []byte{ - // 856 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x56, 0x41, 0x8f, 0xdb, 0x44, - 0x14, 0xce, 0x34, 0x4b, 0xd2, 0x4c, 0xb5, 0xd9, 0x8d, 0xa1, 0xc5, 0x0d, 0x10, 0x47, 0x23, 0x01, - 0x41, 0xb0, 0x76, 0x5d, 0xa8, 0x54, 0x55, 0x42, 0x2a, 0xde, 0x15, 0xd2, 0x22, 0x45, 0x42, 0x56, - 0x11, 0x52, 0x85, 0x64, 0x39, 0xf6, 0xac, 0x3b, 0xc4, 0xf6, 0x18, 0xcf, 0x64, 0xb7, 0x41, 0xdc, - 0x38, 0x70, 0xe1, 0x50, 0x71, 0xe2, 0x07, 0x70, 0xe7, 0x6f, 0xf4, 0xc0, 0xa1, 0x07, 0x90, 0x10, - 0x07, 0x83, 0x76, 0x6f, 0x1c, 0xf3, 0x0b, 0x90, 0x3d, 0x63, 0x27, 0x9b, 0x2c, 0x52, 0xb3, 0x8b, - 0x90, 0xba, 0xa7, 0xe4, 0xbd, 0x79, 0xdf, 0xf7, 0x79, 0xde, 0xbc, 0xf7, 0x66, 0xe0, 0xdb, 0x94, - 0x45, 0x94, 0x11, 0x66, 0x78, 0x34, 0xf6, 0x70, 0xcc, 0x53, 0x97, 0x63, 0x7f, 0x27, 0x24, 0x5f, - 0x4d, 0x88, 0x4f, 0xf8, 0xd4, 0xe0, 0x8f, 0xf5, 0x24, 0xa5, 0x9c, 0x2a, 0x6f, 0xca, 0x40, 0x7d, - 0x31, 0xb0, 0x8a, 0xd3, 0x0f, 0xcd, 0x11, 0xe6, 0xae, 0xd9, 0x7d, 0x25, 0xa0, 0x01, 0x2d, 0x10, - 0x46, 0xfe, 0x4f, 0x80, 0xbb, 0x5a, 0x40, 0x69, 0x10, 0x62, 0xa3, 0xb0, 0x46, 0x93, 0x03, 0x83, - 0x93, 0x08, 0x33, 0xee, 0x46, 0x89, 0x0c, 0xe8, 0x2d, 0x07, 0xf8, 0x93, 0xd4, 0xe5, 0x84, 0xc6, - 0xe5, 0xba, 0x57, 0xc8, 0x1b, 0x23, 0x97, 0x61, 0x43, 0x6a, 0x19, 0x1e, 0x25, 0x72, 0x1d, 0x7d, - 0xd7, 0x80, 0x9d, 0x21, 0x0b, 0x76, 0x53, 0xec, 0x72, 0xfc, 0x29, 0x65, 0x24, 0xc7, 0x2a, 0xef, - 0xc2, 0x66, 0x42, 0x69, 0xe8, 0x10, 0x5f, 0x05, 0x7d, 0x30, 0xd8, 0xb0, 0x94, 0x59, 0xa6, 0xb5, - 0xa7, 0x6e, 0x14, 0xde, 0x43, 0x72, 0x01, 0xd9, 0x8d, 0xfc, 0xdf, 0xbe, 0xaf, 0xbc, 0x03, 0x1b, - 0x0c, 0xc7, 0x3e, 0x4e, 0xd5, 0x2b, 0x7d, 0x30, 0x68, 0x59, 0x9d, 0x59, 0xa6, 0x6d, 0x8a, 0x58, - 0xe1, 0x47, 0xb6, 0x0c, 0x50, 0x3e, 0x80, 0x30, 0xa4, 0x47, 0x38, 0x75, 0x38, 0xf1, 0xc6, 0x6a, - 0xbd, 0x0f, 0x06, 0x75, 0xeb, 0xfa, 0x2c, 0xd3, 0x3a, 0x22, 0x7c, 0xbe, 0x86, 0xec, 0x56, 0x61, - 0x3c, 0x20, 0xde, 0x38, 0x47, 0x4d, 0x92, 0xa4, 0x44, 0x6d, 0x2c, 0xa3, 0xe6, 0x6b, 0xc8, 0x6e, - 0x15, 0x46, 0x81, 0x72, 0x60, 0x9b, 0xd3, 0x31, 0x8e, 0x1d, 0x1f, 0x33, 0x92, 0x62, 0xff, 0x96, - 0xfa, 0x52, 0x1f, 0x0c, 0xae, 0xdd, 0xbe, 0xa9, 0x8b, 0x94, 0xe8, 0x79, 0x4a, 0xca, 0xf4, 0xeb, - 0xbb, 0x94, 0xc4, 0xd6, 0x1b, 0x4f, 0x33, 0xad, 0x36, 0xcb, 0xb4, 0xeb, 0x82, 0xf8, 0x34, 0x1c, - 0xd9, 0x9b, 0x85, 0x63, 0x4f, 0xda, 0x2b, 0x02, 0xa6, 0xda, 0xb8, 0x88, 0x80, 0xb9, 0x24, 0x60, - 0x2a, 0x87, 0xb0, 0x23, 0x22, 0x22, 0x12, 0x3b, 0x6e, 0x44, 0x27, 0x31, 0xbf, 0xa5, 0x36, 0x8b, - 0x1c, 0x7f, 0x92, 0x13, 0xfd, 0x91, 0x69, 0x6f, 0x05, 0x84, 0x3f, 0x9a, 0x8c, 0x74, 0x8f, 0x46, - 0x86, 0x3c, 0x69, 0xf1, 0xb3, 0xc3, 0xfc, 0xb1, 0xc1, 0xa7, 0x09, 0x66, 0xfa, 0x7e, 0xcc, 0x67, - 0x99, 0xa6, 0x2e, 0x4a, 0x2e, 0x10, 0x22, 0x7b, 0xab, 0xf0, 0x0d, 0x49, 0xfc, 0x91, 0xf0, 0x9c, - 0xa5, 0x6b, 0xaa, 0x57, 0xff, 0x5b, 0x5d, 0x73, 0x45, 0xd7, 0x54, 0xbe, 0x81, 0x5b, 0x07, 0x29, - 0xc6, 0x5f, 0x63, 0xa7, 0x2c, 0x62, 0xb5, 0x25, 0x33, 0x2a, 0xaa, 0x5c, 0x2f, 0xab, 0x5c, 0xdf, - 0x93, 0x01, 0xd6, 0xdd, 0xfc, 0x83, 0xfe, 0xce, 0x34, 0xa5, 0x84, 0xbc, 0x47, 0x23, 0xc2, 0x71, - 0x94, 0xf0, 0xe9, 0x2c, 0xd3, 0x6e, 0x08, 0xf1, 0x25, 0x56, 0xf4, 0xe3, 0x9f, 0x1a, 0xb0, 0xdb, - 0xc2, 0x5b, 0x32, 0xa1, 0x5f, 0xae, 0xc0, 0x9b, 0x2b, 0x9d, 0x60, 0x63, 0x96, 0xd0, 0x98, 0x61, - 0xe5, 0x21, 0x6c, 0x96, 0x27, 0x00, 0x8a, 0x4c, 0xdc, 0x5f, 0x3b, 0x13, 0xb2, 0x7f, 0xaa, 0xbc, - 0x97, 0x84, 0x73, 0x6e, 0x53, 0x76, 0xd0, 0x05, 0xb9, 0xcd, 0x8a, 0xdb, 0x54, 0x8e, 0x60, 0xa7, - 0x9a, 0x35, 0x8e, 0x57, 0xec, 0xcd, 0x2f, 0x1a, 0x61, 0xbd, 0xb3, 0xdc, 0xc3, 0xde, 0xfc, 0x2c, - 0x57, 0x08, 0x91, 0xbd, 0x5d, 0xf9, 0x76, 0xa5, 0xeb, 0xa7, 0x0d, 0xf8, 0xf2, 0x90, 0x05, 0x9f, - 0x13, 0xfe, 0xc8, 0x4f, 0xdd, 0xa3, 0x4b, 0x35, 0x5a, 0x38, 0x9c, 0xef, 0x57, 0xd6, 0xb3, 0xcc, - 0xe9, 0xfe, 0xda, 0x39, 0x7d, 0x75, 0x39, 0xa7, 0x82, 0x0f, 0xd9, 0x5b, 0x95, 0x4b, 0xf4, 0x87, - 0xf2, 0x19, 0x6c, 0x7d, 0x49, 0x49, 0xec, 0xe4, 0x57, 0x80, 0x1c, 0x35, 0xdd, 0x95, 0xc6, 0x78, - 0x50, 0xde, 0x0f, 0xd6, 0xeb, 0x72, 0xd6, 0x6c, 0x0b, 0x81, 0x0a, 0x8a, 0x9e, 0xe4, 0xd5, 0x7f, - 0x35, 0xb7, 0xf3, 0xe0, 0xb3, 0xba, 0xae, 0xf9, 0xff, 0x75, 0xdd, 0x6f, 0x00, 0xbe, 0x76, 0x46, - 0x99, 0xbc, 0xe8, 0x7d, 0x87, 0x7e, 0x05, 0xb0, 0x9d, 0x4f, 0x13, 0x1a, 0x86, 0xd8, 0xe3, 0x1f, - 0x63, 0xcc, 0x2e, 0x43, 0xe5, 0xa3, 0x29, 0xbc, 0x71, 0x7a, 0x57, 0xd5, 0x41, 0x39, 0xb0, 0xed, - 0x09, 0x37, 0xf6, 0x9d, 0x03, 0x8c, 0x99, 0x0a, 0xfa, 0xf5, 0xb5, 0x6e, 0xc3, 0xd3, 0x70, 0x64, - 0x6f, 0x56, 0x8e, 0x5c, 0xe8, 0xf6, 0xcf, 0x75, 0x58, 0x1f, 0xb2, 0x40, 0xf9, 0x1e, 0xc0, 0xf6, - 0xd2, 0x73, 0xe5, 0xae, 0xfe, 0x5c, 0x6f, 0x2c, 0x7d, 0x65, 0xbc, 0x77, 0xef, 0x9f, 0x17, 0x59, - 0xed, 0xfb, 0x07, 0x00, 0xb7, 0x57, 0x86, 0xdc, 0xbd, 0xe7, 0xa7, 0x5d, 0xc6, 0x76, 0xad, 0xf3, - 0x63, 0xab, 0x8f, 0xfa, 0x16, 0xc0, 0x6b, 0x8b, 0xa5, 0x77, 0x67, 0x8d, 0x6d, 0xce, 0x61, 0xdd, - 0x0f, 0xcf, 0x05, 0x2b, 0xbf, 0xc2, 0xfa, 0xe2, 0xe9, 0x71, 0x0f, 0x3c, 0x3b, 0xee, 0x81, 0xbf, - 0x8e, 0x7b, 0xe0, 0xc9, 0x49, 0xaf, 0xf6, 0xec, 0xa4, 0x57, 0xfb, 0xfd, 0xa4, 0x57, 0x7b, 0x68, - 0x2d, 0x34, 0x98, 0x94, 0xd8, 0x09, 0xdd, 0x11, 0x2b, 0x0d, 0xe3, 0xd0, 0xbc, 0x63, 0x3c, 0xfe, - 0xd7, 0xa7, 0x75, 0xde, 0x80, 0xa3, 0x46, 0x31, 0x96, 0xde, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, - 0xc4, 0x97, 0x43, 0xee, 0x89, 0x0b, 0x00, 0x00, + // 905 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x57, 0x41, 0x6f, 0xdc, 0x44, + 0x14, 0xce, 0x74, 0xc3, 0xa6, 0x3b, 0x55, 0x36, 0x59, 0x37, 0x2d, 0xee, 0xb6, 0xac, 0x57, 0x83, + 0x80, 0x20, 0x88, 0x5d, 0x17, 0x2a, 0x55, 0x95, 0x90, 0x8a, 0x13, 0x21, 0x05, 0x29, 0x12, 0xb2, + 0x8a, 0x90, 0x2a, 0x24, 0xcb, 0x6b, 0x4f, 0xb6, 0x43, 0x6c, 0x8f, 0xeb, 0x99, 0x4d, 0xba, 0x88, + 0x1b, 0x07, 0x2e, 0x1c, 0x0a, 0x27, 0x7e, 0x00, 0x77, 0xfe, 0x46, 0x0f, 0x1c, 0x7a, 0x00, 0x09, + 0xf5, 0x60, 0x50, 0x72, 0xe3, 0xb8, 0xbf, 0x00, 0xd9, 0x33, 0xb6, 0x37, 0xde, 0x45, 0x74, 0x53, + 0x84, 0x44, 0x4e, 0xeb, 0x79, 0xf3, 0xbe, 0xef, 0xf3, 0x7c, 0x33, 0xef, 0x8d, 0x17, 0xbe, 0x45, + 0x59, 0x48, 0x19, 0x61, 0x86, 0x47, 0x23, 0x0f, 0x47, 0x3c, 0x71, 0x39, 0xf6, 0xb7, 0x02, 0xf2, + 0x68, 0x44, 0x7c, 0xc2, 0xc7, 0x06, 0x7f, 0xac, 0xc7, 0x09, 0xe5, 0x54, 0x79, 0x43, 0x26, 0xea, + 0xd3, 0x89, 0x65, 0x9e, 0x7e, 0x68, 0x0e, 0x30, 0x77, 0xcd, 0xee, 0xc6, 0x90, 0x0e, 0x69, 0x8e, + 0x30, 0xb2, 0x27, 0x01, 0xee, 0x6a, 0x43, 0x4a, 0x87, 0x01, 0x36, 0xf2, 0xd1, 0x60, 0xb4, 0x6f, + 0x70, 0x12, 0x62, 0xc6, 0xdd, 0x30, 0x96, 0x09, 0xbd, 0x7a, 0x82, 0x3f, 0x4a, 0x5c, 0x4e, 0x68, + 0x54, 0xcc, 0x7b, 0xb9, 0xbc, 0x31, 0x70, 0x19, 0x36, 0xa4, 0x96, 0xe1, 0x51, 0x22, 0xe7, 0xd1, + 0x37, 0x4d, 0xd8, 0xd9, 0x63, 0xc3, 0xed, 0x04, 0xbb, 0x1c, 0x7f, 0x42, 0x19, 0xc9, 0xb0, 0xca, + 0x3b, 0x70, 0x25, 0xa6, 0x34, 0x70, 0x88, 0xaf, 0x82, 0x3e, 0xd8, 0x5c, 0xb6, 0x94, 0x49, 0xaa, + 0xb5, 0xc7, 0x6e, 0x18, 0xdc, 0x45, 0x72, 0x02, 0xd9, 0xcd, 0xec, 0x69, 0xd7, 0x57, 0xde, 0x86, + 0x4d, 0x86, 0x23, 0x1f, 0x27, 0xea, 0x85, 0x3e, 0xd8, 0x6c, 0x59, 0x9d, 0x49, 0xaa, 0xad, 0x8a, + 0x5c, 0x11, 0x47, 0xb6, 0x4c, 0x50, 0xde, 0x87, 0x30, 0xa0, 0x47, 0x38, 0x71, 0x38, 0xf1, 0x0e, + 0xd4, 0x46, 0x1f, 0x6c, 0x36, 0xac, 0x2b, 0x93, 0x54, 0xeb, 0x88, 0xf4, 0x6a, 0x0e, 0xd9, 0xad, + 0x7c, 0x70, 0x9f, 0x78, 0x07, 0x19, 0x6a, 0x14, 0xc7, 0x05, 0x6a, 0xb9, 0x8e, 0xaa, 0xe6, 0x90, + 0xdd, 0xca, 0x07, 0x39, 0xca, 0x81, 0x6d, 0x4e, 0x0f, 0x70, 0xe4, 0xf8, 0x98, 0x91, 0x04, 0xfb, + 0x37, 0xd5, 0x57, 0xfa, 0x60, 0xf3, 0xd2, 0xad, 0x6b, 0xba, 0xb0, 0x44, 0xcf, 0x2c, 0x29, 0xec, + 0xd7, 0xb7, 0x29, 0x89, 0xac, 0xd7, 0x9e, 0xa6, 0xda, 0xd2, 0x24, 0xd5, 0xae, 0x08, 0xe2, 0xd3, + 0x70, 0x64, 0xaf, 0xe6, 0x81, 0x1d, 0x39, 0x9e, 0x11, 0x30, 0xd5, 0xe6, 0xcb, 0x08, 0x98, 0x35, + 0x01, 0x53, 0x39, 0x84, 0x1d, 0x91, 0x11, 0x92, 0xc8, 0x71, 0x43, 0x3a, 0x8a, 0xf8, 0x4d, 0x75, + 0x25, 0xf7, 0xf8, 0xe3, 0x8c, 0xe8, 0x79, 0xaa, 0xbd, 0x39, 0x24, 0xfc, 0xe1, 0x68, 0xa0, 0x7b, + 0x34, 0x34, 0xe4, 0x4e, 0x8b, 0x9f, 0x2d, 0xe6, 0x1f, 0x18, 0x7c, 0x1c, 0x63, 0xa6, 0xef, 0x46, + 0x7c, 0x92, 0x6a, 0xea, 0xb4, 0xe4, 0x14, 0x21, 0xb2, 0xd7, 0xf2, 0xd8, 0x1e, 0x89, 0x3e, 0x14, + 0x91, 0x79, 0xba, 0xa6, 0x7a, 0xf1, 0xdf, 0xd5, 0x35, 0x67, 0x74, 0x4d, 0xe5, 0x2b, 0xb8, 0xb6, + 0x9f, 0x60, 0xfc, 0x25, 0x76, 0x8a, 0x43, 0xac, 0xb6, 0xa4, 0xa3, 0xe2, 0x94, 0xeb, 0xc5, 0x29, + 0xd7, 0x77, 0x64, 0x82, 0x75, 0x27, 0x7b, 0xa1, 0x3f, 0x53, 0x4d, 0x29, 0x20, 0xef, 0xd2, 0x90, + 0x70, 0x1c, 0xc6, 0x7c, 0x3c, 0x49, 0xb5, 0xab, 0x42, 0xbc, 0xc6, 0x8a, 0x7e, 0xf8, 0x5d, 0x03, + 0x76, 0x5b, 0x44, 0x0b, 0x26, 0xf4, 0xf3, 0x05, 0x78, 0x6d, 0xa6, 0x12, 0x6c, 0xcc, 0x62, 0x1a, + 0x31, 0xac, 0x3c, 0x80, 0x2b, 0xc5, 0x0e, 0x80, 0xdc, 0x89, 0x7b, 0x0b, 0x3b, 0x21, 0xeb, 0xa7, + 0xf4, 0xbd, 0x20, 0xac, 0xb8, 0x4d, 0x59, 0x41, 0x2f, 0xc9, 0x6d, 0x96, 0xdc, 0xa6, 0x72, 0x04, + 0x3b, 0x65, 0xaf, 0x71, 0xbc, 0x7c, 0x6d, 0x7e, 0x5e, 0x08, 0x8b, 0xed, 0xe5, 0x0e, 0xf6, 0xaa, + 0xbd, 0x9c, 0x21, 0x44, 0xf6, 0x7a, 0x19, 0xdb, 0x96, 0xa1, 0x1f, 0x97, 0xe1, 0xe5, 0x3d, 0x36, + 0xfc, 0x8c, 0xf0, 0x87, 0x7e, 0xe2, 0x1e, 0x9d, 0xab, 0xd6, 0xc2, 0x61, 0xb5, 0x5e, 0x79, 0x9e, + 0xa5, 0xa7, 0xbb, 0x0b, 0x7b, 0xfa, 0x6a, 0xdd, 0x53, 0xc1, 0x87, 0xec, 0xb5, 0x32, 0x24, 0xea, + 0x43, 0xf9, 0x14, 0xb6, 0xbe, 0xa0, 0x24, 0x72, 0xb2, 0x2b, 0x40, 0xb6, 0x9a, 0xee, 0x4c, 0x61, + 0xdc, 0x2f, 0xee, 0x07, 0xeb, 0x86, 0xec, 0x35, 0xeb, 0x42, 0xa0, 0x84, 0xa2, 0x27, 0xd9, 0xe9, + 0xbf, 0x98, 0x8d, 0xb3, 0xe4, 0x79, 0x55, 0xb7, 0xf2, 0xdf, 0x55, 0xdd, 0xaf, 0x00, 0x5e, 0x9f, + 0x73, 0x4c, 0xfe, 0xef, 0x75, 0x87, 0x7e, 0x01, 0xb0, 0x9d, 0x75, 0x13, 0x1a, 0x04, 0xd8, 0xe3, + 0x1f, 0x61, 0xcc, 0xce, 0xc3, 0xc9, 0x47, 0x63, 0x78, 0xf5, 0xf4, 0xaa, 0xca, 0x8d, 0x72, 0x60, + 0xdb, 0x13, 0x61, 0xec, 0x3b, 0xfb, 0x18, 0x33, 0x15, 0xf4, 0x1b, 0x0b, 0xdd, 0x86, 0xa7, 0xe1, + 0xc8, 0x5e, 0x2d, 0x03, 0x99, 0x10, 0x7a, 0x0e, 0xe0, 0x46, 0xa5, 0xbd, 0x9b, 0x7f, 0x4b, 0x91, + 0xc3, 0x73, 0xe2, 0xeb, 0x77, 0x00, 0xde, 0x98, 0xb7, 0xb8, 0xd2, 0xde, 0x47, 0x70, 0xa3, 0xf2, + 0x87, 0x94, 0xf3, 0xff, 0x6c, 0xf2, 0xeb, 0xd2, 0xe4, 0xeb, 0x75, 0x93, 0x2b, 0x12, 0x64, 0x5f, + 0x2e, 0xc3, 0x95, 0xf4, 0xad, 0x9f, 0x1a, 0xb0, 0xb1, 0xc7, 0x86, 0xca, 0xb7, 0x00, 0xb6, 0x6b, + 0xdf, 0x87, 0x77, 0xf4, 0x17, 0xfa, 0xa8, 0xd5, 0x67, 0xee, 0xd3, 0xee, 0xbd, 0xb3, 0x22, 0x4b, + 0x27, 0xbe, 0x07, 0x70, 0x7d, 0xe6, 0x56, 0xb9, 0xfb, 0xe2, 0xb4, 0x75, 0x6c, 0xd7, 0x3a, 0x3b, + 0xb6, 0x7c, 0xa9, 0xaf, 0x01, 0xbc, 0x34, 0x5d, 0xeb, 0xb7, 0x17, 0x58, 0x66, 0x05, 0xeb, 0x7e, + 0x70, 0x26, 0x58, 0xf1, 0x16, 0xd6, 0xe7, 0x4f, 0x8f, 0x7b, 0xe0, 0xd9, 0x71, 0x0f, 0xfc, 0x71, + 0xdc, 0x03, 0x4f, 0x4e, 0x7a, 0x4b, 0xcf, 0x4e, 0x7a, 0x4b, 0xbf, 0x9d, 0xf4, 0x96, 0x1e, 0x58, + 0x53, 0x1d, 0x4d, 0x4a, 0x6c, 0x05, 0xee, 0x80, 0x15, 0x03, 0xe3, 0xd0, 0xbc, 0x6d, 0x3c, 0xfe, + 0xdb, 0xff, 0x32, 0x59, 0xc7, 0x1b, 0x34, 0xf3, 0x7b, 0xe0, 0xbd, 0xbf, 0x02, 0x00, 0x00, 0xff, + 0xff, 0x90, 0x8a, 0xae, 0x67, 0xfa, 0x0c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -970,6 +1088,88 @@ func (m *MsgCollectFeesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *MsgCollectIncentives) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCollectIncentives) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCollectIncentives) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.UpperTick != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.UpperTick)) + i-- + dAtA[i] = 0x20 + } + if m.LowerTick != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.LowerTick)) + i-- + dAtA[i] = 0x18 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0x12 + } + if m.PoolId != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MsgCollectIncentivesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCollectIncentivesResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCollectIncentivesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.CollectedIncentives) > 0 { + for iNdEx := len(m.CollectedIncentives) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.CollectedIncentives[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -1106,6 +1306,43 @@ func (m *MsgCollectFeesResponse) Size() (n int) { return n } +func (m *MsgCollectIncentives) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PoolId != 0 { + n += 1 + sovTx(uint64(m.PoolId)) + } + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.LowerTick != 0 { + n += 1 + sovTx(uint64(m.LowerTick)) + } + if m.UpperTick != 0 { + n += 1 + sovTx(uint64(m.UpperTick)) + } + return n +} + +func (m *MsgCollectIncentivesResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.CollectedIncentives) > 0 { + for _, e := range m.CollectedIncentives { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -2150,6 +2387,229 @@ func (m *MsgCollectFeesResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgCollectIncentives) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCollectIncentives: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCollectIncentives: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LowerTick", wireType) + } + m.LowerTick = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.LowerTick |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UpperTick", wireType) + } + m.UpperTick = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UpperTick |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCollectIncentivesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCollectIncentivesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCollectIncentivesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CollectedIncentives", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CollectedIncentives = append(m.CollectedIncentives, types.Coin{}) + if err := m.CollectedIncentives[len(m.CollectedIncentives)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 From a424bda4d4f6b809f8d2f57300789261d46006a5 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Fri, 3 Mar 2023 12:40:32 -0800 Subject: [PATCH 110/136] convert freezeduration to uint64 --- x/concentrated-liquidity/store.go | 4 ++-- x/concentrated-liquidity/types/keys.go | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/x/concentrated-liquidity/store.go b/x/concentrated-liquidity/store.go index ec0645434d0..9950fa93d34 100644 --- a/x/concentrated-liquidity/store.go +++ b/x/concentrated-liquidity/store.go @@ -90,7 +90,7 @@ func ParseFullPositionFromBytes(key, value []byte) (types.FullPositionByOwnerRes return types.FullPositionByOwnerResult{}, err } - freezeDuration, err := time.ParseDuration(relevantPositionKeyComponents[4]) + freezeDuration, err := strconv.ParseUint(relevantPositionKeyComponents[4], 10, 64) if err != nil { return types.FullPositionByOwnerResult{}, err } @@ -105,7 +105,7 @@ func ParseFullPositionFromBytes(key, value []byte) (types.FullPositionByOwnerRes LowerTick: lowerTick, UpperTick: upperTick, JoinTime: joinTime, - FreezeDuration: freezeDuration, + FreezeDuration: time.Duration(freezeDuration), Liquidity: positionValue.Liquidity, }, nil } diff --git a/x/concentrated-liquidity/types/keys.go b/x/concentrated-liquidity/types/keys.go index eb768b8ce75..095fbedaa48 100644 --- a/x/concentrated-liquidity/types/keys.go +++ b/x/concentrated-liquidity/types/keys.go @@ -70,10 +70,8 @@ func KeyTickPrefix(poolId uint64) []byte { // KeyFullPosition uses pool Id, owner, lower tick, upper tick, joinTime and freezeDuration for keys func KeyFullPosition(poolId uint64, addr sdk.AccAddress, lowerTick, upperTick int64, joinTime time.Time, freezeDuration time.Duration) []byte { joinTimeKey := osmoutils.FormatTimeString(joinTime) - // ? Do we want to format in the same way as joinTimeKey or does it not matter? - freezeDurationKey := freezeDuration.String() addrKey := address.MustLengthPrefix(addr.Bytes()) - return []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d%s%s%s%s", PositionPrefix, KeySeparator, addrKey, KeySeparator, poolId, KeySeparator, lowerTick, KeySeparator, upperTick, KeySeparator, joinTimeKey, KeySeparator, freezeDurationKey)) + return []byte(fmt.Sprintf("%s%s%s%s%d%s%d%s%d%s%s%s%d", PositionPrefix, KeySeparator, addrKey, KeySeparator, poolId, KeySeparator, lowerTick, KeySeparator, upperTick, KeySeparator, joinTimeKey, KeySeparator, uint64(freezeDuration))) } // KeyPosition uses pool Id, owner, lower tick and upper tick for keys From a13cbc685c6b19ead451091acec722168afbaf6e Mon Sep 17 00:00:00 2001 From: alpo Date: Fri, 3 Mar 2023 22:35:49 -0800 Subject: [PATCH 111/136] implement tests for collectIncentives --- x/concentrated-liquidity/export_test.go | 8 + x/concentrated-liquidity/incentives.go | 56 +- x/concentrated-liquidity/incentives_test.go | 863 +++++++++++++++++++- x/concentrated-liquidity/keeper_test.go | 112 +++ x/concentrated-liquidity/msg_server.go | 13 +- x/concentrated-liquidity/types/events.go | 8 +- 6 files changed, 1020 insertions(+), 40 deletions(-) diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index 3246864f692..b5f5f0811de 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -227,3 +227,11 @@ func (k Keeper) GetInitialUptimeGrowthOutsidesForTick(ctx sdk.Context, poolId ui func (k Keeper) InitOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, position *model.Position, owner sdk.AccAddress, lowerTick, upperTick int64, liquidityDelta sdk.Dec, joinTime time.Time, freezeDuration time.Duration) error { return k.initOrUpdatePositionUptime(ctx, poolId, position, owner, lowerTick, upperTick, liquidityDelta, joinTime, freezeDuration) } + +func (k Keeper) CollectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64, joinTime time.Time, freezeDuration time.Duration) (sdk.Coins, error) { + return k.collectIncentives(ctx, poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) +} + +func GetUptimeTrackerValues(uptimeTrackers []model.UptimeTracker) []sdk.DecCoins { + return getUptimeTrackerValues(uptimeTrackers) +} diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 4a575e565d4..48adb76076a 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -423,12 +423,21 @@ func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, posit // - position given by pool id, owner, lower tick and upper tick does not exist // - other internal database or math errors. func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64, joinTime time.Time, freezeDuration time.Duration) (sdk.Coins, error) { + // Note that this implicitly serves as a pool existence check, which is why we run it prior to + // the position existence check. uptimeAccumulators, err := k.getUptimeAccumulators(ctx, poolId) if err != nil { return sdk.Coins{}, err } - // compute uptime growth outside of the range between lower tick and upper tick. + // We check upfront if the position exists to distinguish between the case where there is no position (should error) + // and the case where the position does not qualify for any incentives (should be a no-op) + _, err = k.GetPosition(ctx, poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) + if err != nil { + return sdk.Coins{}, err + } + + // Compute uptime growth outside of the range between lower tick and upper tick uptimeGrowthOutside, err := k.GetUptimeGrowthOutsideRange(ctx, poolId, lowerTick, upperTick) if err != nil { return sdk.Coins{}, err @@ -442,31 +451,33 @@ func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA return sdk.Coins{}, err } - // replace position's accumulator before calculating unclaimed rewards - err = preparePositionAccumulator(uptimeAccum, positionName, uptimeGrowthOutside[uptimeIndex]) - if err != nil { - return sdk.Coins{}, err - } - - // claim incentives. - incentivesClaimedCurrAccum, err := uptimeAccum.ClaimRewards(positionName) - if err != nil { - return sdk.Coins{}, err - } - incentivesClaimed = incentivesClaimed.Add(incentivesClaimedCurrAccum...) + if hasPosition { + // Replace position's accumulator before calculating unclaimed rewards + err = preparePositionAccumulator(uptimeAccum, positionName, uptimeGrowthOutside[uptimeIndex]) + if err != nil { + return sdk.Coins{}, err + } - // Check if position record was deleted after claiming rewards. If not, we update the custom accumulator value. - hasPosition, err = uptimeAccum.HasPosition(positionName) - if err != nil { - return sdk.Coins{}, err - } + // Claim incentives + incentivesClaimedCurrAccum, err := uptimeAccum.ClaimRewards(positionName) + if err != nil { + return sdk.Coins{}, err + } + incentivesClaimed = incentivesClaimed.Add(incentivesClaimedCurrAccum...) - if hasPosition { - customAccumulatorValue := uptimeAccum.GetValue().Sub(uptimeGrowthOutside[uptimeIndex]) - err := uptimeAccum.SetPositionCustomAcc(positionName, customAccumulatorValue) + // Check if position record was deleted after claiming rewards. If not, we update the custom accumulator value. + hasPosition, err = uptimeAccum.HasPosition(positionName) if err != nil { return sdk.Coins{}, err } + + if hasPosition { + customAccumulatorValue := uptimeAccum.GetValue().Sub(uptimeGrowthOutside[uptimeIndex]) + err := uptimeAccum.SetPositionCustomAcc(positionName, customAccumulatorValue) + if err != nil { + return sdk.Coins{}, err + } + } } } @@ -475,8 +486,9 @@ func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA if err != nil { return sdk.Coins{}, err } + if err := k.bankKeeper.SendCoins(ctx, pool.GetAddress(), owner, incentivesClaimed); err != nil { return sdk.Coins{}, err } return incentivesClaimed, nil -} \ No newline at end of file +} diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index ddd4c53ac0a..baac24f9450 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -1,6 +1,7 @@ package concentrated_liquidity_test import ( + "fmt" "time" sdk "github.com/cosmos/cosmos-sdk/types" @@ -9,10 +10,12 @@ import ( cl "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity" "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/model" "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/types" + cltypes "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/types" ) var ( - defaultPoolId = uint64(1) + defaultPoolId = uint64(1) + defaultJoinTime = time.Unix(100, 100) testAddressOne = sdk.AccAddress([]byte("addr1_______________")) testAddressTwo = sdk.AccAddress([]byte("addr2_______________")) @@ -135,13 +138,38 @@ func wrapUptimeTrackers(accumValues []sdk.DecCoins) []model.UptimeTracker { return wrappedUptimeTrackers } -func expectedIncentives(denom string, rate sdk.Dec, timeElapsed time.Duration, qualifyingLiquidity sdk.Dec) sdk.DecCoin { +// expectedIncentivesFromRate calculates the amount of incentives we expect to accrue based on the rate and time elapsed +func expectedIncentivesFromRate(denom string, rate sdk.Dec, timeElapsed time.Duration, qualifyingLiquidity sdk.Dec) sdk.DecCoin { timeInSec := sdk.NewDec(int64(timeElapsed)).Quo(sdk.MustNewDecFromStr("1000000000")) amount := rate.Mul(timeInSec).QuoTruncate(qualifyingLiquidity) return sdk.NewDecCoinFromDec(denom, amount) } +// expectedIncentivesFromUptimeGrowth calculates the amount of incentives we expect to accrue based on uptime accumulator growth. +// +// Assumes `uptimeGrowths` represents the growths for all global uptime accums and only counts growth that `freezeDuration` qualifies for +// towards result. +// +// Returns value as truncated sdk.Coins as the primary use of this helper is testing higher level incentives functions such as claiming. +func expectedIncentivesFromUptimeGrowth(uptimeGrowths []sdk.DecCoins, positionShares sdk.Dec, freezeDuration time.Duration) sdk.Coins { + // Sum up rewards from all inputs + totalRewards := sdk.DecCoins(nil) + for uptimeIndex, uptimeGrowth := range uptimeGrowths { + if freezeDuration >= types.SupportedUptimes[uptimeIndex] { + totalRewards = totalRewards.Add(uptimeGrowth...) + } + } + + // Calculate position's pro-rata share by multiplying growth by position's shares + positionRewards := sdk.Coins(nil) + for _, rewardToken := range totalRewards { + positionRewards = positionRewards.Add(sdk.NewCoin(rewardToken.Denom, rewardToken.Amount.Mul(positionShares).TruncateInt())) + } + + return positionRewards +} + func chargeIncentive(incentiveRecord types.IncentiveRecord, timeElapsed time.Duration) types.IncentiveRecord { incentivesEmitted := incentiveRecord.EmissionRate.Mul(sdk.NewDec(int64(timeElapsed)).Quo(sdk.MustNewDecFromStr("1000000000"))) incentiveRecord.RemainingAmount = incentiveRecord.RemainingAmount.Sub(incentivesEmitted) @@ -163,6 +191,21 @@ func addToUptimeAccums(ctx sdk.Context, poolId uint64, clKeeper *cl.Keeper, addV return nil } +// addDecCoinsArray adds the contents of the second param from the first (decCoinsArrayA + decCoinsArrayB) +// Note that this takes in two _arrays_ of DecCoins, meaning that each term itself is of type DecCoins (i.e. an array of DecCoin). +func addDecCoinsArray(decCoinsArrayA []sdk.DecCoins, decCoinsArrayB []sdk.DecCoins) ([]sdk.DecCoins, error) { + if len(decCoinsArrayA) != len(decCoinsArrayB) { + return []sdk.DecCoins{}, fmt.Errorf("DecCoin arrays must be of equal length to be added") + } + + finalDecCoinArray := []sdk.DecCoins{} + for i := range decCoinsArrayA { + finalDecCoinArray = append(finalDecCoinArray, decCoinsArrayA[i].Add(decCoinsArrayB[i]...)) + } + + return finalDecCoinArray, nil +} + func createIncentiveRecord(incentiveDenom string, remainingAmt, emissionRate sdk.Dec, startTime time.Time, minUpTime time.Duration) types.IncentiveRecord { return types.IncentiveRecord{ IncentiveDenom: incentiveDenom, @@ -439,7 +482,7 @@ func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { poolIncentiveRecords: []types.IncentiveRecord{incentiveRecordOne}, expectedResult: sdk.DecCoins{ - expectedIncentives(incentiveRecordOne.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), + expectedIncentivesFromRate(incentiveRecordOne.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), }, expectedIncentiveRecords: []types.IncentiveRecord{chargeIncentive(incentiveRecordOne, time.Hour)}, expectedPass: true, @@ -453,7 +496,7 @@ func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { expectedResult: sdk.DecCoins{ // We only expect the first incentive record to qualify - expectedIncentives(incentiveRecordOne.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), + expectedIncentivesFromRate(incentiveRecordOne.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), }, expectedIncentiveRecords: []types.IncentiveRecord{ // We only charge the first incentive record since the second wasn't affected @@ -496,7 +539,7 @@ func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { expectedResult: sdk.NewDecCoins( // We expect both incentive records to qualify - expectedIncentives(incentiveRecordOne.IncentiveDenom, incentiveRecordOne.EmissionRate.Add(incentiveRecordOneWithDifferentStartTime.EmissionRate), time.Hour, sdk.NewDec(100)), // since we have 2 records with same denom, the rate of emission went up x2 + expectedIncentivesFromRate(incentiveRecordOne.IncentiveDenom, incentiveRecordOne.EmissionRate.Add(incentiveRecordOneWithDifferentStartTime.EmissionRate), time.Hour, sdk.NewDec(100)), // since we have 2 records with same denom, the rate of emission went up x2 ), expectedIncentiveRecords: []types.IncentiveRecord{ // We only going to charge both incentive records @@ -515,8 +558,8 @@ func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { expectedResult: sdk.DecCoins{ // We expect both incentive record to qualify - expectedIncentives(incentiveRecordOneWithDifferentStartTime.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), - expectedIncentives(incentiveRecordOneWithDifferentDenom.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), + expectedIncentivesFromRate(incentiveRecordOneWithDifferentStartTime.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), + expectedIncentivesFromRate(incentiveRecordOneWithDifferentDenom.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), }, expectedIncentiveRecords: []types.IncentiveRecord{ // We charge both incentive record here because both minUpTime has been hit @@ -535,7 +578,7 @@ func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { expectedResult: sdk.DecCoins{ // We expect first incentive record to qualify - expectedIncentives(incentiveRecordOne.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), + expectedIncentivesFromRate(incentiveRecordOne.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), }, expectedIncentiveRecords: []types.IncentiveRecord{ // We only charge the first incentive record because the second minUpTime hasn't been hit yet @@ -554,8 +597,8 @@ func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { expectedResult: sdk.DecCoins{ // We expect both incentive record to qualify - expectedIncentives(incentiveRecordOne.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), - expectedIncentives(incentiveRecordOneWithDifferentDenom.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), + expectedIncentivesFromRate(incentiveRecordOne.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), + expectedIncentivesFromRate(incentiveRecordOneWithDifferentDenom.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), }, expectedIncentiveRecords: []types.IncentiveRecord{ // We charge both incentive record here because both minUpTime has been hit @@ -574,8 +617,8 @@ func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { expectedResult: sdk.NewDecCoins( // We expect three incentive record to qualify for incentive - expectedIncentives(incentiveRecordOne.IncentiveDenom, incentiveRecordOne.EmissionRate.Add(incentiveRecordOneWithDifferentStartTime.EmissionRate), time.Hour, sdk.NewDec(100)), - expectedIncentives(incentiveRecordOneWithDifferentDenom.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), + expectedIncentivesFromRate(incentiveRecordOne.IncentiveDenom, incentiveRecordOne.EmissionRate.Add(incentiveRecordOneWithDifferentStartTime.EmissionRate), time.Hour, sdk.NewDec(100)), + expectedIncentivesFromRate(incentiveRecordOneWithDifferentDenom.IncentiveDenom, incentiveRecordOne.EmissionRate, time.Hour, sdk.NewDec(100)), ), expectedIncentiveRecords: []types.IncentiveRecord{ // We only charge the first three incentive record because the fourth minUpTime hasn't been hit yet @@ -740,7 +783,7 @@ func (s *KeeperTestSuite) TestUpdateUptimeAccumulatorsToNow() { expectedUptimeDeltas := []sdk.DecCoins{} for uptimeIndex := range newUptimeAccumValues { if uptimeIndex < len(tc.poolIncentiveRecords) && uptimeIndex < len(qualifyingLiquidities) { - expectedUptimeDeltas = append(expectedUptimeDeltas, sdk.NewDecCoins(expectedIncentives(tc.poolIncentiveRecords[uptimeIndex].IncentiveDenom, tc.poolIncentiveRecords[uptimeIndex].EmissionRate, time.Hour, qualifyingLiquidities[uptimeIndex]))) + expectedUptimeDeltas = append(expectedUptimeDeltas, sdk.NewDecCoins(expectedIncentivesFromRate(tc.poolIncentiveRecords[uptimeIndex].IncentiveDenom, tc.poolIncentiveRecords[uptimeIndex].EmissionRate, time.Hour, qualifyingLiquidities[uptimeIndex]))) } else { expectedUptimeDeltas = append(expectedUptimeDeltas, cl.EmptyCoins) } @@ -1832,3 +1875,797 @@ func (s *KeeperTestSuite) TestInitOrUpdatePositionUptime() { }) } } + +func (s *KeeperTestSuite) TestCollectIncentives() { + ownerWithValidPosition := s.TestAccs[0] + uptimeHelper := getExpectedUptimes() + oneDayFreeze := DefaultFreezeDuration + oneWeekFreeze := 7 * DefaultFreezeDuration + + type positionParameters struct { + owner sdk.AccAddress + lowerTick int64 + upperTick int64 + liquidity sdk.Dec + joinTime time.Time + collectTime time.Time + freezeDuration time.Duration + } + + tests := map[string]struct { + // setup parameters + existingAccumLiquidity []sdk.Dec + addedUptimeGrowthInside []sdk.DecCoins + addedUptimeGrowthOutside []sdk.DecCoins + currentTick int64 + isInvalidPoolIdGiven bool + + // inputs parameters + positionParams positionParameters + + // expectations + expectedIncentivesClaimed sdk.Coins + expectedError error + }{ + // ---Cases for lowerTick < currentTick < upperTick--- + + "(lower < curr < upper) no uptime growth inside or outside range, 1D freeze duration": { + currentTick: 1, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(lower < curr < upper) uptime growth outside range but not inside, 1D freeze duration": { + currentTick: 1, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there was no growth inside the range, we expect no incentives to be claimed + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(lower < curr < upper) uptime growth inside range but not outside, 1D freeze duration": { + currentTick: 1, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the + // uptimes the position qualifies for. + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + }, + "(lower < curr < upper) uptime growth both inside and outside range, 1D freeze duration": { + currentTick: 1, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the + // uptimes the position qualifies for. + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + }, + "(lower < curr < upper) no uptime growth inside or outside range, 1W freeze duration": { + currentTick: 1, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneWeekFreeze, + collectTime: defaultJoinTime.Add(100), + }, + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(lower < curr < upper) uptime growth outside range but not inside, 1W freeze duration": { + currentTick: 1, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneWeekFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there was no growth inside the range, we expect no incentives to be claimed + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(lower < curr < upper) uptime growth inside range but not outside, 1W freeze duration": { + currentTick: 1, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneWeekFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the + // uptimes the position qualifies for. + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze), + }, + "(lower < curr < upper) uptime growth both inside and outside range, 1W freeze duration": { + currentTick: 1, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneWeekFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the + // uptimes the position qualifies for. + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze), + }, + "(lower < curr < upper) no uptime growth inside or outside range, no freeze": { + currentTick: 1, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: 0, + collectTime: defaultJoinTime.Add(100), + }, + + // Since the position is not frozen, no incentives should have accrued + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(lower < curr < upper) uptime growth outside range but not inside, no freeze": { + currentTick: 1, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: 0, + collectTime: defaultJoinTime.Add(100), + }, + + // Since the position is not frozen, no incentives should have accrued + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(lower < curr < upper) uptime growth inside range but not outside, no freeze": { + currentTick: 1, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: 0, + collectTime: defaultJoinTime.Add(100), + }, + + // Since the position is not frozen, no incentives should have accrued + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(lower < curr < upper) uptime growth both inside and outside range, no freeze": { + currentTick: 1, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: 0, + collectTime: defaultJoinTime.Add(100), + }, + + // Since the position is not frozen, no incentives should have accrued + expectedIncentivesClaimed: sdk.Coins(nil), + }, + + // ---Cases for currentTick < lowerTick < upperTick--- + + "(curr < lower < upper) no uptime growth inside or outside range, 1D freeze duration": { + currentTick: 0, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(curr < lower < upper) uptime growth outside range but not inside, 1D freeze duration": { + currentTick: 0, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there was no growth inside the range, we expect no incentives to be claimed + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(curr < lower < upper) uptime growth inside range but not outside, 1D freeze duration": { + currentTick: 0, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the + // uptimes the position qualifies for. + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + }, + "(curr < lower < upper) uptime growth both inside and outside range, 1D freeze duration": { + currentTick: 0, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the + // uptimes the position qualifies for. + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + }, + "(curr < lower < upper) no uptime growth inside or outside range, 1W freeze duration": { + currentTick: 0, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneWeekFreeze, + collectTime: defaultJoinTime.Add(100), + }, + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(curr < lower < upper) uptime growth outside range but not inside, 1W freeze duration": { + currentTick: 0, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneWeekFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there was no growth inside the range, we expect no incentives to be claimed + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(curr < lower < upper) uptime growth inside range but not outside, 1W freeze duration": { + currentTick: 0, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneWeekFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the + // uptimes the position qualifies for. + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze), + }, + "(curr < lower < upper) uptime growth both inside and outside range, 1W freeze duration": { + currentTick: 0, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneWeekFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the + // uptimes the position qualifies for. + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze), + }, + "(curr < lower < upper) no uptime growth inside or outside range, no freeze": { + currentTick: 0, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: 0, + collectTime: defaultJoinTime.Add(100), + }, + + // Since the position is not frozen, no incentives should have accrued + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(curr < lower < upper) uptime growth outside range but not inside, no freeze": { + currentTick: 0, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: 0, + collectTime: defaultJoinTime.Add(100), + }, + + // Since the position is not frozen, no incentives should have accrued + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(curr < lower < upper) uptime growth inside range but not outside, no freeze": { + currentTick: 0, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: 0, + collectTime: defaultJoinTime.Add(100), + }, + + // Since the position is not frozen, no incentives should have accrued + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(curr < lower < upper) uptime growth both inside and outside range, no freeze": { + currentTick: 0, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: 0, + collectTime: defaultJoinTime.Add(100), + }, + + // Since the position is not frozen, no incentives should have accrued + expectedIncentivesClaimed: sdk.Coins(nil), + }, + + // ---Cases for lowerTick < upperTick < currentTick--- + + "(lower < upper < curr) no uptime growth inside or outside range, 1D freeze duration": { + currentTick: 3, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(lower < upper < curr) uptime growth outside range but not inside, 1D freeze duration": { + currentTick: 3, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there was no growth inside the range, we expect no incentives to be claimed + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(lower < upper < curr) uptime growth inside range but not outside, 1D freeze duration": { + currentTick: 3, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the + // uptimes the position qualifies for. + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + }, + "(lower < upper < curr) uptime growth both inside and outside range, 1D freeze duration": { + currentTick: 3, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the + // uptimes the position qualifies for. + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + }, + "(lower < upper < curr) no uptime growth inside or outside range, 1W freeze duration": { + currentTick: 3, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneWeekFreeze, + collectTime: defaultJoinTime.Add(100), + }, + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(lower < upper < curr) uptime growth outside range but not inside, 1W freeze duration": { + currentTick: 3, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneWeekFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there was no growth inside the range, we expect no incentives to be claimed + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(lower < upper < curr) uptime growth inside range but not outside, 1W freeze duration": { + currentTick: 3, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneWeekFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the + // uptimes the position qualifies for. + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze), + }, + "(lower < upper < curr) uptime growth both inside and outside range, 1W freeze duration": { + currentTick: 3, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneWeekFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the + // uptimes the position qualifies for. + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze), + }, + "(lower < upper < curr) no uptime growth inside or outside range, no freeze": { + currentTick: 3, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: 0, + collectTime: defaultJoinTime.Add(100), + }, + + // Since the position is not frozen, no incentives should have accrued + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(lower < upper < curr) uptime growth outside range but not inside, no freeze": { + currentTick: 3, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: 0, + collectTime: defaultJoinTime.Add(100), + }, + + // Since the position is not frozen, no incentives should have accrued + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(lower < upper < curr) uptime growth inside range but not outside, no freeze": { + currentTick: 3, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: 0, + collectTime: defaultJoinTime.Add(100), + }, + + // Since the position is not frozen, no incentives should have accrued + expectedIncentivesClaimed: sdk.Coins(nil), + }, + "(lower < upper < curr) uptime growth both inside and outside range, no freeze": { + currentTick: 3, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: 0, + collectTime: defaultJoinTime.Add(100), + }, + + // Since the position is not frozen, no incentives should have accrued + expectedIncentivesClaimed: sdk.Coins(nil), + }, + + // Edge case tests + + "(curr = lower) uptime growth both inside and outside range, 1D freeze duration": { + currentTick: 0, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // We expect this case to behave like (lower < curr < upper) + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + }, + "(curr = upper) uptime growth both inside and outside range, 1D freeze duration": { + currentTick: 2, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 1, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // We expect this case to behave like (lower < upper < curr) + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + }, + "other liquidity on uptime accums: (lower < curr < upper) uptime growth both inside and outside range, 1D freeze duration": { + currentTick: 1, + existingAccumLiquidity: []sdk.Dec{ + sdk.NewDec(18942), + sdk.NewDec(0), + sdk.NewDec(9981), + sdk.NewDec(1), + }, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + + // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the + // uptimes the position qualifies for. + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + }, + + // Error catching + + "accumulator does not exist": { + isInvalidPoolIdGiven: true, + + currentTick: 1, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + expectedIncentivesClaimed: sdk.Coins(nil), + expectedError: accum.AccumDoesNotExistError{AccumName: "uptime/2/0"}, + }, + "position does not exist": { + currentTick: 1, + positionParams: positionParameters{ + owner: s.TestAccs[1], // different owner from the one who initialized the position. + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + expectedIncentivesClaimed: sdk.Coins(nil), + expectedError: cltypes.PositionNotFoundError{PoolId: 1, LowerTick: 0, UpperTick: 2, JoinTime: defaultJoinTime, FreezeDuration: oneDayFreeze}, + }, + } + + for name, tc := range tests { + s.Run(name, func() { + tc := tc + s.SetupTest() + + // We fix join time so tests are deterministic + s.Ctx = s.Ctx.WithBlockTime(tc.positionParams.joinTime) + + validPool := s.PrepareConcentratedPool() + validPoolId := validPool.GetId() + + s.FundAcc(validPool.GetAddress(), tc.expectedIncentivesClaimed) + + clKeeper := s.App.ConcentratedLiquidityKeeper + ctx := s.Ctx + + // Initialize lower and upper ticks with empty uptime trackers + s.initializeTick(ctx, tc.currentTick, tc.positionParams.lowerTick, tc.positionParams.liquidity, cl.EmptyCoins, wrapUptimeTrackers(uptimeHelper.emptyExpectedAccumValues), true) + s.initializeTick(ctx, tc.currentTick, tc.positionParams.upperTick, tc.positionParams.liquidity, cl.EmptyCoins, wrapUptimeTrackers(uptimeHelper.emptyExpectedAccumValues), false) + + if tc.existingAccumLiquidity != nil { + s.addLiquidityToUptimeAccumulators(ctx, validPoolId, ownerWithValidPosition, tc.positionParams.lowerTick, tc.positionParams.upperTick, tc.existingAccumLiquidity) + } + + // Initialize position that will be claiming incentives + err := clKeeper.InitOrUpdatePosition(ctx, validPoolId, ownerWithValidPosition, tc.positionParams.lowerTick, tc.positionParams.upperTick, tc.positionParams.liquidity, tc.positionParams.joinTime, tc.positionParams.freezeDuration) + s.Require().NoError(err) + + // Add to uptime growth inside range + if tc.addedUptimeGrowthInside != nil { + s.addUptimeGrowthInsideRange(s.Ctx, validPoolId, ownerWithValidPosition, tc.currentTick, tc.positionParams.lowerTick, tc.positionParams.upperTick, tc.addedUptimeGrowthInside) + } + + // Add to uptime growth outside range + if tc.addedUptimeGrowthOutside != nil { + s.addUptimeGrowthOutsideRange(s.Ctx, validPoolId, ownerWithValidPosition, tc.currentTick, tc.positionParams.lowerTick, tc.positionParams.upperTick, tc.addedUptimeGrowthOutside) + } + + validPool.SetCurrentTick(sdk.NewInt(tc.currentTick)) + clKeeper.SetPool(ctx, validPool) + + // Checkpoint starting balance to compare against later + poolBalanceBeforeCollect := s.App.BankKeeper.GetAllBalances(ctx, validPool.GetAddress()) + ownerBalancerBeforeCollect := s.App.BankKeeper.GetAllBalances(ctx, tc.positionParams.owner) + + // Set up invalid pool ID for error-catching case(s) + sutPoolId := validPoolId + if tc.isInvalidPoolIdGiven { + sutPoolId = sutPoolId + 1 + } + + // System under test + + s.Ctx = s.Ctx.WithBlockTime(tc.positionParams.collectTime) + actualIncentivesClaimed, err := clKeeper.CollectIncentives(ctx, sutPoolId, tc.positionParams.owner, tc.positionParams.lowerTick, tc.positionParams.upperTick, tc.positionParams.joinTime, tc.positionParams.freezeDuration) + + // Assertions + + poolBalanceAfterCollect := s.App.BankKeeper.GetAllBalances(ctx, validPool.GetAddress()) + ownerBalancerAfterCollect := s.App.BankKeeper.GetAllBalances(ctx, tc.positionParams.owner) + + if tc.expectedError != nil { + s.Require().Error(err) + s.Require().ErrorContains(err, tc.expectedError.Error()) + s.Require().Equal(sdk.Coins{}, actualIncentivesClaimed) + + // Ensure balances are unchanged + s.Require().Equal(poolBalanceBeforeCollect, poolBalanceAfterCollect) + s.Require().Equal(ownerBalancerAfterCollect, ownerBalancerBeforeCollect) + return + } + + // Ensure claimed amount is correct + s.Require().NoError(err) + s.Require().Equal(tc.expectedIncentivesClaimed.String(), actualIncentivesClaimed.String()) + + // Ensure balances are updated by the correct amounts + s.Require().Equal(tc.expectedIncentivesClaimed.String(), (poolBalanceBeforeCollect.Sub(poolBalanceAfterCollect)).String()) + s.Require().Equal(tc.expectedIncentivesClaimed.String(), (ownerBalancerAfterCollect.Sub(ownerBalancerBeforeCollect)).String()) + }) + } +} diff --git a/x/concentrated-liquidity/keeper_test.go b/x/concentrated-liquidity/keeper_test.go index 46d2cc7bc4a..302b9454ab3 100644 --- a/x/concentrated-liquidity/keeper_test.go +++ b/x/concentrated-liquidity/keeper_test.go @@ -7,8 +7,10 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/suite" + "github.com/osmosis-labs/osmosis/osmoutils/accum" "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/internal/math" "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/model" + "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/types" poolmanagertypes "github.com/osmosis-labs/osmosis/v15/x/poolmanager/types" cl "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity" @@ -154,6 +156,116 @@ func (s *KeeperTestSuite) initializeFeeAccumulatorPositionWithLiquidity(ctx sdk. s.Require().NoError(err) } +// addLiquidityToUptimeAccumulators adds shares to all uptime accumulators as defined by the `liquidity` parameter. +// This helper is primarily used to test incentive accrual for specific tick ranges, so we pass in filler values +// for all other components (e.g. join time and freeze duration). +func (s *KeeperTestSuite) addLiquidityToUptimeAccumulators(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick, upperTick int64, liquidity []sdk.Dec) { + s.Require().Equal(len(liquidity), len(types.SupportedUptimes)) + + positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, time.Unix(1, 1), 0)) + uptimeAccums, err := s.App.ConcentratedLiquidityKeeper.GetUptimeAccumulators(ctx, poolId) + s.Require().NoError(err) + + for uptimeIndex, uptimeAccum := range uptimeAccums { + err := uptimeAccum.NewPosition(positionName, liquidity[uptimeIndex], &accum.Options{}) + s.Require().NoError(err) + } +} + +// addUptimeGrowthInsideRange adds uptime growth inside the range defined by [lowerTick, upperTick). +// +// By convention, we add additional growth below the range. This translates to the following logic: +// +// - If currentTick < lowerTick < upperTick, we add to the lower tick's trackers, but not the upper's. +// +// - If lowerTick <= currentTick < upperTick, we add to just the global accumulators. +// +// - If lowerTick < upperTick <= currentTick, we add to the upper tick's trackers, but not the lower's. +func (s *KeeperTestSuite) addUptimeGrowthInsideRange(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, currentTick, lowerTick, upperTick int64, uptimeGrowthToAdd []sdk.DecCoins) { + s.Require().True(lowerTick <= upperTick) + + // Note that we process adds to global accums at the end to ensure that they don't affect the behavior of uninitialized ticks. + if currentTick < lowerTick { + // Add to lower tick's uptime trackers + lowerTickInfo, err := s.App.ConcentratedLiquidityKeeper.GetTickInfo(ctx, poolId, lowerTick) + s.Require().NoError(err) + s.Require().Equal(len(lowerTickInfo.UptimeTrackers), len(uptimeGrowthToAdd)) + + newLowerUptimeTrackerValues, err := addDecCoinsArray(cl.GetUptimeTrackerValues(lowerTickInfo.UptimeTrackers), uptimeGrowthToAdd) + s.Require().NoError(err) + + s.initializeTick(ctx, currentTick, lowerTick, lowerTickInfo.LiquidityGross, lowerTickInfo.FeeGrowthOutside, wrapUptimeTrackers(newLowerUptimeTrackerValues), true) + } else if upperTick <= currentTick { + // Add to upper tick uptime trackers + upperTickInfo, err := s.App.ConcentratedLiquidityKeeper.GetTickInfo(ctx, poolId, upperTick) + s.Require().NoError(err) + s.Require().Equal(len(upperTickInfo.UptimeTrackers), len(uptimeGrowthToAdd)) + + newUpperUptimeTrackerValues, err := addDecCoinsArray(cl.GetUptimeTrackerValues(upperTickInfo.UptimeTrackers), uptimeGrowthToAdd) + s.Require().NoError(err) + + s.initializeTick(ctx, currentTick, upperTick, upperTickInfo.LiquidityGross, upperTickInfo.FeeGrowthOutside, wrapUptimeTrackers(newUpperUptimeTrackerValues), false) + } + + // In all cases, global uptime accums need to be updated. If lowerTick <= currentTick < upperTick, + // nothing more needs to be done. + addToUptimeAccums(ctx, poolId, s.App.ConcentratedLiquidityKeeper, uptimeGrowthToAdd) +} + +// addUptimeGrowthOutsideRange adds uptime growth outside the range defined by [lowerTick, upperTick). +// +// By convention, we add additional growth below the range. This translates to the following logic: +// +// - If currentTick < lowerTick < upperTick, we add to global accumulators to put the growth +// below the tick range. +// +// - If lowerTick <= currentTick < upperTick, we add to lowerTick's uptime trackers to put the +// growth below the tick range. +// +// - If lowerTick < upperTick <= currentTick, we add to both lowerTick and upperTick's uptime trackers, +// the former to put the growth below the tick range and the latter to keep both ticks consistent (since +// lowerTick's uptime trackers are a subset of upperTick's in this case). +func (s *KeeperTestSuite) addUptimeGrowthOutsideRange(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, currentTick, lowerTick, upperTick int64, uptimeGrowthToAdd []sdk.DecCoins) { + s.Require().True(lowerTick <= upperTick) + + // Note that we process adds to global accums at the end to ensure that they don't affect the behavior of uninitialized ticks. + if currentTick < lowerTick || upperTick <= currentTick { + // Add to lower tick uptime trackers + lowerTickInfo, err := s.App.ConcentratedLiquidityKeeper.GetTickInfo(ctx, poolId, lowerTick) + s.Require().NoError(err) + s.Require().Equal(len(lowerTickInfo.UptimeTrackers), len(uptimeGrowthToAdd)) + + newLowerUptimeTrackerValues, err := addDecCoinsArray(cl.GetUptimeTrackerValues(lowerTickInfo.UptimeTrackers), uptimeGrowthToAdd) + s.Require().NoError(err) + + s.initializeTick(ctx, currentTick, lowerTick, lowerTickInfo.LiquidityGross, lowerTickInfo.FeeGrowthOutside, wrapUptimeTrackers(newLowerUptimeTrackerValues), true) + + // Add to upper tick uptime trackers + upperTickInfo, err := s.App.ConcentratedLiquidityKeeper.GetTickInfo(ctx, poolId, upperTick) + s.Require().NoError(err) + s.Require().Equal(len(upperTickInfo.UptimeTrackers), len(uptimeGrowthToAdd)) + + newUpperUptimeTrackerValues, err := addDecCoinsArray(cl.GetUptimeTrackerValues(upperTickInfo.UptimeTrackers), uptimeGrowthToAdd) + s.Require().NoError(err) + + s.initializeTick(ctx, currentTick, upperTick, upperTickInfo.LiquidityGross, upperTickInfo.FeeGrowthOutside, wrapUptimeTrackers(newUpperUptimeTrackerValues), false) + } else if currentTick < upperTick { + // Add to lower tick's uptime trackers + lowerTickInfo, err := s.App.ConcentratedLiquidityKeeper.GetTickInfo(ctx, poolId, lowerTick) + s.Require().NoError(err) + s.Require().Equal(len(lowerTickInfo.UptimeTrackers), len(uptimeGrowthToAdd)) + + newLowerUptimeTrackerValues, err := addDecCoinsArray(cl.GetUptimeTrackerValues(lowerTickInfo.UptimeTrackers), uptimeGrowthToAdd) + s.Require().NoError(err) + + s.initializeTick(ctx, currentTick, lowerTick, lowerTickInfo.LiquidityGross, lowerTickInfo.FeeGrowthOutside, wrapUptimeTrackers(newLowerUptimeTrackerValues), true) + } + + // In all cases, global uptime accums need to be updated. If currentTick < lowerTick, + // nothing more needs to be done. + addToUptimeAccums(ctx, poolId, s.App.ConcentratedLiquidityKeeper, uptimeGrowthToAdd) +} + // validatePositionFeeAccUpdate validates that the position's accumulator with given parameters // has been updated with liquidity. func (s *KeeperTestSuite) validatePositionFeeAccUpdate(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64, liquidity sdk.Dec) { diff --git a/x/concentrated-liquidity/msg_server.go b/x/concentrated-liquidity/msg_server.go index 5ac9ba531a8..f04d83e388d 100644 --- a/x/concentrated-liquidity/msg_server.go +++ b/x/concentrated-liquidity/msg_server.go @@ -161,6 +161,7 @@ func (server msgServer) CollectFees(goCtx context.Context, msg *types.MsgCollect return &types.MsgCollectFeesResponse{CollectedFees: collectedFees}, nil } +// Note: collects incentives for all positions in given range that belong to sender func (server msgServer) CollectIncentives(goCtx context.Context, msg *types.MsgCollectIncentives) (*types.MsgCollectIncentivesResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) @@ -169,11 +170,21 @@ func (server msgServer) CollectIncentives(goCtx context.Context, msg *types.MsgC return nil, err } - collectedIncentives, err := server.keeper.collectFees(ctx, msg.PoolId, sender, msg.LowerTick, msg.UpperTick) + positionsInRange, err := server.keeper.getAllPositionsWithVaryingFreezeTimes(ctx, msg.PoolId, sender, msg.LowerTick, msg.UpperTick) if err != nil { return nil, err } + collectedIncentives := sdk.Coins(nil) + for _, position := range positionsInRange { + collectedIncentivesForPosition, err := server.keeper.collectIncentives(ctx, msg.PoolId, sender, msg.LowerTick, msg.UpperTick, position.JoinTime, position.FreezeDuration) + if err != nil { + return nil, err + } + + collectedIncentives = collectedIncentives.Add(collectedIncentivesForPosition...) + } + ctx.EventManager().EmitEvents(sdk.Events{ sdk.NewEvent( sdk.EventTypeMessage, diff --git a/x/concentrated-liquidity/types/events.go b/x/concentrated-liquidity/types/events.go index 5054e5c7210..1f8032da8bb 100644 --- a/x/concentrated-liquidity/types/events.go +++ b/x/concentrated-liquidity/types/events.go @@ -1,10 +1,10 @@ package types const ( - TypeEvtCreatePosition = "create_position" - TypeEvtWithdrawPosition = "withdraw_position" - TypeEvtCollectFees = "collect_fees" - TypeEvtCollectIncentives = "collect_incentives" + TypeEvtCreatePosition = "create_position" + TypeEvtWithdrawPosition = "withdraw_position" + TypeEvtCollectFees = "collect_fees" + TypeEvtCollectIncentives = "collect_incentives" AttributeValueCategory = ModuleName AttributeKeyPoolId = "pool_id" From 90b4df46e8b50092bb28c261143dbcccf796cf86 Mon Sep 17 00:00:00 2001 From: alpo Date: Sat, 4 Mar 2023 00:54:30 -0800 Subject: [PATCH 112/136] add msg level tests and clean up logic/tests --- proto/osmosis/concentrated-liquidity/tx.proto | 2 + x/concentrated-liquidity/export_test.go | 4 +- x/concentrated-liquidity/incentives.go | 74 +++++---- x/concentrated-liquidity/incentives_test.go | 134 ++++++++++++---- x/concentrated-liquidity/msg_server.go | 12 +- x/concentrated-liquidity/msg_server_test.go | 76 +++++++++ x/concentrated-liquidity/types/msgs.go | 36 ++++- x/concentrated-liquidity/types/tx.pb.go | 151 +++++++++++------- 8 files changed, 354 insertions(+), 135 deletions(-) diff --git a/proto/osmosis/concentrated-liquidity/tx.proto b/proto/osmosis/concentrated-liquidity/tx.proto index d43766326d2..a68f2ab2438 100644 --- a/proto/osmosis/concentrated-liquidity/tx.proto +++ b/proto/osmosis/concentrated-liquidity/tx.proto @@ -13,6 +13,8 @@ service Msg { rpc WithdrawPosition(MsgWithdrawPosition) returns (MsgWithdrawPositionResponse); rpc CollectFees(MsgCollectFees) returns (MsgCollectFeesResponse); + rpc CollectIncentives(MsgCollectIncentives) + returns (MsgCollectIncentivesResponse); } // ===================== MsgCreatePosition diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index b5f5f0811de..4cbf1b03d07 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -228,8 +228,8 @@ func (k Keeper) InitOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, posit return k.initOrUpdatePositionUptime(ctx, poolId, position, owner, lowerTick, upperTick, liquidityDelta, joinTime, freezeDuration) } -func (k Keeper) CollectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64, joinTime time.Time, freezeDuration time.Duration) (sdk.Coins, error) { - return k.collectIncentives(ctx, poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) +func (k Keeper) CollectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64) (sdk.Coins, error) { + return k.collectIncentives(ctx, poolId, owner, lowerTick, upperTick) } func GetUptimeTrackerValues(uptimeTrackers []model.UptimeTracker) []sdk.DecCoins { diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 48adb76076a..10ec67c0065 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -416,69 +416,75 @@ func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, posit return nil } -// collectIncentives collects incentives for all uptime accumulators for the position given by pool id, owner, lower tick, upper tick, join time, and freeze duration. +// collectIncentives collects incentives for all uptime accumulators for all positions belonging to `owner` in the given range. // Upon successful collection, it bank sends the incentives from the pool address to the owner and returns the collected coins. // Returns error if: // - pool with the given id does not exist -// - position given by pool id, owner, lower tick and upper tick does not exist +// - no position given by pool id, owner, lower tick and upper tick exists // - other internal database or math errors. -func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64, joinTime time.Time, freezeDuration time.Duration) (sdk.Coins, error) { - // Note that this implicitly serves as a pool existence check, which is why we run it prior to - // the position existence check. +func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64) (sdk.Coins, error) { uptimeAccumulators, err := k.getUptimeAccumulators(ctx, poolId) if err != nil { return sdk.Coins{}, err } - // We check upfront if the position exists to distinguish between the case where there is no position (should error) - // and the case where the position does not qualify for any incentives (should be a no-op) - _, err = k.GetPosition(ctx, poolId, owner, lowerTick, upperTick, joinTime, freezeDuration) + positionsInRange, err := k.getAllPositionsWithVaryingFreezeTimes(ctx, poolId, owner, lowerTick, upperTick) if err != nil { return sdk.Coins{}, err } + if len(positionsInRange) == 0 { + return sdk.Coins{}, types.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick} + } + // Compute uptime growth outside of the range between lower tick and upper tick uptimeGrowthOutside, err := k.GetUptimeGrowthOutsideRange(ctx, poolId, lowerTick, upperTick) if err != nil { return sdk.Coins{}, err } - positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, joinTime, freezeDuration)) - incentivesClaimed := sdk.Coins(nil) - for uptimeIndex, uptimeAccum := range uptimeAccumulators { - hasPosition, err := uptimeAccum.HasPosition(positionName) - if err != nil { - return sdk.Coins{}, err - } + collectedIncentives := sdk.Coins(nil) + for _, position := range positionsInRange { + positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, position.JoinTime, position.FreezeDuration)) + collectedIncentivesForPosition := sdk.Coins(nil) - if hasPosition { - // Replace position's accumulator before calculating unclaimed rewards - err = preparePositionAccumulator(uptimeAccum, positionName, uptimeGrowthOutside[uptimeIndex]) + for uptimeIndex, uptimeAccum := range uptimeAccumulators { + hasPosition, err := uptimeAccum.HasPosition(positionName) if err != nil { return sdk.Coins{}, err } - // Claim incentives - incentivesClaimedCurrAccum, err := uptimeAccum.ClaimRewards(positionName) - if err != nil { - return sdk.Coins{}, err - } - incentivesClaimed = incentivesClaimed.Add(incentivesClaimedCurrAccum...) + if hasPosition { + // Replace position's accumulator before calculating unclaimed rewards + err = preparePositionAccumulator(uptimeAccum, positionName, uptimeGrowthOutside[uptimeIndex]) + if err != nil { + return sdk.Coins{}, err + } - // Check if position record was deleted after claiming rewards. If not, we update the custom accumulator value. - hasPosition, err = uptimeAccum.HasPosition(positionName) - if err != nil { - return sdk.Coins{}, err - } + // Claim incentives + incentivesClaimedCurrAccum, err := uptimeAccum.ClaimRewards(positionName) + if err != nil { + return sdk.Coins{}, err + } + collectedIncentivesForPosition = collectedIncentivesForPosition.Add(incentivesClaimedCurrAccum...) - if hasPosition { - customAccumulatorValue := uptimeAccum.GetValue().Sub(uptimeGrowthOutside[uptimeIndex]) - err := uptimeAccum.SetPositionCustomAcc(positionName, customAccumulatorValue) + // Check if position record was deleted after claiming rewards. If not, we update the custom accumulator value. + hasPosition, err = uptimeAccum.HasPosition(positionName) if err != nil { return sdk.Coins{}, err } + + if hasPosition { + customAccumulatorValue := uptimeAccum.GetValue().Sub(uptimeGrowthOutside[uptimeIndex]) + err := uptimeAccum.SetPositionCustomAcc(positionName, customAccumulatorValue) + if err != nil { + return sdk.Coins{}, err + } + } } } + + collectedIncentives = collectedIncentives.Add(collectedIncentivesForPosition...) } // Once we have iterated through all the positions, we do a single bank send from the pool to the owner. @@ -487,8 +493,8 @@ func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA return sdk.Coins{}, err } - if err := k.bankKeeper.SendCoins(ctx, pool.GetAddress(), owner, incentivesClaimed); err != nil { + if err := k.bankKeeper.SendCoins(ctx, pool.GetAddress(), owner, collectedIncentives); err != nil { return sdk.Coins{}, err } - return incentivesClaimed, nil + return collectedIncentives, nil } diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index baac24f9450..37f4ec83b61 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -14,8 +14,9 @@ import ( ) var ( - defaultPoolId = uint64(1) - defaultJoinTime = time.Unix(100, 100) + defaultPoolId = uint64(1) + defaultJoinTime = time.Unix(100, 100) + defaultMultiplier = sdk.OneInt() testAddressOne = sdk.AccAddress([]byte("addr1_______________")) testAddressTwo = sdk.AccAddress([]byte("addr2_______________")) @@ -149,10 +150,10 @@ func expectedIncentivesFromRate(denom string, rate sdk.Dec, timeElapsed time.Dur // expectedIncentivesFromUptimeGrowth calculates the amount of incentives we expect to accrue based on uptime accumulator growth. // // Assumes `uptimeGrowths` represents the growths for all global uptime accums and only counts growth that `freezeDuration` qualifies for -// towards result. +// towards result. Takes in a multiplier parameter for further versatility in testing. // // Returns value as truncated sdk.Coins as the primary use of this helper is testing higher level incentives functions such as claiming. -func expectedIncentivesFromUptimeGrowth(uptimeGrowths []sdk.DecCoins, positionShares sdk.Dec, freezeDuration time.Duration) sdk.Coins { +func expectedIncentivesFromUptimeGrowth(uptimeGrowths []sdk.DecCoins, positionShares sdk.Dec, freezeDuration time.Duration, multiplier sdk.Int) sdk.Coins { // Sum up rewards from all inputs totalRewards := sdk.DecCoins(nil) for uptimeIndex, uptimeGrowth := range uptimeGrowths { @@ -164,7 +165,7 @@ func expectedIncentivesFromUptimeGrowth(uptimeGrowths []sdk.DecCoins, positionSh // Calculate position's pro-rata share by multiplying growth by position's shares positionRewards := sdk.Coins(nil) for _, rewardToken := range totalRewards { - positionRewards = positionRewards.Add(sdk.NewCoin(rewardToken.Denom, rewardToken.Amount.Mul(positionShares).TruncateInt())) + positionRewards = positionRewards.Add(sdk.NewCoin(rewardToken.Denom, rewardToken.Amount.Mul(positionShares).TruncateInt().Mul(multiplier))) } return positionRewards @@ -1902,6 +1903,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { // inputs parameters positionParams positionParameters + numPositions int // expectations expectedIncentivesClaimed sdk.Coins @@ -1920,6 +1922,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, expectedIncentivesClaimed: sdk.Coins(nil), }, "(lower < curr < upper) uptime growth outside range but not inside, 1D freeze duration": { @@ -1934,6 +1937,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there was no growth inside the range, we expect no incentives to be claimed expectedIncentivesClaimed: sdk.Coins(nil), @@ -1950,10 +1954,11 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the // uptimes the position qualifies for. - expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze, defaultMultiplier), }, "(lower < curr < upper) uptime growth both inside and outside range, 1D freeze duration": { currentTick: 1, @@ -1968,10 +1973,11 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the // uptimes the position qualifies for. - expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze, defaultMultiplier), }, "(lower < curr < upper) no uptime growth inside or outside range, 1W freeze duration": { currentTick: 1, @@ -1984,6 +1990,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneWeekFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, expectedIncentivesClaimed: sdk.Coins(nil), }, "(lower < curr < upper) uptime growth outside range but not inside, 1W freeze duration": { @@ -1998,6 +2005,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneWeekFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there was no growth inside the range, we expect no incentives to be claimed expectedIncentivesClaimed: sdk.Coins(nil), @@ -2014,10 +2022,11 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneWeekFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the // uptimes the position qualifies for. - expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze), + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze, defaultMultiplier), }, "(lower < curr < upper) uptime growth both inside and outside range, 1W freeze duration": { currentTick: 1, @@ -2032,10 +2041,11 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneWeekFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the // uptimes the position qualifies for. - expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze), + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze, defaultMultiplier), }, "(lower < curr < upper) no uptime growth inside or outside range, no freeze": { currentTick: 1, @@ -2048,6 +2058,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: 0, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since the position is not frozen, no incentives should have accrued expectedIncentivesClaimed: sdk.Coins(nil), @@ -2064,6 +2075,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: 0, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since the position is not frozen, no incentives should have accrued expectedIncentivesClaimed: sdk.Coins(nil), @@ -2080,6 +2092,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: 0, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since the position is not frozen, no incentives should have accrued expectedIncentivesClaimed: sdk.Coins(nil), @@ -2097,6 +2110,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: 0, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since the position is not frozen, no incentives should have accrued expectedIncentivesClaimed: sdk.Coins(nil), @@ -2115,6 +2129,8 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, + expectedIncentivesClaimed: sdk.Coins(nil), }, "(curr < lower < upper) uptime growth outside range but not inside, 1D freeze duration": { @@ -2129,6 +2145,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there was no growth inside the range, we expect no incentives to be claimed expectedIncentivesClaimed: sdk.Coins(nil), @@ -2145,10 +2162,11 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the // uptimes the position qualifies for. - expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze, defaultMultiplier), }, "(curr < lower < upper) uptime growth both inside and outside range, 1D freeze duration": { currentTick: 0, @@ -2163,10 +2181,11 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the // uptimes the position qualifies for. - expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze, defaultMultiplier), }, "(curr < lower < upper) no uptime growth inside or outside range, 1W freeze duration": { currentTick: 0, @@ -2179,6 +2198,8 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneWeekFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, + expectedIncentivesClaimed: sdk.Coins(nil), }, "(curr < lower < upper) uptime growth outside range but not inside, 1W freeze duration": { @@ -2193,6 +2214,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneWeekFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there was no growth inside the range, we expect no incentives to be claimed expectedIncentivesClaimed: sdk.Coins(nil), @@ -2209,10 +2231,11 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneWeekFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the // uptimes the position qualifies for. - expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze), + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze, defaultMultiplier), }, "(curr < lower < upper) uptime growth both inside and outside range, 1W freeze duration": { currentTick: 0, @@ -2227,10 +2250,11 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneWeekFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the // uptimes the position qualifies for. - expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze), + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze, defaultMultiplier), }, "(curr < lower < upper) no uptime growth inside or outside range, no freeze": { currentTick: 0, @@ -2243,6 +2267,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: 0, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since the position is not frozen, no incentives should have accrued expectedIncentivesClaimed: sdk.Coins(nil), @@ -2259,6 +2284,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: 0, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since the position is not frozen, no incentives should have accrued expectedIncentivesClaimed: sdk.Coins(nil), @@ -2275,6 +2301,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: 0, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since the position is not frozen, no incentives should have accrued expectedIncentivesClaimed: sdk.Coins(nil), @@ -2292,6 +2319,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: 0, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since the position is not frozen, no incentives should have accrued expectedIncentivesClaimed: sdk.Coins(nil), @@ -2310,6 +2338,8 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, + expectedIncentivesClaimed: sdk.Coins(nil), }, "(lower < upper < curr) uptime growth outside range but not inside, 1D freeze duration": { @@ -2324,6 +2354,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there was no growth inside the range, we expect no incentives to be claimed expectedIncentivesClaimed: sdk.Coins(nil), @@ -2340,10 +2371,11 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the // uptimes the position qualifies for. - expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze, defaultMultiplier), }, "(lower < upper < curr) uptime growth both inside and outside range, 1D freeze duration": { currentTick: 3, @@ -2358,10 +2390,11 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the // uptimes the position qualifies for. - expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze, defaultMultiplier), }, "(lower < upper < curr) no uptime growth inside or outside range, 1W freeze duration": { currentTick: 3, @@ -2374,6 +2407,8 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneWeekFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, + expectedIncentivesClaimed: sdk.Coins(nil), }, "(lower < upper < curr) uptime growth outside range but not inside, 1W freeze duration": { @@ -2388,6 +2423,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneWeekFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there was no growth inside the range, we expect no incentives to be claimed expectedIncentivesClaimed: sdk.Coins(nil), @@ -2404,10 +2440,11 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneWeekFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the // uptimes the position qualifies for. - expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze), + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze, defaultMultiplier), }, "(lower < upper < curr) uptime growth both inside and outside range, 1W freeze duration": { currentTick: 3, @@ -2422,10 +2459,11 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneWeekFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the // uptimes the position qualifies for. - expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze), + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze, defaultMultiplier), }, "(lower < upper < curr) no uptime growth inside or outside range, no freeze": { currentTick: 3, @@ -2438,6 +2476,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: 0, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since the position is not frozen, no incentives should have accrued expectedIncentivesClaimed: sdk.Coins(nil), @@ -2454,6 +2493,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: 0, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since the position is not frozen, no incentives should have accrued expectedIncentivesClaimed: sdk.Coins(nil), @@ -2470,6 +2510,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: 0, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since the position is not frozen, no incentives should have accrued expectedIncentivesClaimed: sdk.Coins(nil), @@ -2487,6 +2528,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: 0, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since the position is not frozen, no incentives should have accrued expectedIncentivesClaimed: sdk.Coins(nil), @@ -2507,9 +2549,10 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // We expect this case to behave like (lower < curr < upper) - expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze, defaultMultiplier), }, "(curr = upper) uptime growth both inside and outside range, 1D freeze duration": { currentTick: 2, @@ -2524,9 +2567,10 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // We expect this case to behave like (lower < upper < curr) - expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze, defaultMultiplier), }, "other liquidity on uptime accums: (lower < curr < upper) uptime growth both inside and outside range, 1D freeze duration": { currentTick: 1, @@ -2547,10 +2591,35 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, + numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the // uptimes the position qualifies for. - expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze), + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze, defaultMultiplier), + }, + "multiple positions in same range: (lower < curr < upper) uptime growth both inside and outside range, 1D freeze duration": { + currentTick: 1, + existingAccumLiquidity: []sdk.Dec{ + sdk.NewDec(18942), + sdk.NewDec(0), + sdk.NewDec(9981), + sdk.NewDec(1), + }, + addedUptimeGrowthInside: uptimeHelper.hundredTokensMultiDenom, + addedUptimeGrowthOutside: uptimeHelper.hundredTokensMultiDenom, + positionParams: positionParameters{ + owner: ownerWithValidPosition, + lowerTick: 0, + upperTick: 2, + liquidity: DefaultLiquidityAmt, + joinTime: defaultJoinTime, + freezeDuration: oneDayFreeze, + collectTime: defaultJoinTime.Add(100), + }, + numPositions: 3, + + // Since each join has the same liquidity, we expect exactly 3x the rewards + expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze, sdk.NewInt(3)), }, // Error catching @@ -2568,7 +2637,9 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, - expectedIncentivesClaimed: sdk.Coins(nil), + numPositions: 1, + + expectedIncentivesClaimed: sdk.Coins{}, expectedError: accum.AccumDoesNotExistError{AccumName: "uptime/2/0"}, }, "position does not exist": { @@ -2582,8 +2653,10 @@ func (s *KeeperTestSuite) TestCollectIncentives() { freezeDuration: oneDayFreeze, collectTime: defaultJoinTime.Add(100), }, - expectedIncentivesClaimed: sdk.Coins(nil), - expectedError: cltypes.PositionNotFoundError{PoolId: 1, LowerTick: 0, UpperTick: 2, JoinTime: defaultJoinTime, FreezeDuration: oneDayFreeze}, + numPositions: 0, + + expectedIncentivesClaimed: sdk.Coins{}, + expectedError: cltypes.PositionNotFoundError{PoolId: 1, LowerTick: 0, UpperTick: 2}, }, } @@ -2611,9 +2684,14 @@ func (s *KeeperTestSuite) TestCollectIncentives() { s.addLiquidityToUptimeAccumulators(ctx, validPoolId, ownerWithValidPosition, tc.positionParams.lowerTick, tc.positionParams.upperTick, tc.existingAccumLiquidity) } - // Initialize position that will be claiming incentives - err := clKeeper.InitOrUpdatePosition(ctx, validPoolId, ownerWithValidPosition, tc.positionParams.lowerTick, tc.positionParams.upperTick, tc.positionParams.liquidity, tc.positionParams.joinTime, tc.positionParams.freezeDuration) - s.Require().NoError(err) + // Initialize position(s) that will be claiming incentives + for i := 0; i < tc.numPositions; i++ { + err := clKeeper.InitOrUpdatePosition(ctx, validPoolId, ownerWithValidPosition, tc.positionParams.lowerTick, tc.positionParams.upperTick, tc.positionParams.liquidity, tc.positionParams.joinTime, tc.positionParams.freezeDuration) + s.Require().NoError(err) + + // Increment blocktime to ensure future adds are separate in state due to different join times + s.Ctx = s.Ctx.WithBlockTime(s.Ctx.BlockTime().Add(1)) + } // Add to uptime growth inside range if tc.addedUptimeGrowthInside != nil { @@ -2641,7 +2719,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { // System under test s.Ctx = s.Ctx.WithBlockTime(tc.positionParams.collectTime) - actualIncentivesClaimed, err := clKeeper.CollectIncentives(ctx, sutPoolId, tc.positionParams.owner, tc.positionParams.lowerTick, tc.positionParams.upperTick, tc.positionParams.joinTime, tc.positionParams.freezeDuration) + actualIncentivesClaimed, err := clKeeper.CollectIncentives(ctx, sutPoolId, tc.positionParams.owner, tc.positionParams.lowerTick, tc.positionParams.upperTick) // Assertions @@ -2651,7 +2729,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { if tc.expectedError != nil { s.Require().Error(err) s.Require().ErrorContains(err, tc.expectedError.Error()) - s.Require().Equal(sdk.Coins{}, actualIncentivesClaimed) + s.Require().Equal(tc.expectedIncentivesClaimed, actualIncentivesClaimed) // Ensure balances are unchanged s.Require().Equal(poolBalanceBeforeCollect, poolBalanceAfterCollect) diff --git a/x/concentrated-liquidity/msg_server.go b/x/concentrated-liquidity/msg_server.go index f04d83e388d..247deda52fe 100644 --- a/x/concentrated-liquidity/msg_server.go +++ b/x/concentrated-liquidity/msg_server.go @@ -170,21 +170,11 @@ func (server msgServer) CollectIncentives(goCtx context.Context, msg *types.MsgC return nil, err } - positionsInRange, err := server.keeper.getAllPositionsWithVaryingFreezeTimes(ctx, msg.PoolId, sender, msg.LowerTick, msg.UpperTick) + collectedIncentives, err := server.keeper.collectIncentives(ctx, msg.PoolId, sender, msg.LowerTick, msg.UpperTick) if err != nil { return nil, err } - collectedIncentives := sdk.Coins(nil) - for _, position := range positionsInRange { - collectedIncentivesForPosition, err := server.keeper.collectIncentives(ctx, msg.PoolId, sender, msg.LowerTick, msg.UpperTick, position.JoinTime, position.FreezeDuration) - if err != nil { - return nil, err - } - - collectedIncentives = collectedIncentives.Add(collectedIncentivesForPosition...) - } - ctx.EventManager().EmitEvents(sdk.Events{ sdk.NewEvent( sdk.EventTypeMessage, diff --git a/x/concentrated-liquidity/msg_server_test.go b/x/concentrated-liquidity/msg_server_test.go index f35b30e9fbf..7703322a5c6 100644 --- a/x/concentrated-liquidity/msg_server_test.go +++ b/x/concentrated-liquidity/msg_server_test.go @@ -207,3 +207,79 @@ func (suite *KeeperTestSuite) TestCollectFees_Events() { }) } } + +// TestCollectIncentives_Events tests that events are correctly emitted +// when calling CollectIncentives. +func (suite *KeeperTestSuite) TestCollectIncentives_Events() { + testcases := map[string]struct { + upperTick int64 + lowerTick int64 + expectedCollectIncentivesEvent int + expectedMessageEvents int + expectedError error + errorFromValidateBasic error + }{ + "happy path": { + upperTick: DefaultUpperTick, + lowerTick: DefaultLowerTick, + expectedCollectIncentivesEvent: 1, + expectedMessageEvents: 2, // 1 for collect incentives, 1 for message + }, + "error: lowerTick greater than upperTick": { + upperTick: DefaultLowerTick, + lowerTick: DefaultUpperTick, + expectedError: types.PositionNotFoundError{PoolId: 1, LowerTick: DefaultUpperTick, UpperTick: DefaultLowerTick}, + errorFromValidateBasic: types.InvalidLowerUpperTickError{LowerTick: DefaultUpperTick, UpperTick: DefaultLowerTick}, + }, + "error: lowerTick equal to upperTick": { + upperTick: 10, + lowerTick: 10, + expectedError: types.PositionNotFoundError{PoolId: 1, LowerTick: 10, UpperTick: 10}, + errorFromValidateBasic: types.InvalidLowerUpperTickError{LowerTick: 10, UpperTick: 10}, + }, + } + + for name, tc := range testcases { + suite.Run(name, func() { + suite.Setup() + ctx := suite.Ctx + + // Create a cl pool with a default position + pool := suite.PrepareConcentratedPool() + suite.SetupDefaultPosition(pool.GetId()) + + msgServer := cl.NewMsgServerImpl(suite.App.ConcentratedLiquidityKeeper) + + // Reset event counts to 0 by creating a new manager. + ctx = ctx.WithEventManager(sdk.NewEventManager()) + suite.Equal(0, len(ctx.EventManager().Events())) + + msg := &cltypes.MsgCollectIncentives{ + PoolId: pool.GetId(), + Sender: suite.TestAccs[0].String(), + LowerTick: tc.lowerTick, + UpperTick: tc.upperTick, + } + + response, err := msgServer.CollectIncentives(sdk.WrapSDKContext(ctx), msg) + + if tc.expectedError == nil { + suite.NoError(err) + suite.NotNil(response) + suite.AssertEventEmitted(ctx, cltypes.TypeEvtCollectIncentives, tc.expectedCollectIncentivesEvent) + suite.AssertEventEmitted(ctx, sdk.EventTypeMessage, tc.expectedMessageEvents) + } else { + suite.Require().Error(err) + suite.Require().ErrorContains(err, tc.expectedError.Error()) + suite.Require().Nil(response) + } + + // Some validate basic checks are defense in depth so they would normally not be possible to reach + // This check allows us to still test these cases + if tc.errorFromValidateBasic != nil { + suite.Require().Error(msg.ValidateBasic()) + suite.Require().ErrorAs(msg.ValidateBasic(), &tc.errorFromValidateBasic) + } + }) + } +} diff --git a/x/concentrated-liquidity/types/msgs.go b/x/concentrated-liquidity/types/msgs.go index 2b923f4a450..c55451ee91d 100644 --- a/x/concentrated-liquidity/types/msgs.go +++ b/x/concentrated-liquidity/types/msgs.go @@ -8,9 +8,10 @@ import ( // constants. const ( - TypeMsgCreatePosition = "create-position" - TypeMsgWithdrawPosition = "withdraw-position" - TypeMsgCollectFees = "collect-fees" + TypeMsgCreatePosition = "create-position" + TypeMsgWithdrawPosition = "withdraw-position" + TypeMsgCollectFees = "collect-fees" + TypeMsgCollectIncentives = "collect-incentives" ) var _ sdk.Msg = &MsgCreatePosition{} @@ -127,3 +128,32 @@ func (msg MsgCollectFees) GetSigners() []sdk.AccAddress { } return []sdk.AccAddress{sender} } + +var _ sdk.Msg = &MsgCollectIncentives{} + +func (msg MsgCollectIncentives) Route() string { return RouterKey } +func (msg MsgCollectIncentives) Type() string { return TypeMsgCollectIncentives } +func (msg MsgCollectIncentives) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + return fmt.Errorf("Invalid sender address (%s)", err) + } + + if msg.LowerTick >= msg.UpperTick { + return InvalidLowerUpperTickError{LowerTick: msg.LowerTick, UpperTick: msg.UpperTick} + } + + return nil +} + +func (msg MsgCollectIncentives) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +func (msg MsgCollectIncentives) GetSigners() []sdk.AccAddress { + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + return []sdk.AccAddress{sender} +} diff --git a/x/concentrated-liquidity/types/tx.pb.go b/x/concentrated-liquidity/types/tx.pb.go index c5777268d28..6d58153f204 100644 --- a/x/concentrated-liquidity/types/tx.pb.go +++ b/x/concentrated-liquidity/types/tx.pb.go @@ -534,64 +534,65 @@ func init() { } var fileDescriptor_1f1fff802923d7db = []byte{ - // 905 bytes of a gzipped FileDescriptorProto + // 922 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x57, 0x41, 0x6f, 0xdc, 0x44, - 0x14, 0xce, 0x74, 0xc3, 0xa6, 0x3b, 0x55, 0x36, 0x59, 0x37, 0x2d, 0xee, 0xb6, 0xac, 0x57, 0x83, - 0x80, 0x20, 0x88, 0x5d, 0x17, 0x2a, 0x55, 0x95, 0x90, 0x8a, 0x13, 0x21, 0x05, 0x29, 0x12, 0xb2, - 0x8a, 0x90, 0x2a, 0x24, 0xcb, 0x6b, 0x4f, 0xb6, 0x43, 0x6c, 0x8f, 0xeb, 0x99, 0x4d, 0xba, 0x88, - 0x1b, 0x07, 0x2e, 0x1c, 0x0a, 0x27, 0x7e, 0x00, 0x77, 0xfe, 0x46, 0x0f, 0x1c, 0x7a, 0x00, 0x09, - 0xf5, 0x60, 0x50, 0x72, 0xe3, 0xb8, 0xbf, 0x00, 0xd9, 0x33, 0xb6, 0x37, 0xde, 0x45, 0x74, 0x53, - 0x84, 0x44, 0x4e, 0xeb, 0x79, 0xf3, 0xbe, 0xef, 0xf3, 0x7c, 0x33, 0xef, 0x8d, 0x17, 0xbe, 0x45, - 0x59, 0x48, 0x19, 0x61, 0x86, 0x47, 0x23, 0x0f, 0x47, 0x3c, 0x71, 0x39, 0xf6, 0xb7, 0x02, 0xf2, - 0x68, 0x44, 0x7c, 0xc2, 0xc7, 0x06, 0x7f, 0xac, 0xc7, 0x09, 0xe5, 0x54, 0x79, 0x43, 0x26, 0xea, - 0xd3, 0x89, 0x65, 0x9e, 0x7e, 0x68, 0x0e, 0x30, 0x77, 0xcd, 0xee, 0xc6, 0x90, 0x0e, 0x69, 0x8e, - 0x30, 0xb2, 0x27, 0x01, 0xee, 0x6a, 0x43, 0x4a, 0x87, 0x01, 0x36, 0xf2, 0xd1, 0x60, 0xb4, 0x6f, - 0x70, 0x12, 0x62, 0xc6, 0xdd, 0x30, 0x96, 0x09, 0xbd, 0x7a, 0x82, 0x3f, 0x4a, 0x5c, 0x4e, 0x68, - 0x54, 0xcc, 0x7b, 0xb9, 0xbc, 0x31, 0x70, 0x19, 0x36, 0xa4, 0x96, 0xe1, 0x51, 0x22, 0xe7, 0xd1, - 0x37, 0x4d, 0xd8, 0xd9, 0x63, 0xc3, 0xed, 0x04, 0xbb, 0x1c, 0x7f, 0x42, 0x19, 0xc9, 0xb0, 0xca, - 0x3b, 0x70, 0x25, 0xa6, 0x34, 0x70, 0x88, 0xaf, 0x82, 0x3e, 0xd8, 0x5c, 0xb6, 0x94, 0x49, 0xaa, - 0xb5, 0xc7, 0x6e, 0x18, 0xdc, 0x45, 0x72, 0x02, 0xd9, 0xcd, 0xec, 0x69, 0xd7, 0x57, 0xde, 0x86, - 0x4d, 0x86, 0x23, 0x1f, 0x27, 0xea, 0x85, 0x3e, 0xd8, 0x6c, 0x59, 0x9d, 0x49, 0xaa, 0xad, 0x8a, - 0x5c, 0x11, 0x47, 0xb6, 0x4c, 0x50, 0xde, 0x87, 0x30, 0xa0, 0x47, 0x38, 0x71, 0x38, 0xf1, 0x0e, - 0xd4, 0x46, 0x1f, 0x6c, 0x36, 0xac, 0x2b, 0x93, 0x54, 0xeb, 0x88, 0xf4, 0x6a, 0x0e, 0xd9, 0xad, - 0x7c, 0x70, 0x9f, 0x78, 0x07, 0x19, 0x6a, 0x14, 0xc7, 0x05, 0x6a, 0xb9, 0x8e, 0xaa, 0xe6, 0x90, - 0xdd, 0xca, 0x07, 0x39, 0xca, 0x81, 0x6d, 0x4e, 0x0f, 0x70, 0xe4, 0xf8, 0x98, 0x91, 0x04, 0xfb, - 0x37, 0xd5, 0x57, 0xfa, 0x60, 0xf3, 0xd2, 0xad, 0x6b, 0xba, 0xb0, 0x44, 0xcf, 0x2c, 0x29, 0xec, - 0xd7, 0xb7, 0x29, 0x89, 0xac, 0xd7, 0x9e, 0xa6, 0xda, 0xd2, 0x24, 0xd5, 0xae, 0x08, 0xe2, 0xd3, - 0x70, 0x64, 0xaf, 0xe6, 0x81, 0x1d, 0x39, 0x9e, 0x11, 0x30, 0xd5, 0xe6, 0xcb, 0x08, 0x98, 0x35, - 0x01, 0x53, 0x39, 0x84, 0x1d, 0x91, 0x11, 0x92, 0xc8, 0x71, 0x43, 0x3a, 0x8a, 0xf8, 0x4d, 0x75, - 0x25, 0xf7, 0xf8, 0xe3, 0x8c, 0xe8, 0x79, 0xaa, 0xbd, 0x39, 0x24, 0xfc, 0xe1, 0x68, 0xa0, 0x7b, - 0x34, 0x34, 0xe4, 0x4e, 0x8b, 0x9f, 0x2d, 0xe6, 0x1f, 0x18, 0x7c, 0x1c, 0x63, 0xa6, 0xef, 0x46, - 0x7c, 0x92, 0x6a, 0xea, 0xb4, 0xe4, 0x14, 0x21, 0xb2, 0xd7, 0xf2, 0xd8, 0x1e, 0x89, 0x3e, 0x14, - 0x91, 0x79, 0xba, 0xa6, 0x7a, 0xf1, 0xdf, 0xd5, 0x35, 0x67, 0x74, 0x4d, 0xe5, 0x2b, 0xb8, 0xb6, - 0x9f, 0x60, 0xfc, 0x25, 0x76, 0x8a, 0x43, 0xac, 0xb6, 0xa4, 0xa3, 0xe2, 0x94, 0xeb, 0xc5, 0x29, - 0xd7, 0x77, 0x64, 0x82, 0x75, 0x27, 0x7b, 0xa1, 0x3f, 0x53, 0x4d, 0x29, 0x20, 0xef, 0xd2, 0x90, - 0x70, 0x1c, 0xc6, 0x7c, 0x3c, 0x49, 0xb5, 0xab, 0x42, 0xbc, 0xc6, 0x8a, 0x7e, 0xf8, 0x5d, 0x03, - 0x76, 0x5b, 0x44, 0x0b, 0x26, 0xf4, 0xf3, 0x05, 0x78, 0x6d, 0xa6, 0x12, 0x6c, 0xcc, 0x62, 0x1a, - 0x31, 0xac, 0x3c, 0x80, 0x2b, 0xc5, 0x0e, 0x80, 0xdc, 0x89, 0x7b, 0x0b, 0x3b, 0x21, 0xeb, 0xa7, - 0xf4, 0xbd, 0x20, 0xac, 0xb8, 0x4d, 0x59, 0x41, 0x2f, 0xc9, 0x6d, 0x96, 0xdc, 0xa6, 0x72, 0x04, - 0x3b, 0x65, 0xaf, 0x71, 0xbc, 0x7c, 0x6d, 0x7e, 0x5e, 0x08, 0x8b, 0xed, 0xe5, 0x0e, 0xf6, 0xaa, - 0xbd, 0x9c, 0x21, 0x44, 0xf6, 0x7a, 0x19, 0xdb, 0x96, 0xa1, 0x1f, 0x97, 0xe1, 0xe5, 0x3d, 0x36, - 0xfc, 0x8c, 0xf0, 0x87, 0x7e, 0xe2, 0x1e, 0x9d, 0xab, 0xd6, 0xc2, 0x61, 0xb5, 0x5e, 0x79, 0x9e, - 0xa5, 0xa7, 0xbb, 0x0b, 0x7b, 0xfa, 0x6a, 0xdd, 0x53, 0xc1, 0x87, 0xec, 0xb5, 0x32, 0x24, 0xea, - 0x43, 0xf9, 0x14, 0xb6, 0xbe, 0xa0, 0x24, 0x72, 0xb2, 0x2b, 0x40, 0xb6, 0x9a, 0xee, 0x4c, 0x61, - 0xdc, 0x2f, 0xee, 0x07, 0xeb, 0x86, 0xec, 0x35, 0xeb, 0x42, 0xa0, 0x84, 0xa2, 0x27, 0xd9, 0xe9, - 0xbf, 0x98, 0x8d, 0xb3, 0xe4, 0x79, 0x55, 0xb7, 0xf2, 0xdf, 0x55, 0xdd, 0xaf, 0x00, 0x5e, 0x9f, - 0x73, 0x4c, 0xfe, 0xef, 0x75, 0x87, 0x7e, 0x01, 0xb0, 0x9d, 0x75, 0x13, 0x1a, 0x04, 0xd8, 0xe3, - 0x1f, 0x61, 0xcc, 0xce, 0xc3, 0xc9, 0x47, 0x63, 0x78, 0xf5, 0xf4, 0xaa, 0xca, 0x8d, 0x72, 0x60, - 0xdb, 0x13, 0x61, 0xec, 0x3b, 0xfb, 0x18, 0x33, 0x15, 0xf4, 0x1b, 0x0b, 0xdd, 0x86, 0xa7, 0xe1, - 0xc8, 0x5e, 0x2d, 0x03, 0x99, 0x10, 0x7a, 0x0e, 0xe0, 0x46, 0xa5, 0xbd, 0x9b, 0x7f, 0x4b, 0x91, - 0xc3, 0x73, 0xe2, 0xeb, 0x77, 0x00, 0xde, 0x98, 0xb7, 0xb8, 0xd2, 0xde, 0x47, 0x70, 0xa3, 0xf2, - 0x87, 0x94, 0xf3, 0xff, 0x6c, 0xf2, 0xeb, 0xd2, 0xe4, 0xeb, 0x75, 0x93, 0x2b, 0x12, 0x64, 0x5f, - 0x2e, 0xc3, 0x95, 0xf4, 0xad, 0x9f, 0x1a, 0xb0, 0xb1, 0xc7, 0x86, 0xca, 0xb7, 0x00, 0xb6, 0x6b, - 0xdf, 0x87, 0x77, 0xf4, 0x17, 0xfa, 0xa8, 0xd5, 0x67, 0xee, 0xd3, 0xee, 0xbd, 0xb3, 0x22, 0x4b, - 0x27, 0xbe, 0x07, 0x70, 0x7d, 0xe6, 0x56, 0xb9, 0xfb, 0xe2, 0xb4, 0x75, 0x6c, 0xd7, 0x3a, 0x3b, - 0xb6, 0x7c, 0xa9, 0xaf, 0x01, 0xbc, 0x34, 0x5d, 0xeb, 0xb7, 0x17, 0x58, 0x66, 0x05, 0xeb, 0x7e, - 0x70, 0x26, 0x58, 0xf1, 0x16, 0xd6, 0xe7, 0x4f, 0x8f, 0x7b, 0xe0, 0xd9, 0x71, 0x0f, 0xfc, 0x71, - 0xdc, 0x03, 0x4f, 0x4e, 0x7a, 0x4b, 0xcf, 0x4e, 0x7a, 0x4b, 0xbf, 0x9d, 0xf4, 0x96, 0x1e, 0x58, - 0x53, 0x1d, 0x4d, 0x4a, 0x6c, 0x05, 0xee, 0x80, 0x15, 0x03, 0xe3, 0xd0, 0xbc, 0x6d, 0x3c, 0xfe, - 0xdb, 0xff, 0x32, 0x59, 0xc7, 0x1b, 0x34, 0xf3, 0x7b, 0xe0, 0xbd, 0xbf, 0x02, 0x00, 0x00, 0xff, - 0xff, 0x90, 0x8a, 0xae, 0x67, 0xfa, 0x0c, 0x00, 0x00, + 0x14, 0xce, 0x34, 0x61, 0xd3, 0x9d, 0x2a, 0x9b, 0xac, 0x9b, 0x16, 0x77, 0x5b, 0xd6, 0xab, 0x41, + 0x40, 0x10, 0xc4, 0xae, 0x0b, 0x95, 0xaa, 0x22, 0xa4, 0xe2, 0x44, 0x48, 0x41, 0x8a, 0x84, 0xac, + 0x22, 0xa4, 0x0a, 0xc9, 0xf2, 0xda, 0x93, 0xed, 0x90, 0xb5, 0xc7, 0xf5, 0xcc, 0x26, 0x5d, 0xc4, + 0x8d, 0x03, 0x17, 0x0e, 0x05, 0x09, 0x89, 0x1f, 0xc0, 0x7f, 0xa1, 0x07, 0x0e, 0x3d, 0x80, 0x84, + 0x7a, 0x30, 0x28, 0xb9, 0x71, 0xdc, 0x5f, 0x80, 0xec, 0x19, 0xdb, 0x1b, 0x7b, 0x11, 0xdd, 0x04, + 0x21, 0x91, 0x53, 0x76, 0xde, 0xbc, 0xef, 0xfb, 0x66, 0xbe, 0x99, 0xf7, 0xc6, 0x81, 0x6f, 0x50, + 0x16, 0x50, 0x46, 0x98, 0xe1, 0xd1, 0xd0, 0xc3, 0x21, 0x8f, 0x5d, 0x8e, 0xfd, 0xcd, 0x21, 0x79, + 0x34, 0x22, 0x3e, 0xe1, 0x63, 0x83, 0x3f, 0xd6, 0xa3, 0x98, 0x72, 0xaa, 0xbc, 0x26, 0x13, 0xf5, + 0xe9, 0xc4, 0x22, 0x4f, 0x3f, 0x30, 0xfb, 0x98, 0xbb, 0x66, 0x67, 0x7d, 0x40, 0x07, 0x34, 0x43, + 0x18, 0xe9, 0x2f, 0x01, 0xee, 0x68, 0x03, 0x4a, 0x07, 0x43, 0x6c, 0x64, 0xa3, 0xfe, 0x68, 0xcf, + 0xe0, 0x24, 0xc0, 0x8c, 0xbb, 0x41, 0x24, 0x13, 0xba, 0xd5, 0x04, 0x7f, 0x14, 0xbb, 0x9c, 0xd0, + 0x30, 0x9f, 0xf7, 0x32, 0x79, 0xa3, 0xef, 0x32, 0x6c, 0x48, 0x2d, 0xc3, 0xa3, 0x44, 0xce, 0xa3, + 0xaf, 0x1b, 0xb0, 0xbd, 0xcb, 0x06, 0x5b, 0x31, 0x76, 0x39, 0xfe, 0x98, 0x32, 0x92, 0x62, 0x95, + 0xb7, 0xe0, 0x72, 0x44, 0xe9, 0xd0, 0x21, 0xbe, 0x0a, 0x7a, 0x60, 0x63, 0xc9, 0x52, 0x26, 0x89, + 0xd6, 0x1a, 0xbb, 0xc1, 0xf0, 0x2e, 0x92, 0x13, 0xc8, 0x6e, 0xa4, 0xbf, 0x76, 0x7c, 0xe5, 0x4d, + 0xd8, 0x60, 0x38, 0xf4, 0x71, 0xac, 0x5e, 0xe8, 0x81, 0x8d, 0xa6, 0xd5, 0x9e, 0x24, 0xda, 0x8a, + 0xc8, 0x15, 0x71, 0x64, 0xcb, 0x04, 0xe5, 0x5d, 0x08, 0x87, 0xf4, 0x10, 0xc7, 0x0e, 0x27, 0xde, + 0xbe, 0xba, 0xd8, 0x03, 0x1b, 0x8b, 0xd6, 0x95, 0x49, 0xa2, 0xb5, 0x45, 0x7a, 0x39, 0x87, 0xec, + 0x66, 0x36, 0xb8, 0x4f, 0xbc, 0xfd, 0x14, 0x35, 0x8a, 0xa2, 0x1c, 0xb5, 0x54, 0x45, 0x95, 0x73, + 0xc8, 0x6e, 0x66, 0x83, 0x0c, 0xe5, 0xc0, 0x16, 0xa7, 0xfb, 0x38, 0x74, 0x7c, 0xcc, 0x48, 0x8c, + 0xfd, 0x9b, 0xea, 0x4b, 0x3d, 0xb0, 0x71, 0xe9, 0xd6, 0x35, 0x5d, 0x58, 0xa2, 0xa7, 0x96, 0xe4, + 0xf6, 0xeb, 0x5b, 0x94, 0x84, 0xd6, 0x2b, 0x4f, 0x13, 0x6d, 0x61, 0x92, 0x68, 0x57, 0x04, 0xf1, + 0x49, 0x38, 0xb2, 0x57, 0xb2, 0xc0, 0xb6, 0x1c, 0xd7, 0x04, 0x4c, 0xb5, 0x71, 0x16, 0x01, 0xb3, + 0x22, 0x60, 0x2a, 0x07, 0xb0, 0x2d, 0x32, 0x02, 0x12, 0x3a, 0x6e, 0x40, 0x47, 0x21, 0xbf, 0xa9, + 0x2e, 0x67, 0x1e, 0x7f, 0x94, 0x12, 0x3d, 0x4f, 0xb4, 0xd7, 0x07, 0x84, 0x3f, 0x1c, 0xf5, 0x75, + 0x8f, 0x06, 0x86, 0x3c, 0x69, 0xf1, 0x67, 0x93, 0xf9, 0xfb, 0x06, 0x1f, 0x47, 0x98, 0xe9, 0x3b, + 0x21, 0x9f, 0x24, 0x9a, 0x3a, 0x2d, 0x39, 0x45, 0x88, 0xec, 0xd5, 0x2c, 0xb6, 0x4b, 0xc2, 0x0f, + 0x44, 0x64, 0x96, 0xae, 0xa9, 0x5e, 0xfc, 0x77, 0x75, 0xcd, 0x9a, 0xae, 0xa9, 0x7c, 0x09, 0x57, + 0xf7, 0x62, 0x8c, 0xbf, 0xc0, 0x4e, 0x7e, 0x89, 0xd5, 0xa6, 0x74, 0x54, 0xdc, 0x72, 0x3d, 0xbf, + 0xe5, 0xfa, 0xb6, 0x4c, 0xb0, 0xee, 0xa4, 0x0b, 0xfa, 0x33, 0xd1, 0x94, 0x1c, 0xf2, 0x36, 0x0d, + 0x08, 0xc7, 0x41, 0xc4, 0xc7, 0x93, 0x44, 0xbb, 0x2a, 0xc4, 0x2b, 0xac, 0xe8, 0x87, 0xdf, 0x35, + 0x60, 0xb7, 0x44, 0x34, 0x67, 0x42, 0x3f, 0x5f, 0x80, 0xd7, 0x6a, 0x95, 0x60, 0x63, 0x16, 0xd1, + 0x90, 0x61, 0xe5, 0x01, 0x5c, 0xce, 0x4f, 0x00, 0x64, 0x4e, 0xdc, 0x9b, 0xdb, 0x09, 0x59, 0x3f, + 0x85, 0xef, 0x39, 0x61, 0xc9, 0x6d, 0xca, 0x0a, 0x3a, 0x23, 0xb7, 0x59, 0x70, 0x9b, 0xca, 0x21, + 0x6c, 0x17, 0xbd, 0xc6, 0xf1, 0xb2, 0xbd, 0xf9, 0x59, 0x21, 0xcc, 0x77, 0x96, 0xdb, 0xd8, 0x2b, + 0xcf, 0xb2, 0x46, 0x88, 0xec, 0xb5, 0x22, 0xb6, 0x25, 0x43, 0x3f, 0x2e, 0xc1, 0xcb, 0xbb, 0x6c, + 0xf0, 0x29, 0xe1, 0x0f, 0xfd, 0xd8, 0x3d, 0x3c, 0x57, 0xad, 0x85, 0xc3, 0x72, 0xbf, 0xf2, 0x3e, + 0x4b, 0x4f, 0x77, 0xe6, 0xf6, 0xf4, 0xe5, 0xaa, 0xa7, 0x82, 0x0f, 0xd9, 0xab, 0x45, 0x48, 0xd4, + 0x87, 0xf2, 0x09, 0x6c, 0x7e, 0x4e, 0x49, 0xe8, 0xa4, 0x4f, 0x80, 0x6c, 0x35, 0x9d, 0x5a, 0x61, + 0xdc, 0xcf, 0xdf, 0x07, 0xeb, 0x86, 0xec, 0x35, 0x6b, 0x42, 0xa0, 0x80, 0xa2, 0x27, 0xe9, 0xed, + 0xbf, 0x98, 0x8e, 0xd3, 0xe4, 0x59, 0x55, 0xb7, 0xfc, 0xdf, 0x55, 0xdd, 0xaf, 0x00, 0x5e, 0x9f, + 0x71, 0x4d, 0xfe, 0xef, 0x75, 0x87, 0x7e, 0x01, 0xb0, 0x95, 0x76, 0x13, 0x3a, 0x1c, 0x62, 0x8f, + 0x7f, 0x88, 0x31, 0x3b, 0x0f, 0x37, 0x1f, 0x8d, 0xe1, 0xd5, 0x93, 0xbb, 0x2a, 0x0e, 0xca, 0x81, + 0x2d, 0x4f, 0x84, 0xb1, 0xef, 0xec, 0x61, 0xcc, 0x54, 0xd0, 0x5b, 0x9c, 0xeb, 0x35, 0x3c, 0x09, + 0x47, 0xf6, 0x4a, 0x11, 0x48, 0x85, 0xd0, 0x73, 0x00, 0xd7, 0x4b, 0xed, 0x9d, 0xec, 0x5b, 0x8a, + 0x1c, 0x9c, 0x13, 0x5f, 0xbf, 0x05, 0xf0, 0xc6, 0xac, 0xcd, 0x15, 0xf6, 0x3e, 0x82, 0xeb, 0xa5, + 0x3f, 0xa4, 0x98, 0xff, 0x67, 0x93, 0x5f, 0x95, 0x26, 0x5f, 0xaf, 0x9a, 0x5c, 0x92, 0x20, 0xfb, + 0x72, 0x11, 0x2e, 0xa5, 0x6f, 0xfd, 0xb4, 0x04, 0x17, 0x77, 0xd9, 0x40, 0xf9, 0x06, 0xc0, 0x56, + 0xe5, 0xfb, 0xf0, 0x8e, 0xfe, 0x42, 0x1f, 0xb5, 0x7a, 0xed, 0x3d, 0xed, 0xdc, 0x3b, 0x2d, 0xb2, + 0x70, 0xe2, 0x3b, 0x00, 0xd7, 0x6a, 0xaf, 0xca, 0xdd, 0x17, 0xa7, 0xad, 0x62, 0x3b, 0xd6, 0xe9, + 0xb1, 0xc5, 0xa2, 0xbe, 0x02, 0xf0, 0xd2, 0x74, 0xad, 0xdf, 0x9e, 0x63, 0x9b, 0x25, 0xac, 0xf3, + 0xfe, 0xa9, 0x60, 0xc5, 0x2a, 0xbe, 0x07, 0xb0, 0x5d, 0xaf, 0x8f, 0xf7, 0xe6, 0x26, 0x2d, 0xc1, + 0x9d, 0xad, 0x33, 0x80, 0xf3, 0x75, 0x59, 0x9f, 0x3d, 0x3d, 0xea, 0x82, 0x67, 0x47, 0x5d, 0xf0, + 0xc7, 0x51, 0x17, 0x3c, 0x39, 0xee, 0x2e, 0x3c, 0x3b, 0xee, 0x2e, 0xfc, 0x76, 0xdc, 0x5d, 0x78, + 0x60, 0x4d, 0x75, 0x5a, 0x29, 0xb4, 0x39, 0x74, 0xfb, 0x2c, 0x1f, 0x18, 0x07, 0xe6, 0x6d, 0xe3, + 0xf1, 0xdf, 0xfe, 0x8f, 0x95, 0x76, 0xe2, 0x7e, 0x23, 0x7b, 0x9f, 0xde, 0xf9, 0x2b, 0x00, 0x00, + 0xff, 0xff, 0x93, 0x6f, 0x8b, 0x14, 0x92, 0x0d, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -609,6 +610,7 @@ type MsgClient interface { CreatePosition(ctx context.Context, in *MsgCreatePosition, opts ...grpc.CallOption) (*MsgCreatePositionResponse, error) WithdrawPosition(ctx context.Context, in *MsgWithdrawPosition, opts ...grpc.CallOption) (*MsgWithdrawPositionResponse, error) CollectFees(ctx context.Context, in *MsgCollectFees, opts ...grpc.CallOption) (*MsgCollectFeesResponse, error) + CollectIncentives(ctx context.Context, in *MsgCollectIncentives, opts ...grpc.CallOption) (*MsgCollectIncentivesResponse, error) } type msgClient struct { @@ -646,11 +648,21 @@ func (c *msgClient) CollectFees(ctx context.Context, in *MsgCollectFees, opts .. return out, nil } +func (c *msgClient) CollectIncentives(ctx context.Context, in *MsgCollectIncentives, opts ...grpc.CallOption) (*MsgCollectIncentivesResponse, error) { + out := new(MsgCollectIncentivesResponse) + err := c.cc.Invoke(ctx, "/osmosis.concentratedliquidity.v1beta1.Msg/CollectIncentives", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { CreatePosition(context.Context, *MsgCreatePosition) (*MsgCreatePositionResponse, error) WithdrawPosition(context.Context, *MsgWithdrawPosition) (*MsgWithdrawPositionResponse, error) CollectFees(context.Context, *MsgCollectFees) (*MsgCollectFeesResponse, error) + CollectIncentives(context.Context, *MsgCollectIncentives) (*MsgCollectIncentivesResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -666,6 +678,9 @@ func (*UnimplementedMsgServer) WithdrawPosition(ctx context.Context, req *MsgWit func (*UnimplementedMsgServer) CollectFees(ctx context.Context, req *MsgCollectFees) (*MsgCollectFeesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CollectFees not implemented") } +func (*UnimplementedMsgServer) CollectIncentives(ctx context.Context, req *MsgCollectIncentives) (*MsgCollectIncentivesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CollectIncentives not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -725,6 +740,24 @@ func _Msg_CollectFees_Handler(srv interface{}, ctx context.Context, dec func(int return interceptor(ctx, in, info, handler) } +func _Msg_CollectIncentives_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCollectIncentives) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).CollectIncentives(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.concentratedliquidity.v1beta1.Msg/CollectIncentives", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).CollectIncentives(ctx, req.(*MsgCollectIncentives)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "osmosis.concentratedliquidity.v1beta1.Msg", HandlerType: (*MsgServer)(nil), @@ -741,6 +774,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "CollectFees", Handler: _Msg_CollectFees_Handler, }, + { + MethodName: "CollectIncentives", + Handler: _Msg_CollectIncentives_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "osmosis/concentrated-liquidity/tx.proto", From 620602b8a5b0f1d44625836fa95241d1254d1f8b Mon Sep 17 00:00:00 2001 From: alpo Date: Sat, 4 Mar 2023 15:29:10 -0800 Subject: [PATCH 113/136] draft implementation --- x/concentrated-liquidity/incentives.go | 59 +++++++++++++++++++ x/concentrated-liquidity/types/errors.go | 39 ++++++++++++ .../types/expected_keepers.go | 1 + 3 files changed, 99 insertions(+) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 10ec67c0065..ea76273557d 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -498,3 +498,62 @@ func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA } return collectedIncentives, nil } + +// createIncentive creates an incentive record in state for the given pool +func (k Keeper) createIncentive(ctx sdk.Context, poolId uint64, sender sdk.AccAddress, incentiveDenom string, incentiveAmount sdk.Int, emissionRate sdk.Dec, startTime time.Time, minUptime time.Duration) (types.IncentiveRecord, error) { + pool, err := k.getPoolById(ctx, poolId) + if err != nil { + return types.IncentiveRecord{}, err + } + + // Ensure start time is >= current blocktime + if startTime.Before(ctx.BlockTime()) { + return types.IncentiveRecord{}, types.StartTimeTooEarly{PoolId: poolId, CurrentBlockTime: ctx.BlockTime(), StartTime: startTime} + } + + // Ensure emission rate is nonzero and nonnegative + if !emissionRate.IsPositive() { + return types.IncentiveRecord{}, types.NonPositiveEmissionRate{PoolId: poolId, EmissionRate: emissionRate} + } + + // Ensure min uptime is one of the supported periods + validUptime := false + for _, supportedUptime := range types.SupportedUptimes { + if minUptime == supportedUptime { + validUptime = true + } + } + if !validUptime { + return types.IncentiveRecord{}, types.InvalidMinUptime{PoolId: poolId, MinUptime: minUptime, SupportedUptimes: types.SupportedUptimes} + } + + // Ensure sender has balance for incentive denom + incentiveCoin := sdk.NewCoin(incentiveDenom, incentiveAmount) + senderHasBalance := k.bankKeeper.HasBalance(ctx, sender, incentiveCoin) + if !senderHasBalance { + return types.IncentiveRecord{}, types.IncentiveInsufficientBalance{PoolId: poolId, IncentiveDenom: incentiveDenom, IncentiveAmount: incentiveAmount} + } + + // Sync global uptime accumulators to current blocktime to ensure consistency in reward emissions + k.updateUptimeAccumulatorsToNow(ctx, poolId) + + // Set up incentive record to put in state + incentiveRecord := types.IncentiveRecord{ + PoolId: poolId, + IncentiveDenom: incentiveDenom, + RemainingAmount: incentiveAmount.ToDec(), + EmissionRate: emissionRate, + StartTime: startTime, + MinUptime: minUptime, + } + + // Set incentive record in state + k.setIncentiveRecord(ctx, incentiveRecord) + + // Transfer tokens from sender to pool balance + if err := k.bankKeeper.SendCoins(ctx, pool.GetAddress(), sender, sdk.NewCoins(incentiveCoin)); err != nil { + return types.IncentiveRecord{}, err + } + + return incentiveRecord, nil +} diff --git a/x/concentrated-liquidity/types/errors.go b/x/concentrated-liquidity/types/errors.go index f75d8ccb94e..15e9976c30c 100644 --- a/x/concentrated-liquidity/types/errors.go +++ b/x/concentrated-liquidity/types/errors.go @@ -243,6 +243,45 @@ func (e IncentiveRecordNotFoundError) Error() string { return fmt.Sprintf("incentive record not found. pool id (%d), incentive denom (%s), minimum uptime (%s)", e.PoolId, e.IncentiveDenom, e.MinUptime.String()) } +type StartTimeTooEarly struct { + PoolId uint64 + CurrentBlockTime time.Time + StartTime time.Time +} + +func (e StartTimeTooEarly) Error() string { + return fmt.Sprintf("start time cannot be before current blocktime. Pool id (%d), current blocktime (%s), start time (%s)", e.PoolId, e.CurrentBlockTime.String(), e.StartTime.String()) +} + +type IncentiveInsufficientBalance struct { + PoolId uint64 + IncentiveDenom string + IncentiveAmount sdk.Int +} + +func (e IncentiveInsufficientBalance) Error() string { + return fmt.Sprintf("sender has insufficient balance to create this incentive record. Pool id (%d), incentive denom (%s), incentive amount needed (%s)", e.PoolId, e.IncentiveDenom, e.IncentiveAmount) +} + +type NonPositiveEmissionRate struct { + PoolId uint64 + EmissionRate sdk.Dec +} + +func (e NonPositiveEmissionRate) Error() string { + return fmt.Sprintf("emission rate must be position (nonzero and nonnegative). Pool id (%d), emission rate (%s)", e.PoolId, e.EmissionRate) +} + +type InvalidMinUptime struct { + PoolId uint64 + MinUptime time.Duration + SupportedUptimes []time.Duration +} + +func (e InvalidMinUptime) Error() string { + return fmt.Sprintf("attempted to create an incentive record with an unsupported minimum uptime. Pool id (%d), specified min uptime (%s), supported uptimes (%s)", e.PoolId, e.MinUptime, e.SupportedUptimes) +} + type QueryRangeUnsupportedError struct { RequestedRange sdk.Int MaxRange sdk.Int diff --git a/x/concentrated-liquidity/types/expected_keepers.go b/x/concentrated-liquidity/types/expected_keepers.go index 664907622be..46cc5e095f6 100644 --- a/x/concentrated-liquidity/types/expected_keepers.go +++ b/x/concentrated-liquidity/types/expected_keepers.go @@ -12,6 +12,7 @@ import ( type BankKeeper interface { GetDenomMetaData(ctx sdk.Context, denom string) (banktypes.Metadata, bool) SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error + HasBalance(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coin) bool } // PoolManagerKeeper defines the interface needed to be fulfilled for From 6e1c3651ad5ba752bf307cfddc10aecc572de3cc Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 6 Mar 2023 07:07:51 -0800 Subject: [PATCH 114/136] begin testing --- x/concentrated-liquidity/export_test.go | 4 + x/concentrated-liquidity/incentives.go | 3 +- x/concentrated-liquidity/incentives_test.go | 90 ++++++++++++++++++++- 3 files changed, 95 insertions(+), 2 deletions(-) diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index 4cbf1b03d07..e90060dd432 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -235,3 +235,7 @@ func (k Keeper) CollectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA func GetUptimeTrackerValues(uptimeTrackers []model.UptimeTracker) []sdk.DecCoins { return getUptimeTrackerValues(uptimeTrackers) } + +func (k Keeper) CreateIncentive(ctx sdk.Context, poolId uint64, sender sdk.AccAddress, incentiveDenom string, incentiveAmount sdk.Int, emissionRate sdk.Dec, startTime time.Time, minUptime time.Duration) (types.IncentiveRecord, error) { + return k.createIncentive(ctx, poolId, sender, incentiveDenom, incentiveAmount, emissionRate, startTime, minUptime) +} diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index ea76273557d..5f550c9ad5e 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -500,6 +500,7 @@ func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA } // createIncentive creates an incentive record in state for the given pool +// TODO: ensure that record doesn't already exist func (k Keeper) createIncentive(ctx sdk.Context, poolId uint64, sender sdk.AccAddress, incentiveDenom string, incentiveAmount sdk.Int, emissionRate sdk.Dec, startTime time.Time, minUptime time.Duration) (types.IncentiveRecord, error) { pool, err := k.getPoolById(ctx, poolId) if err != nil { @@ -551,7 +552,7 @@ func (k Keeper) createIncentive(ctx sdk.Context, poolId uint64, sender sdk.AccAd k.setIncentiveRecord(ctx, incentiveRecord) // Transfer tokens from sender to pool balance - if err := k.bankKeeper.SendCoins(ctx, pool.GetAddress(), sender, sdk.NewCoins(incentiveCoin)); err != nil { + if err := k.bankKeeper.SendCoins(ctx, sender, pool.GetAddress(), sdk.NewCoins(incentiveCoin)); err != nil { return types.IncentiveRecord{}, err } diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 37f4ec83b61..34490d2fc8b 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -37,7 +37,7 @@ var ( testEmissionThree = sdk.MustNewDecFromStr("165.4") testEmissionFour = sdk.MustNewDecFromStr("57.93") - defaultBlockTime = time.Unix(0, 0).UTC() + defaultBlockTime = time.Unix(1, 1).UTC() defaultTimeBuffer = time.Hour defaultStartTime = defaultBlockTime.Add(defaultTimeBuffer) @@ -2747,3 +2747,91 @@ func (s *KeeperTestSuite) TestCollectIncentives() { }) } } + +func (s *KeeperTestSuite) TestCreateIncentive() { + type testCreateIncentive struct { + poolId uint64 + sender sdk.AccAddress + senderBalance sdk.Coins + recordToSet types.IncentiveRecord + + expectedError error + } + tests := map[string]testCreateIncentive{ + "valid incentive record": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: incentiveRecordOne, + }, + + // Error catching + + // pool doesn't exist + + "start time too early": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: withStartTime(incentiveRecordOne, defaultBlockTime.Add(-1*time.Second)), + + expectedError: types.StartTimeTooEarly{PoolId: 1, CurrentBlockTime: defaultBlockTime, StartTime: incentiveRecordOne.StartTime}, + }, + + // nonpositive emission rate + + // invalid min uptime + + // insufficient balance + } + + for name, tc := range tests { + tc := tc + s.Run(name, func() { + s.SetupTest() + + // We fix blocktime to ensure tests are deterministic + s.Ctx = s.Ctx.WithBlockTime(defaultBlockTime) + + s.PrepareConcentratedPool() + clKeeper := s.App.ConcentratedLiquidityKeeper + s.FundAcc(tc.sender, tc.senderBalance) + + // TODO: add existing records to ensure records aren't wiped + + // system under test + + incentiveRecord, err := clKeeper.CreateIncentive(s.Ctx, tc.poolId, tc.sender, tc.recordToSet.IncentiveDenom, tc.recordToSet.RemainingAmount.RoundInt(), tc.recordToSet.EmissionRate, tc.recordToSet.StartTime, tc.recordToSet.MinUptime) + + // Assertions + + if tc.expectedError != nil { + s.Require().Error(err) + + // Ensure nothing was placed in state + recordInState, err := clKeeper.GetIncentiveRecord(s.Ctx, tc.poolId, tc.recordToSet.IncentiveDenom, tc.recordToSet.MinUptime) + s.Require().Error(err) + s.Require().Equal(types.IncentiveRecord{}, recordInState) + + return + } + + s.Require().NoError(err) + + // Returned incentive record should equal both to what's in state and what we expect + recordInState, err := clKeeper.GetIncentiveRecord(s.Ctx, tc.poolId, tc.recordToSet.IncentiveDenom, tc.recordToSet.MinUptime) + s.Require().Equal(tc.recordToSet, recordInState) + s.Require().Equal(tc.recordToSet, incentiveRecord) + }) + } +} \ No newline at end of file From a39c147ea421d314f330dbed5669d1a9ce4c737b Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 6 Mar 2023 08:03:31 -0800 Subject: [PATCH 115/136] add codec, cli, and simulation --- x/concentrated-liquidity/client/cli/tx.go | 11 ++++++ x/concentrated-liquidity/clmodule/module.go | 1 + .../simulation/sim_msgs.go | 34 +++++++++++++++++++ x/concentrated-liquidity/types/codec.go | 2 ++ 4 files changed, 48 insertions(+) diff --git a/x/concentrated-liquidity/client/cli/tx.go b/x/concentrated-liquidity/client/cli/tx.go index def81d2f6f2..6b677673bf7 100644 --- a/x/concentrated-liquidity/client/cli/tx.go +++ b/x/concentrated-liquidity/client/cli/tx.go @@ -16,6 +16,7 @@ func NewTxCmd() *cobra.Command { osmocli.AddTxCmd(txCmd, NewWithdrawPositionCmd) osmocli.AddTxCmd(txCmd, NewCreateConcentratedPoolCmd) osmocli.AddTxCmd(txCmd, NewCollectFeesCmd) + osmocli.AddTxCmd(txCmd, NewCollectIncentivesCmd) return txCmd } @@ -60,3 +61,13 @@ func NewCollectFeesCmd() (*osmocli.TxCliDesc, *types.MsgCollectFees) { Flags: osmocli.FlagDesc{RequiredFlags: []*flag.FlagSet{FlagSetJustPoolId()}}, }, &types.MsgCollectFees{} } + +func NewCollectIncentivesCmd() (*osmocli.TxCliDesc, *types.MsgCollectIncentives) { + return &osmocli.TxCliDesc{ + Use: "collect-incentives [lower-tick] [upper-tick]", + Short: "collect incentives from a liquidity position", + Example: "collect-incentives [-69082] 69082 --pool-id 1 --from val --chain-id osmosis-1", + CustomFlagOverrides: poolIdFlagOverride, + Flags: osmocli.FlagDesc{RequiredFlags: []*flag.FlagSet{FlagSetJustPoolId()}}, + }, &types.MsgCollectIncentives{} +} diff --git a/x/concentrated-liquidity/clmodule/module.go b/x/concentrated-liquidity/clmodule/module.go index 6a2595843b5..db639e3db2f 100644 --- a/x/concentrated-liquidity/clmodule/module.go +++ b/x/concentrated-liquidity/clmodule/module.go @@ -159,5 +159,6 @@ func (am AppModule) Actions() []simtypes.Action { //simtypes.NewMsgBasedAction("CLSwapExactAmountOut", am.keeper, simulation.RandomSwapExactAmountOut), simtypes.NewMsgBasedAction("WithdrawPosition", am.keeper, simulation.RandMsgWithdrawPosition), simtypes.NewMsgBasedAction("CollectFees", am.keeper, simulation.RandMsgCollectFees), + simtypes.NewMsgBasedAction("CollectIncentives", am.keeper, simulation.RandMsgCollectIncentives), } } diff --git a/x/concentrated-liquidity/simulation/sim_msgs.go b/x/concentrated-liquidity/simulation/sim_msgs.go index d02ac76a0f0..d6de140b430 100644 --- a/x/concentrated-liquidity/simulation/sim_msgs.go +++ b/x/concentrated-liquidity/simulation/sim_msgs.go @@ -185,6 +185,40 @@ func RandMsgCollectFees(k clkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Con }, nil } +func RandMsgCollectIncentives(k clkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*cltypes.MsgCollectIncentives, error) { + rand := sim.GetRand() + // get random pool + _, poolDenoms, err := getRandCLPool(k, sim, ctx) + if err != nil { + return nil, err + } + + // get random user address with the pool denoms + sender, _, senderExists := sim.SelAddrWithDenoms(ctx, poolDenoms) + if !senderExists { + return nil, fmt.Errorf("no sender with denoms %s exists", poolDenoms) + } + + positions, err := k.GetUserPositions(ctx, sender.Address) + if err != nil { + return nil, fmt.Errorf("position does not exist") + } + + if len(positions) == 0 { + return nil, fmt.Errorf("user does not have any position") + } + + // pick a random position + randPosition := positions[rand.Intn(len(positions))] + + return &cltypes.MsgCollectIncentives{ + PoolId: randPosition.PoolId, + Sender: sender.Address.String(), + LowerTick: randPosition.LowerTick, + UpperTick: randPosition.UpperTick, + }, nil +} + // createPoolRestriction creates specific restriction for the creation of a pool. func createPoolRestriction(k clkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) osmosimtypes.SimAccountConstraint { return func(acc legacysimulationtype.Account) bool { diff --git a/x/concentrated-liquidity/types/codec.go b/x/concentrated-liquidity/types/codec.go index dcefd28f583..1995c427ca2 100644 --- a/x/concentrated-liquidity/types/codec.go +++ b/x/concentrated-liquidity/types/codec.go @@ -13,6 +13,7 @@ func RegisterCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&MsgCreatePosition{}, "osmosis/cl-create-position", nil) cdc.RegisterConcrete(&MsgWithdrawPosition{}, "osmosis/cl-withdraw-position", nil) cdc.RegisterConcrete(&MsgCollectFees{}, "osmosis/cl-collect-fees", nil) + cdc.RegisterConcrete(&MsgCollectIncentives{}, "osmosis/cl-collect-incentives", nil) } func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { @@ -26,6 +27,7 @@ func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { &MsgCreatePosition{}, &MsgWithdrawPosition{}, &MsgCollectFees{}, + &MsgCollectIncentives{}, ) msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) From 034d2724095ee60e900271c7a44c1096506b1f7c Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 6 Mar 2023 08:07:18 -0800 Subject: [PATCH 116/136] claim incentives upon position deletion to clear records --- x/concentrated-liquidity/lp.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/x/concentrated-liquidity/lp.go b/x/concentrated-liquidity/lp.go index 6b9a3ac038d..91a43d925ab 100644 --- a/x/concentrated-liquidity/lp.go +++ b/x/concentrated-liquidity/lp.go @@ -159,13 +159,16 @@ func (k Keeper) withdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAd } // If the requested liquidity amount to withdraw is equal to the available liquidity, delete the position from state. - // Ensure we collect any outstanding fees prior to deleting the position from state + // Ensure we collect any outstanding fees and incentives prior to deleting the position from state. This claiming + // process also clears position records from fee and incentive accumulators. if requestedLiquidityAmountToWithdraw.Equal(availableLiquidity) { if _, err := k.collectFees(ctx, poolId, owner, lowerTick, upperTick); err != nil { return sdk.Int{}, sdk.Int{}, err } - // TODO: claim incentives (when implemented) to clear accum record from state + if _, err := k.collectIncentives(ctx, poolId, owner, lowerTick, upperTick); err != nil { + return sdk.Int{}, sdk.Int{}, err + } if err := k.deletePosition(ctx, poolId, owner, lowerTick, upperTick, joinTime, freezeDuration); err != nil { return sdk.Int{}, sdk.Int{}, err From cf428d7126a1069d23d2a725ae8ac82584be02e9 Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 6 Mar 2023 08:39:56 -0800 Subject: [PATCH 117/136] comment cleanup --- x/concentrated-liquidity/incentives.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 10ec67c0065..5b0a02698d3 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -416,7 +416,9 @@ func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, posit return nil } -// collectIncentives collects incentives for all uptime accumulators for all positions belonging to `owner` in the given range. +// collectIncentives collects incentives for all uptime accumulators for all positions belonging to `owner` that have exactly +// the same lower and upper ticks. +// // Upon successful collection, it bank sends the incentives from the pool address to the owner and returns the collected coins. // Returns error if: // - pool with the given id does not exist From 43573c380004247c80b551a9bc2edca8e47baeb3 Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 6 Mar 2023 08:50:08 -0800 Subject: [PATCH 118/136] add more test cases --- x/concentrated-liquidity/incentives_test.go | 72 +++++++++++++++++++-- 1 file changed, 66 insertions(+), 6 deletions(-) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 34490d2fc8b..6d7dd9b0c94 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -229,8 +229,14 @@ func withStartTime(record types.IncentiveRecord, startTime time.Time) types.Ince return record } -func withMinUpTimeTime(record types.IncentiveRecord, minUpTime time.Duration) types.IncentiveRecord { - record.MinUptime = minUpTime +func withMinUptime(record types.IncentiveRecord, minUptime time.Duration) types.IncentiveRecord { + record.MinUptime = minUptime + + return record +} + +func withEmissionRate(record types.IncentiveRecord, emissionRate sdk.Dec) types.IncentiveRecord { + record.EmissionRate = emissionRate return record } @@ -460,7 +466,7 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulatorValues() { func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { incentiveRecordOneWithDifferentStartTime := withStartTime(incentiveRecordOne, incentiveRecordOne.StartTime.Add(10)) - incentiveRecordOneWithDifferentMinUpTime := withMinUpTimeTime(incentiveRecordOne, testUptimeTwo) + incentiveRecordOneWithDifferentMinUpTime := withMinUptime(incentiveRecordOne, testUptimeTwo) incentiveRecordOneWithDifferentDenom := withDenom(incentiveRecordOne, testDenomTwo) type calcAccruedIncentivesTest struct { @@ -2751,6 +2757,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { func (s *KeeperTestSuite) TestCreateIncentive() { type testCreateIncentive struct { poolId uint64 + isInvalidPoolId bool sender sdk.AccAddress senderBalance sdk.Coins recordToSet types.IncentiveRecord @@ -2772,8 +2779,22 @@ func (s *KeeperTestSuite) TestCreateIncentive() { // Error catching - // pool doesn't exist + + "pool doesn't exist": { + isInvalidPoolId: true, + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: incentiveRecordOne, + + expectedError: types.PoolNotFoundError{PoolId: 2}, + }, "start time too early": { poolId: defaultPoolId, sender: s.TestAccs[0], @@ -2787,10 +2808,45 @@ func (s *KeeperTestSuite) TestCreateIncentive() { expectedError: types.StartTimeTooEarly{PoolId: 1, CurrentBlockTime: defaultBlockTime, StartTime: incentiveRecordOne.StartTime}, }, + "zero emission rate": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: withEmissionRate(incentiveRecordOne, sdk.ZeroDec()), - // nonpositive emission rate + expectedError: types.NonPositiveEmissionRate{PoolId: 1, EmissionRate: sdk.ZeroDec()}, + }, + "negative emission rate": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: withEmissionRate(incentiveRecordOne, sdk.NewDec(-1)), + + expectedError: types.NonPositiveEmissionRate{PoolId: 1, EmissionRate: sdk.NewDec(-1)}, + }, + "unsupported min uptime": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: withMinUptime(incentiveRecordOne, time.Hour * 3), - // invalid min uptime + expectedError: types.InvalidMinUptime{PoolId: 1, MinUptime: time.Hour * 3, SupportedUptimes: types.SupportedUptimes}, + }, // insufficient balance } @@ -2809,6 +2865,10 @@ func (s *KeeperTestSuite) TestCreateIncentive() { // TODO: add existing records to ensure records aren't wiped + if tc.isInvalidPoolId { + tc.poolId = tc.poolId + 1 + } + // system under test incentiveRecord, err := clKeeper.CreateIncentive(s.Ctx, tc.poolId, tc.sender, tc.recordToSet.IncentiveDenom, tc.recordToSet.RemainingAmount.RoundInt(), tc.recordToSet.EmissionRate, tc.recordToSet.StartTime, tc.recordToSet.MinUptime) From 4b1244630c9fb7187902ccfeb24c252558ae9a60 Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 6 Mar 2023 08:51:55 -0800 Subject: [PATCH 119/136] lint --- x/concentrated-liquidity/incentives.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 5b0a02698d3..281d123893c 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -416,9 +416,9 @@ func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, posit return nil } -// collectIncentives collects incentives for all uptime accumulators for all positions belonging to `owner` that have exactly +// collectIncentives collects incentives for all uptime accumulators for all positions belonging to `owner` that have exactly // the same lower and upper ticks. -// +// // Upon successful collection, it bank sends the incentives from the pool address to the owner and returns the collected coins. // Returns error if: // - pool with the given id does not exist From fe7a39ff685376ca6144234ed901264eb1e15d1f Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 6 Mar 2023 08:59:34 -0800 Subject: [PATCH 120/136] add error catching test cases --- x/concentrated-liquidity/incentives.go | 1 - x/concentrated-liquidity/incentives_test.go | 12 +++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 5f550c9ad5e..dcc56ccfedc 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -500,7 +500,6 @@ func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA } // createIncentive creates an incentive record in state for the given pool -// TODO: ensure that record doesn't already exist func (k Keeper) createIncentive(ctx sdk.Context, poolId uint64, sender sdk.AccAddress, incentiveDenom string, incentiveAmount sdk.Int, emissionRate sdk.Dec, startTime time.Time, minUptime time.Duration) (types.IncentiveRecord, error) { pool, err := k.getPoolById(ctx, poolId) if err != nil { diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 6d7dd9b0c94..f26f8379c85 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -2779,7 +2779,6 @@ func (s *KeeperTestSuite) TestCreateIncentive() { // Error catching - "pool doesn't exist": { isInvalidPoolId: true, @@ -2806,7 +2805,7 @@ func (s *KeeperTestSuite) TestCreateIncentive() { ), recordToSet: withStartTime(incentiveRecordOne, defaultBlockTime.Add(-1*time.Second)), - expectedError: types.StartTimeTooEarly{PoolId: 1, CurrentBlockTime: defaultBlockTime, StartTime: incentiveRecordOne.StartTime}, + expectedError: types.StartTimeTooEarly{PoolId: 1, CurrentBlockTime: defaultBlockTime, StartTime: defaultBlockTime.Add(-1*time.Second)}, }, "zero emission rate": { poolId: defaultPoolId, @@ -2847,8 +2846,14 @@ func (s *KeeperTestSuite) TestCreateIncentive() { expectedError: types.InvalidMinUptime{PoolId: 1, MinUptime: time.Hour * 3, SupportedUptimes: types.SupportedUptimes}, }, + "insufficient sender balance": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins(), + recordToSet: incentiveRecordOne, - // insufficient balance + expectedError: types.IncentiveInsufficientBalance{PoolId: 1, IncentiveDenom: incentiveRecordOne.IncentiveDenom, IncentiveAmount: incentiveRecordOne.RemainingAmount.Ceil().RoundInt()}, + }, } for name, tc := range tests { @@ -2877,6 +2882,7 @@ func (s *KeeperTestSuite) TestCreateIncentive() { if tc.expectedError != nil { s.Require().Error(err) + s.Require().ErrorContains(err, tc.expectedError.Error()) // Ensure nothing was placed in state recordInState, err := clKeeper.GetIncentiveRecord(s.Ctx, tc.poolId, tc.recordToSet.IncentiveDenom, tc.recordToSet.MinUptime) From efe72bc0a53d8292b64c5d0f5f5e8a42c937fc0d Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 6 Mar 2023 09:31:03 -0800 Subject: [PATCH 121/136] implement createIncentive message --- go.mod | 2 +- go.work.sum | 2205 +++++++++++++++-- proto/osmosis/concentrated-liquidity/tx.proto | 53 + x/concentrated-liquidity/msg_server.go | 40 + x/concentrated-liquidity/types/events.go | 6 + x/concentrated-liquidity/types/tx.pb.go | 948 ++++++- 6 files changed, 3024 insertions(+), 230 deletions(-) diff --git a/go.mod b/go.mod index f6553ae6b51..9387ac35dec 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/CosmWasm/wasmd v0.30.0 github.com/cosmos/cosmos-proto v1.0.0-alpha8 - github.com/cosmos/cosmos-sdk v0.46.10 + github.com/cosmos/cosmos-sdk v0.46.11 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/ibc-go/v4 v4.3.0 github.com/gogo/protobuf v1.3.3 diff --git a/go.work.sum b/go.work.sum index 07c26987cdf..7b55d06630e 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,172 +1,2037 @@ +4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= +bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= +cloud.google.com/go v0.25.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.2/go.mod h1:H8IAquKe2L30IxoupDgqTaQvKSwF/c8prYHynGIWQbA= +cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +code.gitea.io/sdk/gitea v0.12.0/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= +contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= +contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= +contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= +contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= +filippo.io/edwards25519 v1.0.0-beta.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= +github.com/99designs/keyring v1.1.6/go.mod h1:16e0ds7LGQQcT59QqkTg72Hh5ShM51Byv5PEmW6uoRU= +github.com/Abirdcfly/dupword v0.0.7/go.mod h1:K/4M1kj+Zh39d2aotRwypvasonOyAMH1c/IZJzE0dmk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= +github.com/AkihiroSuda/containerd-fuse-overlayfs v1.0.0/go.mod h1:0mMDvQFeLbbn1Wy8P2j3hwFhqBq+FKn8OZPno8WLmp8= +github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v19.1.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v42.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= +github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v10.15.5+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.1.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.10.2/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= +github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= +github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= +github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15-0.20200908182639-5b44b70ab3ab/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.10/go.mod h1:g5uw8EV2mAlzqe94tfNBNdr89fnbD/n3HV0OhsddkmM= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= +github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim v0.9.4/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim/test v0.0.0-20200826032352-301c83a30e7c/go.mod h1:30A5igQ91GEmhYJF8TaRP79pMBOYynRsyOByfVV0dU4= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= +github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/apex/log v1.1.4/go.mod h1:AlpoD9aScyQfJDVHmLMEcx4oU6LqzkWp4Mg9GdAcEvQ= +github.com/apex/log v1.3.0/go.mod h1:jd8Vpsr46WAe3EZSQ/IUMs2qQD/GOycT5rPWCO1yGcs= +github.com/apex/logs v0.0.4/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= +github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= +github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= +github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.11/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.90/go.mod h1:es1KtYUFs7le0xQ3rOihkuoVD90z7D0fR2Qm4S00/gU= +github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.31.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= +github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bombsimon/wsl/v2 v2.0.0/go.mod h1:mf25kr/SqFEPhhcxW1+7pxzGlW+hIl/hYTKY95VwV8U= +github.com/bombsimon/wsl/v2 v2.2.0/go.mod h1:Azh8c3XGEJl9LyX0/sFC+CKMc7Ssgua0g+6abzXN4Pg= +github.com/bombsimon/wsl/v3 v3.0.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= +github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= +github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= +github.com/bufbuild/buf v1.9.0/go.mod h1:1Q+rMHiMVcfgScEF/GOldxmu4o9TrQ2sQQh58K6MscE= +github.com/bufbuild/connect-go v1.0.0/go.mod h1:9iNvh/NOsfhNBUH5CtvXeVUskQO1xsrEviH7ZArwZ3I= +github.com/bufbuild/protocompile v0.1.0/go.mod h1:ix/MMMdsT3fzxfw91dvbfzKW3fRRnuPCP47kpAm5m/4= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= +github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= +github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= +github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= +github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/chavacava/garif v0.0.0-20220630083739-93517212f375/go.mod h1:4m1Rv7xfuwWPNKXlThldNuJvutYM6J95wNuuVmn55To= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1-0.20201117152358-0edc412565dc/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= +github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= +github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= +github.com/containerd/containerd v1.6.3-0.20220401172941-5ff8fce1fcc6/go.mod h1:WSt2SnDLAGWlu+Vl+EWay37seZLKqgRt6XLjIMy8SYM= +github.com/containerd/containerd v1.6.8/go.mod h1:By6p5KqPK0/7/CgO/A6t/Gz+CUYUu2zf1hUaaymVXB0= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= +github.com/containerd/continuity v0.2.3-0.20220330195504-d132b287edc8/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fuse-overlayfs-snapshotter v1.0.2/go.mod h1:nRZceC8a7dRm3Ao6cJAwuJWPFiBPaibHiFntRUnzhwU= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.4/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= +github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/stargz-snapshotter v0.0.0-20201027054423-3a04e4c2c116/go.mod h1:o59b3PCKVAf9jjiKtCc/9hLAd+5p/rfhBfm6aBcTEr4= +github.com/containerd/stargz-snapshotter v0.11.3/go.mod h1:2j2EAUyvrLU4D9unYlTIwGhDKQIk74KJ9E71lJsQCVM= +github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= +github.com/containerd/stargz-snapshotter/estargz v0.11.3/go.mod h1:7vRJIcImfY8bpifnMjt+HTJoQxASq7T28MYbP15/Nf0= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= +github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= +github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/ledger-cosmos-go v0.11.1/go.mod h1:J8//BsAGTo3OC/vDLjMRFLW6q0WAaXvHnVc7ZmE8iUY= +github.com/cosmos/ledger-go v0.9.2/go.mod h1:oZJ2hHAZROdlHiwTg4t7kP+GKIIkBT+o6c9QWFanOyI= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cristalhq/acmd v0.8.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/daixiang0/gci v0.8.1/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c= +github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= +github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/cli v0.0.0-20190925022749-754388324470/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.0-beta1.0.20201029214301-1d20b15adc38+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.13+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.14+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.6.0-rc.1.0.20180327202408-83389a148052+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v0.0.0-20200511152416-a93e9eb0e95c/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20180531152204-71cd53e4a197/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v17.12.0-ce-rc1.0.20200730172259-9f28837c1d93+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.0-beta1.0.20201110211921-af34b94a78a1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.3-0.20211208011758-87521affb077+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libnetwork v0.8.0-dev.2.0.20200917202933-d0951081b35f/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-critic/go-critic v0.4.1/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= +github.com/go-critic/go-critic v0.4.3/go.mod h1:j4O3D4RoIwRqlZw5jJpx0BNfXWWbpcJoKu5cYSe4YmQ= +github.com/go-critic/go-critic v0.6.5/go.mod h1:ezfP/Lh7MA6dBNn4c6ab5ALv3sKnZVLx37tr00uuaOY= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= +github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astcopy v1.0.2/go.mod h1:4TcEdbElGc9twQEYpVo/aieIXfHhiuLh4aLAck6dO7Y= +github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/flock v0.7.3/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v4.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.3.2/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.23.7/go.mod h1:g/38bxfhp4rI7zeWSxcdIeHTQGS58TCak8FYcyCmavQ= +github.com/golangci/golangci-lint v1.27.0/go.mod h1:+eZALfxIuthdrHPtfM7w/R3POJLjHDfJJw8XZl9xOng= +github.com/golangci/golangci-lint v1.50.1/go.mod h1:AQjHBopYS//oB8xs0y0M/dtxdKHkdhl0RvmjUct0/4w= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= +github.com/google/crfs v0.0.0-20191108021818-71d77da419c9/go.mod h1:etGhoOqfwPkooV6aqoX3eBGQOJblqdoc9XvWOeuxpPw= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-containerregistry v0.0.0-20191010200024-a3d713f9b7f8/go.mod h1:KyKXa9ciM8+lgMXwOVsXi7UxGrsf9mM61Mzs+xKUrKE= +github.com/google/go-containerregistry v0.1.2/go.mod h1:GPivBPgdAyd2SU+vf6EpsgOtWDuPqjW0hJZt4rNdTZ4= +github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= +github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= +github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= +github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/gookit/color v1.2.4/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= +github.com/gookit/color v1.5.1/go.mod h1:wZFzea4X8qN6vHOSP2apMb4/+w/orMznEzYsIHPaqKM= +github.com/gookit/color v1.5.2/go.mod h1:w8h4bGiHeeBpvQVePTutdbERIUf3oJE5lZ8HM0UgXyg= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= +github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= +github.com/goreleaser/goreleaser v0.136.0/go.mod h1:wiKrPUeSNh6Wu8nUHxZydSOVQ/OZvOaO7DTtFqie904= +github.com/goreleaser/nfpm v1.2.1/go.mod h1:TtWrABZozuLOttX2uDlYyECfQX7x5XYkVxhjYcR6G9w= +github.com/goreleaser/nfpm v1.3.0/go.mod h1:w0p7Kc9TAUgWMyrub63ex3M2Mgw88M4GZXoTq5UCb40= +github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= +github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.0.3/go.mod h1:0EQM6aH2ctVpvZ6a+onrQ/vaykxh2GH7hy3e13vzTUY= +github.com/hanwen/go-fuse/v2 v2.1.1-0.20220112183258-f57e95bda82d/go.mod h1:B1nGE/6RBFyBRC1RRnf23UpwCdyJ31eukw34oAKukAc= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= +github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c/go.mod h1:fHzc09UnyJyqyW+bFuq864eh+wC7dj65aXmXLRe5to0= +github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87/go.mod h1:XGsKKeXxeRr95aEOgipvluMPlgjr7dGlk9ZTWOjcUcg= +github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= +github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= +github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/informalsystems/tm-load-test v1.0.0/go.mod h1:WVaSKaQdfZK3v0C74EMzn7//+3aeCZF8wkIKBz2/M74= +github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= +github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= +github.com/jaguilar/vt100 v0.0.0-20150826170717-2703a27b14ea/go.mod h1:QMdK4dGB3YhEW2BmA1wgGpPYI3HZy/5gD705PXKUVSg= +github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= +github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= +github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= +github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= +github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= +github.com/kisielk/errcheck v1.6.2/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= +github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= +github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= +github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= +github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= +github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= +github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/mgechev/revive v1.2.4/go.mod h1:iAWlQishqCuj4yhV24FTnKSXGpbAA+0SckXB8GQMX/Q= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= +github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/buildkit v0.8.1/go.mod h1:/kyU1hKy/aYCuP39GZA9MaKioovHku57N6cqlKZIaiQ= +github.com/moby/buildkit v0.10.4/go.mod h1:Yajz9vt1Zw5q9Pp4pdb3TCSUXJBIroIQGQ3TTs/sLug= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mount v0.1.0/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= +github.com/moby/sys/mount v0.1.1/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= +github.com/moby/sys/mount v0.3.0/go.mod h1:U2Z3ur2rXPFrFmy4q6WMwWrBOAQGYtYTRVM8BIvzbwk= +github.com/moby/sys/mountinfo v0.1.0/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.6.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20200915141129-7f0af18e79f2/go.mod h1:TjQg8pa4iejrUrjiz0MCtMV38jdMNW4doKSiBrEvCQQ= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= +github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= +github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= +github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= +github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= +github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= +github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= +github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/networkplumbing/go-nft v0.2.0/go.mod h1:HnnM+tYvlGAsMU7yoYwXEVLLiDW9gdMmb5HoGcwpuQs= +github.com/nishanths/exhaustive v0.8.3/go.mod h1:qj+zJJUgJ76tR92+25+03oYUhzF4R7/2Wk7fGTfCHmg= +github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= +github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= +github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= +github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= +github.com/onsi/ginkgo/v2 v2.8.0/go.mod h1:6JsQiECmxCa3V5st74AL/AmsV482EDdVrGaVW6z3oYU= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.20.0/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= +github.com/onsi/gomega v1.25.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230303084731-71ab5decdfa1/go.mod h1:fHfEDIHu347XE+64DISa7LJ5OOWpubz+6H28huZ90fo= -github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230201094300-e8bba2b45fd8/go.mod h1:Kh2V4fLvLM4/EagRX53CYDJnILAz9NzCCETKXoH/sno= -github.com/osmosis-labs/wasmd v0.30.0-osmo-v15/go.mod h1:5fDYJyMXBq6u2iuHqqOTYiZ5NitIOeIW5k7qEXqbwJE= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc10/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runc v1.1.1/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= +github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= +github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/polyfloyd/go-errorlint v1.1.0/go.mod h1:Uss7Bc/izYG0leCMRx3WVlrpqWedSZk7V/FUQW6VJ6U= -github.com/quasilyte/go-ruleguard v0.3.19/go.mod h1:lHSn69Scl48I7Gt9cX3VrbsZYvYiBYszZOZW4A+oTEw= -github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= -github.com/ryanrolds/sqlclosecheck v0.4.0/go.mod h1:TBRRjzL31JONc9i4XMinicuo+s+E8yKZ5FN8X3G6CKQ= -github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= -github.com/sashamelentyev/usestdlibvars v1.23.0/go.mod h1:YPwr/Y1LATzHI93CqoPUN/2BzGQ/6N/cl/KwgR0B/aU= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/securego/gosec/v2 v2.15.0/go.mod h1:VOjTrZOkUtSDt2QLSJmQBMWnvwiQPEjg0l+5juIqGk8= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sivchari/containedctx v1.0.2/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= -github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY= -github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= -github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= -github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= -github.com/strangelove-ventures/async-icq/v4 v4.0.0-rc0 h1:foE/5O2/XiqGsdTKx3R0BTfKgW9KnUYyQLZt0WFSesE= -github.com/strangelove-ventures/async-icq/v4 v4.0.0-rc0/go.mod h1:thzXHoaK1MgPDCjN7Rp9A/VcHA4cmjQpKCtVNt2O2xk= -github.com/strangelove-ventures/packet-forward-middleware/v4 v4.0.4 h1:8Tn4Gy/DAq7wzV1CxEGv80ujZ+nUvzgwwdCobO/Gj8Y= -github.com/strangelove-ventures/packet-forward-middleware/v4 v4.0.4/go.mod h1:AG8F5pdk3x1h7PlRvPoMem3623W+w8HJHrWYkVJ51kk= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1:SbErYREK7xXdsRiigaQiQkI9McGRzYMvlKYaP3Nimdk= -github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= -github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= -github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= -github.com/timonwong/loggercheck v0.9.3/go.mod h1:wUqnk9yAOIKtGA39l1KLE9Iz0QiTocu/YZoOf+OzFdw= -github.com/tomarrell/wrapcheck/v2 v2.8.0/go.mod h1:ao7l5p0aOlUNJKI0qVwB4Yjlqutd0IvAB9Rdwyilxvg= -github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= -github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zimmski/go-mutesting v0.0.0-20210610104036-6d9217011a00/go.mod h1:RJt5SMnyha63GbdwCKJiX9djvvEC4KsfXJSZ5oTmSPw= -github.com/zimmski/go-tool v0.0.0-20150119110811-2dfdc9ac8439/go.mod h1:G4FVqCRvfz74AEB1crDNdQuvMfOoKtk7DlePsnV2yGs= -github.com/zimmski/osutil v0.0.0-20190128123334-0d0b3ca231ac/go.mod h1:wJ9WGevuM/rw8aB2pQPFMUgXZWeaouI0ueFamR0DUPE= -gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= -go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= -golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191018212557-ed542cd5b28a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -honnef.co/go/tools v0.4.2/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= -mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RFiZMMsLVL+A96Nvptar8Fj71is= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= +github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v1.0.5/go.mod h1:APVvOesVSAnne5SClsPxPdfvZTVDojXh1/G3qb5wjGI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= +github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8/go.mod h1:CGFX09Ci3pq9QZdj86B+VGIdNj4VyCo2iPOGS9esB/k= +github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= +github.com/quasilyte/go-ruleguard v0.3.18/go.mod h1:lOIzcYlgxrQ2sGJ735EHXmf/e9MJ516j16K/Ifcttvs= +github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.21/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= +github.com/quasilyte/gogrep v0.0.0-20220828223005-86e4605de09f/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= +github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= +github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= +github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= +github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= +github.com/ryancurrah/gomodguard v1.0.4/go.mod h1:9T/Cfuxs5StfsocWr4WzDL36HqnX0fVb9d5fSEaLhoE= +github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= +github.com/ryancurrah/gomodguard v1.2.4/go.mod h1:+Kem4VjWwvFpUJRJSwa16s1tBJe+vbv02+naTow2f6M= +github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= +github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= +github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= +github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= +github.com/sashamelentyev/usestdlibvars v1.20.0/go.mod h1:0GaP+ecfZMXShS0A94CJn6aEuPRILv8h/VuWI9n1ygg= +github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/securego/gosec v0.0.0-20200103095621-79fbf3af8d83/go.mod h1:vvbZ2Ae7AzSq3/kywjUDxSNq2SJ27RxCz2un0H3ePqE= +github.com/securego/gosec v0.0.0-20200401082031-e946c8c39989/go.mod h1:i9l/TNj+yDFh9SZXUTvspXTjbFXgZGP/UvhU1S65A4A= +github.com/securego/gosec/v2 v2.3.0/go.mod h1:UzeVyUXbxukhLeHKV3VVqo7HdoQR9MrRfFmZYotn8ME= +github.com/securego/gosec/v2 v2.13.1/go.mod h1:EO1sImBMBWFjOTFzMWfTRrZW6M15gm60ljzrmy/wtHo= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= +github.com/shirou/gopsutil/v3 v3.22.9/go.mod h1:bBYl1kjgEJpWpxeHmLI+dVHWtyAwfcmSBLDsp2TNT8A= +github.com/shirou/gopsutil/v3 v3.23.1/go.mod h1:NN6mnm5/0k8jw4cBfCnJtr5L7ErOTg18tMNpgFkn0hA= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sivchari/tenv v1.7.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= +github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= +github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVjBcBGsVmMmak= +github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= +github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= +github.com/tendermint/tm-db v0.6.6/go.mod h1:wP8d49A85B7/erz/r4YbKssKw6ylsO/hKtFk7E1aWZI= +github.com/tetafro/godot v0.3.7/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= +github.com/tetafro/godot v0.4.2/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= +github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= +github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= +github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= +github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= +github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= +github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tomarrell/wrapcheck/v2 v2.7.0/go.mod h1:ao7l5p0aOlUNJKI0qVwB4Yjlqutd0IvAB9Rdwyilxvg= +github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= +github.com/tommy-muehle/go-mnd v1.1.1/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/tonistiigi/fsutil v0.0.0-20201103201449-0834f99b7b85/go.mod h1:a7cilN64dG941IOXfhJhlH0qB92hxJ9A1ewrdUmJ6xo= +github.com/tonistiigi/fsutil v0.0.0-20220115021204-b19f7f9cb274/go.mod h1:oPAfvw32vlUJSjyDcQ3Bu0nb2ON2B+G0dtVN/SZNJiA= +github.com/tonistiigi/go-actions-cache v0.0.0-20220404170428-0bdeb6e1eac7/go.mod h1:qqvyZqkfwkoJuPU/bw61bItaoO0SJ8YSW0vSVRRvsRg= +github.com/tonistiigi/go-archvariant v1.0.0/go.mod h1:TxFmO5VS6vMq2kvs3ht04iPXtu2rUT/erOnGFYfk5Ho= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= +github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= +github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= +github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= +github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= +github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJbreVojo06krnTgaeAz/Z7lynpPk/Q2c= +github.com/vektra/mockery/v2 v2.14.0/go.mod h1:bnD1T8tExSgPD1ripLkDbr60JA9VtQeu12P3wgLZd7M= +github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= +github.com/xanzy/go-gitlab v0.32.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= +go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= +go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= +go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= +go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= +go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A= +go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.29.0/go.mod h1:LsankqVDx4W+RhZNA5uWarULII/MBhF5qwCYxTuyXjs= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.3/go.mod h1:Dts42MGkzZne2yCru741+bFiTMWkIj/LLRizad7b9tw= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.29.0/go.mod h1:vHItvsnJtp7ES++nFLLFBzUWny7fJQSvTlxFcqQGUr4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.29.0/go.mod h1:tLYsuf2v8fZreBVwp9gVMhefZlLFZaUiNVSq8QxXRII= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= +go.opentelemetry.io/otel v1.4.0/go.mod h1:jeAqMFKy2uLIxCtKxoFj0FAL5zAPKQagc3+GtBWakzk= +go.opentelemetry.io/otel v1.4.1/go.mod h1:StM6F/0fSwpd8dKWDCdRr7uRvEPYdW0hBSlbdTiUde4= +go.opentelemetry.io/otel v1.11.0/go.mod h1:H2KtuEphyMvlhZ+F7tg9GRhAOe60moNx61Ex+WmiKkk= +go.opentelemetry.io/otel/exporters/jaeger v1.4.1/go.mod h1:ZW7vkOu9nC1CxsD8bHNHCia5JUbwP39vxgd1q4Z5rCI= +go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.4.1/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.4.1/go.mod h1:o5RW5o2pKpJLD5dNTCmjF1DorYwMeFJmb/rKr5sLaa8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.4.1/go.mod h1:c6E4V3/U+miqjs/8l950wggHGL1qzlp0Ypj9xoGrPqo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.4.1/go.mod h1:VwYo0Hak6Efuy0TXsZs8o1hnV3dHDPNtDbycG0hI8+M= +go.opentelemetry.io/otel/internal/metric v0.27.0/go.mod h1:n1CVxRqKqYZtqyTh9U/onvKapPGv7y/rpyOTI+LFNzw= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.27.0/go.mod h1:raXDJ7uP2/Jc0nVZWQjJtzoyssOYWu/+pjZqRzfvZ7g= +go.opentelemetry.io/otel/metric v0.32.3/go.mod h1:pgiGmKohxHyTPHGOff+vrtIH39/R9fiO/WoenUQ3kcc= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= +go.opentelemetry.io/otel/sdk v1.4.1/go.mod h1:NBwHDgDIBYjwK2WNu1OPgsIc2IJzmBXNnvIJxJc8BpE= +go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= +go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= +go.opentelemetry.io/otel/trace v1.4.0/go.mod h1:uc3eRsqDfWs9R7b92xbQbU42/eTNz4N+gLP8qJCi4aE= +go.opentelemetry.io/otel/trace v1.4.1/go.mod h1:iYEVbroFCNut9QkwEczV9vMRPHNKSSwYZjulEtsmhFc= +go.opentelemetry.io/otel/trace v1.11.0/go.mod h1:nyYjis9jy0gytE9LXGU+/m1sHTKbRY0fX0hulNNDP1U= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= +go.opentelemetry.io/proto/otlp v0.12.0/go.mod h1:TsIjwGWIx5VFYv9KGVlOpxoBl5Dy+63SUguV7GGvlSQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= +golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= +golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20221002003631-540bb7301a08/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220726230323-06994584191e/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221017152216-f25eb7ecb193/go.mod h1:RpDiru2p0u2F0lLpEoqnP2+7xs0ifAuOcJ442g6GU2s= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200917073148-efd3b9a0ff20/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201013081832-0aaa2718063a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210313202042-bd2e13477e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211031064116-611d5d643895/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220727055044-e65921a090b8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220919170432-7a66f970e087/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190228203856-589c23e65e65/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200102140908-9497f49d5709/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204192400-7124308813f3/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200331202046-9d5940d49312/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200502202811-ed308ab3e770/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.11-0.20220513221640-090b14e8501f/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.12-0.20220628192153-7743d1d949f1/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.4.1-0.20221208213631-3f74d914ae6d/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.2.0/go.mod h1:IfRCZScioGtypHNTlz3gFk67J8uePVW7uDTBzXuIkhU= +google.golang.org/api v0.3.0/go.mod h1:IuvZyQh8jgscv8qWfQ4ABd8m7hEudgBFM/EdhA3BnXw= +google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.25.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= +google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211101144312-62acf1d99145/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220725144611-272f38e5d71b/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +honnef.co/go/tools v0.3.3/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw= +k8s.io/api v0.0.0-20180904230853-4e7be11eab3f/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/api v0.17.4/go.mod h1:5qxx6vjmwUVG2nHQTKGlLts8Tbok8PzHl4vHtVFuZCA= +k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= +k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= +k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= +k8s.io/api v0.23.4/go.mod h1:i77F4JfyNNrhOjZF7OwwNJS5Y1S9dpwvb9iYRYRczfI= +k8s.io/apimachinery v0.0.0-20180904193909-def12e63c512/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/apimachinery v0.17.4/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= +k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= +k8s.io/apimachinery v0.23.4/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= +k8s.io/apiserver v0.17.4/go.mod h1:5ZDQ6Xr5MNBxyi3iUZXS84QOhZl+W7Oq2us/29c0j9I= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= +k8s.io/client-go v0.0.0-20180910083459-2cefa64ff137/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/client-go v0.17.4/go.mod h1:ouF6o5pz3is8qU0/qYL2RnoxOPqgfuidYLowytyLJmc= +k8s.io/client-go v0.19.0/go.mod h1:H9E/VT95blcFQnlyShFgnFT9ZnJOAceiUHM3MlRC+mU= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= +k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= +k8s.io/client-go v0.23.4/go.mod h1:PKnIL4pqLuvYUK1WU7RLTMYKPiIh7MYShLshtRY9cj0= +k8s.io/cloud-provider v0.17.4/go.mod h1:XEjKDzfD+b9MTLXQFlDGkk6Ho8SGMpaU8Uugx/KNK9U= +k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= +k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= +k8s.io/component-base v0.17.4/go.mod h1:5BRqHMbbQPm2kKu35v3G+CpVq4K0RJKC7TRioF0I9lE= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= +k8s.io/cri-api v0.24.0-alpha.3/go.mod h1:c/NLI5Zdyup5+oEYqFO2IE32ptofNiZpS1nL2y51gAg= +k8s.io/csi-translation-lib v0.17.4/go.mod h1:CsxmjwxEI0tTNMzffIAcgR9lX4wOh6AKHdxQrT7L0oo= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= +k8s.io/kubernetes v1.11.10/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuBkhu+yxOc1Js= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= +mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7/go.mod h1:HGC5lll35J70Y5v7vCGb9oLhHoScFwkHDJm/05RdSTc= +mvdan.cc/unparam v0.0.0-20220706161116-678bad134442/go.mod h1:F/Cxw/6mVrNKqrR2YjFf5CaW0Bw4RL8RfbEf4GRggJk= +pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4= diff --git a/proto/osmosis/concentrated-liquidity/tx.proto b/proto/osmosis/concentrated-liquidity/tx.proto index a68f2ab2438..ea8b8e2e8aa 100644 --- a/proto/osmosis/concentrated-liquidity/tx.proto +++ b/proto/osmosis/concentrated-liquidity/tx.proto @@ -132,4 +132,57 @@ message MsgCollectIncentivesResponse { (gogoproto.moretags) = "yaml:\"collected_incentives\"", (gogoproto.nullable) = false ]; +} + +// ===================== MsgCreateIncentive +message MsgCreateIncentive { + uint64 pool_id = 1 [ (gogoproto.moretags) = "yaml:\"pool_id\"" ]; + string sender = 2 [ (gogoproto.moretags) = "yaml:\"sender\"" ]; + string incentive_denom = 3; + string incentive_amount = 4 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", + (gogoproto.moretags) = "yaml:\"incentive_amount\"", + (gogoproto.nullable) = false + ]; + string emission_rate = 5 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.moretags) = "yaml:\"emission_rate\"", + (gogoproto.nullable) = false + ]; + google.protobuf.Timestamp start_time = 6 [ + (gogoproto.nullable) = false, + (gogoproto.stdtime) = true, + (gogoproto.moretags) = "yaml:\"start_time\"" + ]; + google.protobuf.Duration min_uptime = 7 [ + (gogoproto.nullable) = false, + (gogoproto.stdduration) = true, + (gogoproto.jsontag) = "duration,omitempty", + (gogoproto.moretags) = "yaml:\"min_uptime\"" + ]; +} + +message MsgCreateIncentiveResponse { + string incentive_denom = 1; + string incentive_amount = 2 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.moretags) = "yaml:\"incentive_amount\"", + (gogoproto.nullable) = false + ]; + string emission_rate = 3 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.moretags) = "yaml:\"emission_rate\"", + (gogoproto.nullable) = false + ]; + google.protobuf.Timestamp start_time = 4 [ + (gogoproto.nullable) = false, + (gogoproto.stdtime) = true, + (gogoproto.moretags) = "yaml:\"start_time\"" + ]; + google.protobuf.Duration min_uptime = 5 [ + (gogoproto.nullable) = false, + (gogoproto.stdduration) = true, + (gogoproto.jsontag) = "duration,omitempty", + (gogoproto.moretags) = "yaml:\"min_uptime\"" + ]; } \ No newline at end of file diff --git a/x/concentrated-liquidity/msg_server.go b/x/concentrated-liquidity/msg_server.go index 247deda52fe..a1e1af8a55a 100644 --- a/x/concentrated-liquidity/msg_server.go +++ b/x/concentrated-liquidity/msg_server.go @@ -194,3 +194,43 @@ func (server msgServer) CollectIncentives(goCtx context.Context, msg *types.MsgC return &types.MsgCollectIncentivesResponse{CollectedIncentives: collectedIncentives}, nil } + +func (server msgServer) CreateIncentive(goCtx context.Context, msg *types.MsgCreateIncentive) (*types.MsgCreateIncentiveResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + return nil, err + } + + incentiveRecord, err := server.keeper.createIncentive(ctx, msg.PoolId, sender, msg.IncentiveDenom, msg.IncentiveAmount, msg.EmissionRate, msg.StartTime, msg.MinUptime) + if err != nil { + return nil, err + } + + ctx.EventManager().EmitEvents(sdk.Events{ + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender), + ), + sdk.NewEvent( + types.TypeEvtCreateIncentive, + sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender), + sdk.NewAttribute(types.AttributeKeyPoolId, strconv.FormatUint(msg.PoolId, 10)), + sdk.NewAttribute(types.AttributeIncentiveDenom, msg.IncentiveDenom), + sdk.NewAttribute(types.AttributeIncentiveAmount, msg.IncentiveAmount.String()), + sdk.NewAttribute(types.AttributeIncentiveEmissionRate, msg.EmissionRate.String()), + sdk.NewAttribute(types.AttributeIncentiveStartTime, msg.StartTime.String()), + sdk.NewAttribute(types.AttributeIncentiveMinUptime, msg.MinUptime.String()), + ), + }) + + return &types.MsgCreateIncentiveResponse{ + IncentiveDenom: incentiveRecord.IncentiveDenom, + IncentiveAmount: incentiveRecord.RemainingAmount, + EmissionRate: incentiveRecord.EmissionRate, + StartTime: incentiveRecord.StartTime, + MinUptime: incentiveRecord.MinUptime}, nil +} diff --git a/x/concentrated-liquidity/types/events.go b/x/concentrated-liquidity/types/events.go index 1f8032da8bb..904ea182f28 100644 --- a/x/concentrated-liquidity/types/events.go +++ b/x/concentrated-liquidity/types/events.go @@ -5,6 +5,7 @@ const ( TypeEvtWithdrawPosition = "withdraw_position" TypeEvtCollectFees = "collect_fees" TypeEvtCollectIncentives = "collect_incentives" + TypeEvtCreateIncentive = "create_incentive" AttributeValueCategory = ModuleName AttributeKeyPoolId = "pool_id" @@ -16,6 +17,11 @@ const ( AttributeLiquidity = "liquidity" AttributeLowerTick = "lower_tick" AttributeUpperTick = "upper_tick" + AttributeIncentiveDenom = "incentive_denom" + AttributeIncentiveAmount = "incentive_amount" + AttributeIncentiveEmissionRate = "incentive_emission_rate" + AttributeIncentiveStartTime = "incentive_start_time" + AttributeIncentiveMinUptime = "incentive_min_uptime" TypeEvtPoolJoined = "pool_joined" TypeEvtPoolExited = "pool_exited" TypeEvtPoolCreated = "pool_created" diff --git a/x/concentrated-liquidity/types/tx.pb.go b/x/concentrated-liquidity/types/tx.pb.go index 6d58153f204..06bf94fbfe2 100644 --- a/x/concentrated-liquidity/types/tx.pb.go +++ b/x/concentrated-liquidity/types/tx.pb.go @@ -518,6 +518,147 @@ func (m *MsgCollectIncentivesResponse) GetCollectedIncentives() []types.Coin { return nil } +// ===================== MsgCreateIncentive +type MsgCreateIncentive struct { + PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + Sender string `protobuf:"bytes,2,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + IncentiveDenom string `protobuf:"bytes,3,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` + IncentiveAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=incentive_amount,json=incentiveAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"incentive_amount" yaml:"incentive_amount"` + EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"emission_rate"` + StartTime time.Time `protobuf:"bytes,6,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` + MinUptime time.Duration `protobuf:"bytes,7,opt,name=min_uptime,json=minUptime,proto3,stdduration" json:"duration,omitempty" yaml:"min_uptime"` +} + +func (m *MsgCreateIncentive) Reset() { *m = MsgCreateIncentive{} } +func (m *MsgCreateIncentive) String() string { return proto.CompactTextString(m) } +func (*MsgCreateIncentive) ProtoMessage() {} +func (*MsgCreateIncentive) Descriptor() ([]byte, []int) { + return fileDescriptor_1f1fff802923d7db, []int{8} +} +func (m *MsgCreateIncentive) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateIncentive) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateIncentive.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateIncentive) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateIncentive.Merge(m, src) +} +func (m *MsgCreateIncentive) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateIncentive) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateIncentive.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateIncentive proto.InternalMessageInfo + +func (m *MsgCreateIncentive) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *MsgCreateIncentive) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgCreateIncentive) GetIncentiveDenom() string { + if m != nil { + return m.IncentiveDenom + } + return "" +} + +func (m *MsgCreateIncentive) GetStartTime() time.Time { + if m != nil { + return m.StartTime + } + return time.Time{} +} + +func (m *MsgCreateIncentive) GetMinUptime() time.Duration { + if m != nil { + return m.MinUptime + } + return 0 +} + +type MsgCreateIncentiveResponse struct { + IncentiveDenom string `protobuf:"bytes,1,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` + IncentiveAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=incentive_amount,json=incentiveAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"incentive_amount" yaml:"incentive_amount"` + EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"emission_rate"` + StartTime time.Time `protobuf:"bytes,4,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` + MinUptime time.Duration `protobuf:"bytes,5,opt,name=min_uptime,json=minUptime,proto3,stdduration" json:"duration,omitempty" yaml:"min_uptime"` +} + +func (m *MsgCreateIncentiveResponse) Reset() { *m = MsgCreateIncentiveResponse{} } +func (m *MsgCreateIncentiveResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreateIncentiveResponse) ProtoMessage() {} +func (*MsgCreateIncentiveResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_1f1fff802923d7db, []int{9} +} +func (m *MsgCreateIncentiveResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateIncentiveResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateIncentiveResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateIncentiveResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateIncentiveResponse.Merge(m, src) +} +func (m *MsgCreateIncentiveResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateIncentiveResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateIncentiveResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateIncentiveResponse proto.InternalMessageInfo + +func (m *MsgCreateIncentiveResponse) GetIncentiveDenom() string { + if m != nil { + return m.IncentiveDenom + } + return "" +} + +func (m *MsgCreateIncentiveResponse) GetStartTime() time.Time { + if m != nil { + return m.StartTime + } + return time.Time{} +} + +func (m *MsgCreateIncentiveResponse) GetMinUptime() time.Duration { + if m != nil { + return m.MinUptime + } + return 0 +} + func init() { proto.RegisterType((*MsgCreatePosition)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCreatePosition") proto.RegisterType((*MsgCreatePositionResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCreatePositionResponse") @@ -527,6 +668,8 @@ func init() { proto.RegisterType((*MsgCollectFeesResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCollectFeesResponse") proto.RegisterType((*MsgCollectIncentives)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCollectIncentives") proto.RegisterType((*MsgCollectIncentivesResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCollectIncentivesResponse") + proto.RegisterType((*MsgCreateIncentive)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCreateIncentive") + proto.RegisterType((*MsgCreateIncentiveResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCreateIncentiveResponse") } func init() { @@ -534,65 +677,76 @@ func init() { } var fileDescriptor_1f1fff802923d7db = []byte{ - // 922 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x57, 0x41, 0x6f, 0xdc, 0x44, - 0x14, 0xce, 0x34, 0x61, 0xd3, 0x9d, 0x2a, 0x9b, 0xac, 0x9b, 0x16, 0x77, 0x5b, 0xd6, 0xab, 0x41, - 0x40, 0x10, 0xc4, 0xae, 0x0b, 0x95, 0xaa, 0x22, 0xa4, 0xe2, 0x44, 0x48, 0x41, 0x8a, 0x84, 0xac, - 0x22, 0xa4, 0x0a, 0xc9, 0xf2, 0xda, 0x93, 0xed, 0x90, 0xb5, 0xc7, 0xf5, 0xcc, 0x26, 0x5d, 0xc4, - 0x8d, 0x03, 0x17, 0x0e, 0x05, 0x09, 0x89, 0x1f, 0xc0, 0x7f, 0xa1, 0x07, 0x0e, 0x3d, 0x80, 0x84, - 0x7a, 0x30, 0x28, 0xb9, 0x71, 0xdc, 0x5f, 0x80, 0xec, 0x19, 0xdb, 0x1b, 0x7b, 0x11, 0xdd, 0x04, - 0x21, 0x91, 0x53, 0x76, 0xde, 0xbc, 0xef, 0xfb, 0x66, 0xbe, 0x99, 0xf7, 0xc6, 0x81, 0x6f, 0x50, - 0x16, 0x50, 0x46, 0x98, 0xe1, 0xd1, 0xd0, 0xc3, 0x21, 0x8f, 0x5d, 0x8e, 0xfd, 0xcd, 0x21, 0x79, - 0x34, 0x22, 0x3e, 0xe1, 0x63, 0x83, 0x3f, 0xd6, 0xa3, 0x98, 0x72, 0xaa, 0xbc, 0x26, 0x13, 0xf5, - 0xe9, 0xc4, 0x22, 0x4f, 0x3f, 0x30, 0xfb, 0x98, 0xbb, 0x66, 0x67, 0x7d, 0x40, 0x07, 0x34, 0x43, - 0x18, 0xe9, 0x2f, 0x01, 0xee, 0x68, 0x03, 0x4a, 0x07, 0x43, 0x6c, 0x64, 0xa3, 0xfe, 0x68, 0xcf, - 0xe0, 0x24, 0xc0, 0x8c, 0xbb, 0x41, 0x24, 0x13, 0xba, 0xd5, 0x04, 0x7f, 0x14, 0xbb, 0x9c, 0xd0, - 0x30, 0x9f, 0xf7, 0x32, 0x79, 0xa3, 0xef, 0x32, 0x6c, 0x48, 0x2d, 0xc3, 0xa3, 0x44, 0xce, 0xa3, - 0xaf, 0x1b, 0xb0, 0xbd, 0xcb, 0x06, 0x5b, 0x31, 0x76, 0x39, 0xfe, 0x98, 0x32, 0x92, 0x62, 0x95, - 0xb7, 0xe0, 0x72, 0x44, 0xe9, 0xd0, 0x21, 0xbe, 0x0a, 0x7a, 0x60, 0x63, 0xc9, 0x52, 0x26, 0x89, - 0xd6, 0x1a, 0xbb, 0xc1, 0xf0, 0x2e, 0x92, 0x13, 0xc8, 0x6e, 0xa4, 0xbf, 0x76, 0x7c, 0xe5, 0x4d, - 0xd8, 0x60, 0x38, 0xf4, 0x71, 0xac, 0x5e, 0xe8, 0x81, 0x8d, 0xa6, 0xd5, 0x9e, 0x24, 0xda, 0x8a, - 0xc8, 0x15, 0x71, 0x64, 0xcb, 0x04, 0xe5, 0x5d, 0x08, 0x87, 0xf4, 0x10, 0xc7, 0x0e, 0x27, 0xde, - 0xbe, 0xba, 0xd8, 0x03, 0x1b, 0x8b, 0xd6, 0x95, 0x49, 0xa2, 0xb5, 0x45, 0x7a, 0x39, 0x87, 0xec, - 0x66, 0x36, 0xb8, 0x4f, 0xbc, 0xfd, 0x14, 0x35, 0x8a, 0xa2, 0x1c, 0xb5, 0x54, 0x45, 0x95, 0x73, - 0xc8, 0x6e, 0x66, 0x83, 0x0c, 0xe5, 0xc0, 0x16, 0xa7, 0xfb, 0x38, 0x74, 0x7c, 0xcc, 0x48, 0x8c, - 0xfd, 0x9b, 0xea, 0x4b, 0x3d, 0xb0, 0x71, 0xe9, 0xd6, 0x35, 0x5d, 0x58, 0xa2, 0xa7, 0x96, 0xe4, - 0xf6, 0xeb, 0x5b, 0x94, 0x84, 0xd6, 0x2b, 0x4f, 0x13, 0x6d, 0x61, 0x92, 0x68, 0x57, 0x04, 0xf1, - 0x49, 0x38, 0xb2, 0x57, 0xb2, 0xc0, 0xb6, 0x1c, 0xd7, 0x04, 0x4c, 0xb5, 0x71, 0x16, 0x01, 0xb3, - 0x22, 0x60, 0x2a, 0x07, 0xb0, 0x2d, 0x32, 0x02, 0x12, 0x3a, 0x6e, 0x40, 0x47, 0x21, 0xbf, 0xa9, - 0x2e, 0x67, 0x1e, 0x7f, 0x94, 0x12, 0x3d, 0x4f, 0xb4, 0xd7, 0x07, 0x84, 0x3f, 0x1c, 0xf5, 0x75, - 0x8f, 0x06, 0x86, 0x3c, 0x69, 0xf1, 0x67, 0x93, 0xf9, 0xfb, 0x06, 0x1f, 0x47, 0x98, 0xe9, 0x3b, - 0x21, 0x9f, 0x24, 0x9a, 0x3a, 0x2d, 0x39, 0x45, 0x88, 0xec, 0xd5, 0x2c, 0xb6, 0x4b, 0xc2, 0x0f, - 0x44, 0x64, 0x96, 0xae, 0xa9, 0x5e, 0xfc, 0x77, 0x75, 0xcd, 0x9a, 0xae, 0xa9, 0x7c, 0x09, 0x57, - 0xf7, 0x62, 0x8c, 0xbf, 0xc0, 0x4e, 0x7e, 0x89, 0xd5, 0xa6, 0x74, 0x54, 0xdc, 0x72, 0x3d, 0xbf, - 0xe5, 0xfa, 0xb6, 0x4c, 0xb0, 0xee, 0xa4, 0x0b, 0xfa, 0x33, 0xd1, 0x94, 0x1c, 0xf2, 0x36, 0x0d, - 0x08, 0xc7, 0x41, 0xc4, 0xc7, 0x93, 0x44, 0xbb, 0x2a, 0xc4, 0x2b, 0xac, 0xe8, 0x87, 0xdf, 0x35, - 0x60, 0xb7, 0x44, 0x34, 0x67, 0x42, 0x3f, 0x5f, 0x80, 0xd7, 0x6a, 0x95, 0x60, 0x63, 0x16, 0xd1, - 0x90, 0x61, 0xe5, 0x01, 0x5c, 0xce, 0x4f, 0x00, 0x64, 0x4e, 0xdc, 0x9b, 0xdb, 0x09, 0x59, 0x3f, - 0x85, 0xef, 0x39, 0x61, 0xc9, 0x6d, 0xca, 0x0a, 0x3a, 0x23, 0xb7, 0x59, 0x70, 0x9b, 0xca, 0x21, - 0x6c, 0x17, 0xbd, 0xc6, 0xf1, 0xb2, 0xbd, 0xf9, 0x59, 0x21, 0xcc, 0x77, 0x96, 0xdb, 0xd8, 0x2b, - 0xcf, 0xb2, 0x46, 0x88, 0xec, 0xb5, 0x22, 0xb6, 0x25, 0x43, 0x3f, 0x2e, 0xc1, 0xcb, 0xbb, 0x6c, - 0xf0, 0x29, 0xe1, 0x0f, 0xfd, 0xd8, 0x3d, 0x3c, 0x57, 0xad, 0x85, 0xc3, 0x72, 0xbf, 0xf2, 0x3e, - 0x4b, 0x4f, 0x77, 0xe6, 0xf6, 0xf4, 0xe5, 0xaa, 0xa7, 0x82, 0x0f, 0xd9, 0xab, 0x45, 0x48, 0xd4, - 0x87, 0xf2, 0x09, 0x6c, 0x7e, 0x4e, 0x49, 0xe8, 0xa4, 0x4f, 0x80, 0x6c, 0x35, 0x9d, 0x5a, 0x61, - 0xdc, 0xcf, 0xdf, 0x07, 0xeb, 0x86, 0xec, 0x35, 0x6b, 0x42, 0xa0, 0x80, 0xa2, 0x27, 0xe9, 0xed, - 0xbf, 0x98, 0x8e, 0xd3, 0xe4, 0x59, 0x55, 0xb7, 0xfc, 0xdf, 0x55, 0xdd, 0xaf, 0x00, 0x5e, 0x9f, - 0x71, 0x4d, 0xfe, 0xef, 0x75, 0x87, 0x7e, 0x01, 0xb0, 0x95, 0x76, 0x13, 0x3a, 0x1c, 0x62, 0x8f, - 0x7f, 0x88, 0x31, 0x3b, 0x0f, 0x37, 0x1f, 0x8d, 0xe1, 0xd5, 0x93, 0xbb, 0x2a, 0x0e, 0xca, 0x81, - 0x2d, 0x4f, 0x84, 0xb1, 0xef, 0xec, 0x61, 0xcc, 0x54, 0xd0, 0x5b, 0x9c, 0xeb, 0x35, 0x3c, 0x09, - 0x47, 0xf6, 0x4a, 0x11, 0x48, 0x85, 0xd0, 0x73, 0x00, 0xd7, 0x4b, 0xed, 0x9d, 0xec, 0x5b, 0x8a, - 0x1c, 0x9c, 0x13, 0x5f, 0xbf, 0x05, 0xf0, 0xc6, 0xac, 0xcd, 0x15, 0xf6, 0x3e, 0x82, 0xeb, 0xa5, - 0x3f, 0xa4, 0x98, 0xff, 0x67, 0x93, 0x5f, 0x95, 0x26, 0x5f, 0xaf, 0x9a, 0x5c, 0x92, 0x20, 0xfb, - 0x72, 0x11, 0x2e, 0xa5, 0x6f, 0xfd, 0xb4, 0x04, 0x17, 0x77, 0xd9, 0x40, 0xf9, 0x06, 0xc0, 0x56, - 0xe5, 0xfb, 0xf0, 0x8e, 0xfe, 0x42, 0x1f, 0xb5, 0x7a, 0xed, 0x3d, 0xed, 0xdc, 0x3b, 0x2d, 0xb2, - 0x70, 0xe2, 0x3b, 0x00, 0xd7, 0x6a, 0xaf, 0xca, 0xdd, 0x17, 0xa7, 0xad, 0x62, 0x3b, 0xd6, 0xe9, - 0xb1, 0xc5, 0xa2, 0xbe, 0x02, 0xf0, 0xd2, 0x74, 0xad, 0xdf, 0x9e, 0x63, 0x9b, 0x25, 0xac, 0xf3, - 0xfe, 0xa9, 0x60, 0xc5, 0x2a, 0xbe, 0x07, 0xb0, 0x5d, 0xaf, 0x8f, 0xf7, 0xe6, 0x26, 0x2d, 0xc1, - 0x9d, 0xad, 0x33, 0x80, 0xf3, 0x75, 0x59, 0x9f, 0x3d, 0x3d, 0xea, 0x82, 0x67, 0x47, 0x5d, 0xf0, - 0xc7, 0x51, 0x17, 0x3c, 0x39, 0xee, 0x2e, 0x3c, 0x3b, 0xee, 0x2e, 0xfc, 0x76, 0xdc, 0x5d, 0x78, - 0x60, 0x4d, 0x75, 0x5a, 0x29, 0xb4, 0x39, 0x74, 0xfb, 0x2c, 0x1f, 0x18, 0x07, 0xe6, 0x6d, 0xe3, - 0xf1, 0xdf, 0xfe, 0x8f, 0x95, 0x76, 0xe2, 0x7e, 0x23, 0x7b, 0x9f, 0xde, 0xf9, 0x2b, 0x00, 0x00, - 0xff, 0xff, 0x93, 0x6f, 0x8b, 0x14, 0x92, 0x0d, 0x00, 0x00, + // 1091 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0x4f, 0x6f, 0x1b, 0x45, + 0x14, 0xcf, 0xc4, 0x6e, 0x52, 0x4f, 0x89, 0x13, 0x6f, 0xd3, 0xb2, 0x75, 0x8b, 0x37, 0x1a, 0x04, + 0x0d, 0x82, 0xec, 0x76, 0x5b, 0x2a, 0x55, 0x45, 0x48, 0xc5, 0x89, 0x2a, 0x05, 0x29, 0x12, 0x5a, + 0xb5, 0x02, 0x55, 0x48, 0xab, 0xf5, 0xee, 0xc4, 0x1d, 0xec, 0xdd, 0x71, 0x77, 0xc6, 0x49, 0x8d, + 0xb8, 0x71, 0xe0, 0xc2, 0xa1, 0x20, 0x21, 0xf1, 0x01, 0xf8, 0x22, 0x9c, 0xe8, 0x81, 0x43, 0x0f, + 0x20, 0xa1, 0x1e, 0x0c, 0x4a, 0x6e, 0xdc, 0xf0, 0x27, 0x40, 0xbb, 0x33, 0x3b, 0xeb, 0xd8, 0x86, + 0xc6, 0x09, 0xa9, 0x44, 0x4e, 0xf1, 0x7b, 0xf3, 0x7e, 0xef, 0xcd, 0xfc, 0xde, 0x9f, 0x99, 0x0d, + 0xbc, 0x4a, 0x59, 0x48, 0x19, 0x61, 0x96, 0x4f, 0x23, 0x1f, 0x47, 0x3c, 0xf6, 0x38, 0x0e, 0xd6, + 0xda, 0xe4, 0x51, 0x97, 0x04, 0x84, 0xf7, 0x2c, 0xfe, 0xd8, 0xec, 0xc4, 0x94, 0x53, 0xed, 0x0d, + 0x69, 0x68, 0x0e, 0x1b, 0x2a, 0x3b, 0x73, 0xc7, 0x6e, 0x60, 0xee, 0xd9, 0xd5, 0xe5, 0x26, 0x6d, + 0xd2, 0x14, 0x61, 0x25, 0xbf, 0x04, 0xb8, 0x6a, 0x34, 0x29, 0x6d, 0xb6, 0xb1, 0x95, 0x4a, 0x8d, + 0xee, 0xb6, 0xc5, 0x49, 0x88, 0x19, 0xf7, 0xc2, 0x8e, 0x34, 0xa8, 0x8d, 0x1a, 0x04, 0xdd, 0xd8, + 0xe3, 0x84, 0x46, 0xd9, 0xba, 0x9f, 0x86, 0xb7, 0x1a, 0x1e, 0xc3, 0x96, 0x8c, 0x65, 0xf9, 0x94, + 0xc8, 0x75, 0xf4, 0xd5, 0x1c, 0xac, 0x6c, 0xb1, 0xe6, 0x7a, 0x8c, 0x3d, 0x8e, 0x3f, 0xa2, 0x8c, + 0x24, 0x58, 0xed, 0x6d, 0x38, 0xdf, 0xa1, 0xb4, 0xed, 0x92, 0x40, 0x07, 0x2b, 0x60, 0xb5, 0x58, + 0xd7, 0x06, 0x7d, 0xa3, 0xdc, 0xf3, 0xc2, 0xf6, 0x6d, 0x24, 0x17, 0x90, 0x33, 0x97, 0xfc, 0xda, + 0x0c, 0xb4, 0xb7, 0xe0, 0x1c, 0xc3, 0x51, 0x80, 0x63, 0x7d, 0x76, 0x05, 0xac, 0x96, 0xea, 0x95, + 0x41, 0xdf, 0x58, 0x10, 0xb6, 0x42, 0x8f, 0x1c, 0x69, 0xa0, 0xbd, 0x0b, 0x61, 0x9b, 0xee, 0xe2, + 0xd8, 0xe5, 0xc4, 0x6f, 0xe9, 0x85, 0x15, 0xb0, 0x5a, 0xa8, 0x5f, 0x18, 0xf4, 0x8d, 0x8a, 0x30, + 0xcf, 0xd7, 0x90, 0x53, 0x4a, 0x85, 0x7b, 0xc4, 0x6f, 0x25, 0xa8, 0x6e, 0xa7, 0x93, 0xa1, 0x8a, + 0xa3, 0xa8, 0x7c, 0x0d, 0x39, 0xa5, 0x54, 0x48, 0x51, 0x2e, 0x2c, 0x73, 0xda, 0xc2, 0x91, 0x1b, + 0x60, 0x46, 0x62, 0x1c, 0x5c, 0xd3, 0xcf, 0xac, 0x80, 0xd5, 0x73, 0xd7, 0x2f, 0x99, 0x82, 0x12, + 0x33, 0xa1, 0x24, 0xa3, 0xdf, 0x5c, 0xa7, 0x24, 0xaa, 0xbf, 0xf6, 0xb4, 0x6f, 0xcc, 0x0c, 0xfa, + 0xc6, 0x05, 0xe1, 0xf8, 0x20, 0x1c, 0x39, 0x0b, 0xa9, 0x62, 0x43, 0xca, 0x63, 0x01, 0x6c, 0x7d, + 0xee, 0x38, 0x01, 0xec, 0x91, 0x00, 0xb6, 0xb6, 0x03, 0x2b, 0xc2, 0x22, 0x24, 0x91, 0xeb, 0x85, + 0xb4, 0x1b, 0xf1, 0x6b, 0xfa, 0x7c, 0xca, 0xf1, 0x87, 0x89, 0xa3, 0xe7, 0x7d, 0xe3, 0xcd, 0x26, + 0xe1, 0x0f, 0xbb, 0x0d, 0xd3, 0xa7, 0xa1, 0x25, 0x33, 0x2d, 0xfe, 0xac, 0xb1, 0xa0, 0x65, 0xf1, + 0x5e, 0x07, 0x33, 0x73, 0x33, 0xe2, 0x83, 0xbe, 0xa1, 0x0f, 0x87, 0x1c, 0x72, 0x88, 0x9c, 0xc5, + 0x54, 0xb7, 0x45, 0xa2, 0x0f, 0x84, 0x66, 0x52, 0x5c, 0x5b, 0x3f, 0xfb, 0xdf, 0xc6, 0xb5, 0xc7, + 0xe2, 0xda, 0xda, 0x17, 0x70, 0x71, 0x3b, 0xc6, 0xf8, 0x73, 0xec, 0x66, 0x45, 0xac, 0x97, 0x24, + 0xa3, 0xa2, 0xca, 0xcd, 0xac, 0xca, 0xcd, 0x0d, 0x69, 0x50, 0xbf, 0x95, 0x6c, 0xe8, 0xcf, 0xbe, + 0xa1, 0x65, 0x90, 0x77, 0x68, 0x48, 0x38, 0x0e, 0x3b, 0xbc, 0x37, 0xe8, 0x1b, 0x17, 0x45, 0xf0, + 0x11, 0xaf, 0xe8, 0xfb, 0xdf, 0x0d, 0xe0, 0x94, 0x85, 0x36, 0xf3, 0x84, 0x7e, 0x9e, 0x85, 0x97, + 0xc6, 0x3a, 0xc1, 0xc1, 0xac, 0x43, 0x23, 0x86, 0xb5, 0x07, 0x70, 0x3e, 0xcb, 0x00, 0x48, 0x99, + 0xb8, 0x33, 0x35, 0x13, 0xb2, 0x7f, 0x14, 0xef, 0x99, 0xc3, 0xdc, 0xb7, 0x2d, 0x3b, 0xe8, 0x98, + 0xbe, 0x6d, 0xe5, 0xdb, 0xd6, 0x76, 0x61, 0x45, 0xcd, 0x1a, 0xd7, 0x4f, 0xcf, 0x16, 0xa4, 0x8d, + 0x30, 0x5d, 0x2e, 0x37, 0xb0, 0x9f, 0xe7, 0x72, 0xcc, 0x21, 0x72, 0x96, 0x94, 0x6e, 0x5d, 0xaa, + 0x7e, 0x28, 0xc2, 0xf3, 0x5b, 0xac, 0xf9, 0x31, 0xe1, 0x0f, 0x83, 0xd8, 0xdb, 0x3d, 0x55, 0xa3, + 0x85, 0xc3, 0xfc, 0xbc, 0xb2, 0x9e, 0x25, 0xa7, 0x9b, 0x53, 0x73, 0xfa, 0xea, 0x28, 0xa7, 0xc2, + 0x1f, 0x72, 0x16, 0x95, 0x4a, 0xf4, 0x87, 0x76, 0x1f, 0x96, 0x3e, 0xa3, 0x24, 0x72, 0x93, 0x2b, + 0x40, 0x8e, 0x9a, 0xea, 0x58, 0x63, 0xdc, 0xcb, 0xee, 0x87, 0xfa, 0x15, 0x39, 0x6b, 0x96, 0x44, + 0x00, 0x05, 0x45, 0x4f, 0x92, 0xea, 0x3f, 0x9b, 0xc8, 0x89, 0xf1, 0xa4, 0xae, 0x9b, 0x7f, 0x79, + 0x5d, 0xf7, 0x2b, 0x80, 0x97, 0x27, 0x94, 0xc9, 0xff, 0xbd, 0xef, 0xd0, 0x2f, 0x00, 0x96, 0x93, + 0x69, 0x42, 0xdb, 0x6d, 0xec, 0xf3, 0xbb, 0x18, 0xb3, 0xd3, 0x50, 0xf9, 0xa8, 0x07, 0x2f, 0x1e, + 0x3c, 0x95, 0x4a, 0x94, 0x0b, 0xcb, 0xbe, 0x50, 0xe3, 0xc0, 0xdd, 0xc6, 0x98, 0xe9, 0x60, 0xa5, + 0x30, 0xd5, 0x6d, 0x78, 0x10, 0x8e, 0x9c, 0x05, 0xa5, 0x48, 0x02, 0xa1, 0xe7, 0x00, 0x2e, 0xe7, + 0xb1, 0x37, 0xd3, 0xb7, 0x14, 0xd9, 0x39, 0x25, 0xbc, 0x7e, 0x03, 0xe0, 0x95, 0x49, 0x87, 0x53, + 0xf4, 0x3e, 0x82, 0xcb, 0x39, 0x3f, 0x44, 0xad, 0xbf, 0x98, 0xe4, 0xd7, 0x25, 0xc9, 0x97, 0x47, + 0x49, 0xce, 0x9d, 0x20, 0xe7, 0xbc, 0x52, 0xe7, 0xa1, 0xd1, 0x8f, 0x45, 0xa8, 0xa9, 0x0b, 0x51, + 0xe9, 0x4f, 0x8c, 0xee, 0xab, 0x70, 0x51, 0x6d, 0xc9, 0x0d, 0x70, 0x44, 0xc3, 0x94, 0xf3, 0x92, + 0x53, 0x56, 0xea, 0x8d, 0x44, 0x9b, 0x4c, 0xdf, 0xdc, 0x50, 0x4e, 0xdf, 0xe2, 0xd4, 0xd3, 0x57, + 0xf4, 0xaf, 0x9c, 0xbe, 0xa3, 0xfe, 0x90, 0x93, 0xef, 0x45, 0x4e, 0xdf, 0x16, 0x5c, 0xc0, 0x21, + 0x61, 0x8c, 0xd0, 0xc8, 0x4d, 0x9e, 0xf0, 0x72, 0xe0, 0xdf, 0x9d, 0x7a, 0xe0, 0x2f, 0x8b, 0x90, + 0x07, 0x9c, 0x21, 0xe7, 0x95, 0x4c, 0x76, 0x3c, 0x8e, 0xb5, 0x4f, 0x20, 0x64, 0xdc, 0x8b, 0xf9, + 0x61, 0x67, 0x7d, 0xd6, 0x49, 0xb2, 0xc8, 0x72, 0xac, 0x18, 0xf6, 0xa5, 0x54, 0x91, 0x4e, 0xfb, + 0x10, 0xc2, 0xe4, 0x11, 0xd6, 0xed, 0xa4, 0x9e, 0x5f, 0x38, 0xe8, 0x6f, 0xfc, 0xeb, 0xa0, 0x97, + 0xe1, 0x72, 0x87, 0x62, 0xc6, 0x97, 0x42, 0x12, 0xdd, 0x17, 0xf2, 0x5f, 0x05, 0x58, 0x1d, 0xaf, + 0x21, 0x55, 0xd5, 0x13, 0x72, 0x0e, 0x0e, 0x9d, 0xf3, 0xd9, 0xe3, 0xdd, 0xb8, 0x47, 0xc9, 0x79, + 0xe1, 0xa5, 0xe5, 0xbc, 0x78, 0x62, 0x39, 0x3f, 0x73, 0xc2, 0x39, 0xbf, 0xfe, 0x53, 0x11, 0x16, + 0xb6, 0x58, 0x53, 0xfb, 0x1a, 0xc0, 0xf2, 0xc8, 0x77, 0xe5, 0x2d, 0xf3, 0x50, 0x1f, 0xc3, 0xe6, + 0xd8, 0x3b, 0xbc, 0x7a, 0xe7, 0xa8, 0x48, 0x55, 0x6b, 0xdf, 0x02, 0xb8, 0x34, 0xf6, 0x1a, 0xbd, + 0x7d, 0x78, 0xb7, 0xa3, 0xd8, 0x6a, 0xfd, 0xe8, 0x58, 0xb5, 0xa9, 0x2f, 0x01, 0x3c, 0x37, 0xfc, + 0x46, 0xb8, 0x39, 0xc5, 0x31, 0x73, 0x58, 0xf5, 0xfd, 0x23, 0xc1, 0xd4, 0x2e, 0xbe, 0x03, 0xb0, + 0x32, 0x7e, 0xaf, 0xbe, 0x37, 0xb5, 0xd3, 0x1c, 0x5c, 0x5d, 0x3f, 0x06, 0x38, 0xdb, 0x57, 0xfd, + 0xd3, 0xa7, 0x7b, 0x35, 0xf0, 0x6c, 0xaf, 0x06, 0xfe, 0xd8, 0xab, 0x81, 0x27, 0xfb, 0xb5, 0x99, + 0x67, 0xfb, 0xb5, 0x99, 0xdf, 0xf6, 0x6b, 0x33, 0x0f, 0xea, 0x43, 0xad, 0x27, 0x03, 0xad, 0xb5, + 0xbd, 0x06, 0xcb, 0x04, 0x6b, 0xc7, 0xbe, 0x69, 0x3d, 0xfe, 0xc7, 0xff, 0xcd, 0x24, 0xad, 0xd9, + 0x98, 0x4b, 0x4b, 0xff, 0xc6, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x73, 0x5a, 0x90, 0x5a, 0xca, + 0x11, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1207,6 +1361,150 @@ func (m *MsgCollectIncentivesResponse) MarshalToSizedBuffer(dAtA []byte) (int, e return len(dAtA) - i, nil } +func (m *MsgCreateIncentive) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateIncentive) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateIncentive) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + n6, err6 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MinUptime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime):]) + if err6 != nil { + return 0, err6 + } + i -= n6 + i = encodeVarintTx(dAtA, i, uint64(n6)) + i-- + dAtA[i] = 0x3a + n7, err7 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + if err7 != nil { + return 0, err7 + } + i -= n7 + i = encodeVarintTx(dAtA, i, uint64(n7)) + i-- + dAtA[i] = 0x32 + { + size := m.EmissionRate.Size() + i -= size + if _, err := m.EmissionRate.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + { + size := m.IncentiveAmount.Size() + i -= size + if _, err := m.IncentiveAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + if len(m.IncentiveDenom) > 0 { + i -= len(m.IncentiveDenom) + copy(dAtA[i:], m.IncentiveDenom) + i = encodeVarintTx(dAtA, i, uint64(len(m.IncentiveDenom))) + i-- + dAtA[i] = 0x1a + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0x12 + } + if m.PoolId != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MsgCreateIncentiveResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateIncentiveResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateIncentiveResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + n8, err8 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MinUptime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime):]) + if err8 != nil { + return 0, err8 + } + i -= n8 + i = encodeVarintTx(dAtA, i, uint64(n8)) + i-- + dAtA[i] = 0x2a + n9, err9 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + if err9 != nil { + return 0, err9 + } + i -= n9 + i = encodeVarintTx(dAtA, i, uint64(n9)) + i-- + dAtA[i] = 0x22 + { + size := m.EmissionRate.Size() + i -= size + if _, err := m.EmissionRate.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size := m.IncentiveAmount.Size() + i -= size + if _, err := m.IncentiveAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.IncentiveDenom) > 0 { + i -= len(m.IncentiveDenom) + copy(dAtA[i:], m.IncentiveDenom) + i = encodeVarintTx(dAtA, i, uint64(len(m.IncentiveDenom))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -1380,6 +1678,55 @@ func (m *MsgCollectIncentivesResponse) Size() (n int) { return n } +func (m *MsgCreateIncentive) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PoolId != 0 { + n += 1 + sovTx(uint64(m.PoolId)) + } + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.IncentiveDenom) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.IncentiveAmount.Size() + n += 1 + l + sovTx(uint64(l)) + l = m.EmissionRate.Size() + n += 1 + l + sovTx(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) + n += 1 + l + sovTx(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime) + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgCreateIncentiveResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.IncentiveDenom) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.IncentiveAmount.Size() + n += 1 + l + sovTx(uint64(l)) + l = m.EmissionRate.Size() + n += 1 + l + sovTx(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) + n += 1 + l + sovTx(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime) + n += 1 + l + sovTx(uint64(l)) + return n +} + func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -2647,6 +2994,489 @@ func (m *MsgCollectIncentivesResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgCreateIncentive) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCreateIncentive: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateIncentive: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IncentiveDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IncentiveDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IncentiveAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.IncentiveAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EmissionRate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.EmissionRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinUptime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.MinUptime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateIncentiveResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCreateIncentiveResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateIncentiveResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IncentiveDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IncentiveDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IncentiveAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.IncentiveAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EmissionRate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.EmissionRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinUptime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.MinUptime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 From 580a7ca2fa551ecb6cce4c2c0ea9dc4e4e487798 Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 6 Mar 2023 09:52:02 -0800 Subject: [PATCH 122/136] cli and codec --- x/concentrated-liquidity/client/cli/tx.go | 11 +++++++ x/concentrated-liquidity/incentives.go | 2 ++ x/concentrated-liquidity/incentives_test.go | 4 +++ x/concentrated-liquidity/types/codec.go | 2 ++ x/concentrated-liquidity/types/errors.go | 9 ++++++ x/concentrated-liquidity/types/msgs.go | 33 +++++++++++++++++++++ 6 files changed, 61 insertions(+) diff --git a/x/concentrated-liquidity/client/cli/tx.go b/x/concentrated-liquidity/client/cli/tx.go index 6b677673bf7..9c917ac5ebe 100644 --- a/x/concentrated-liquidity/client/cli/tx.go +++ b/x/concentrated-liquidity/client/cli/tx.go @@ -17,6 +17,7 @@ func NewTxCmd() *cobra.Command { osmocli.AddTxCmd(txCmd, NewCreateConcentratedPoolCmd) osmocli.AddTxCmd(txCmd, NewCollectFeesCmd) osmocli.AddTxCmd(txCmd, NewCollectIncentivesCmd) + osmocli.AddTxCmd(txCmd, NewCreateIncentiveCmd) return txCmd } @@ -71,3 +72,13 @@ func NewCollectIncentivesCmd() (*osmocli.TxCliDesc, *types.MsgCollectIncentives) Flags: osmocli.FlagDesc{RequiredFlags: []*flag.FlagSet{FlagSetJustPoolId()}}, }, &types.MsgCollectIncentives{} } + +func NewCreateIncentiveCmd() (*osmocli.TxCliDesc, *types.MsgCreateIncentive) { + return &osmocli.TxCliDesc{ + Use: "create-incentive [incentive-denom] [incentive-amount] [emission-rate] [start-time] [min-uptime]", + Short: "create an incentive record to emit incentives (per second) to a given pool", + Example: "create-incentive uosmo 69082 0.02 100 2023-03-03 03:20:35.419543805 24h --pool-id 1 --from val --chain-id osmosis-1", + CustomFlagOverrides: poolIdFlagOverride, + Flags: osmocli.FlagDesc{RequiredFlags: []*flag.FlagSet{FlagSetJustPoolId()}}, + }, &types.MsgCreateIncentive{} +} diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 52be8ceabf7..fb90af0dbee 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -508,6 +508,8 @@ func (k Keeper) createIncentive(ctx sdk.Context, poolId uint64, sender sdk.AccAd return types.IncentiveRecord{}, err } + // TODO: check nonpositive incentive amount (error NonPositiveIncentiveAmount) + // Ensure start time is >= current blocktime if startTime.Before(ctx.BlockTime()) { return types.IncentiveRecord{}, types.StartTimeTooEarly{PoolId: poolId, CurrentBlockTime: ctx.BlockTime(), StartTime: startTime} diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index f26f8379c85..da3d68fc407 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -2854,6 +2854,10 @@ func (s *KeeperTestSuite) TestCreateIncentive() { expectedError: types.IncentiveInsufficientBalance{PoolId: 1, IncentiveDenom: incentiveRecordOne.IncentiveDenom, IncentiveAmount: incentiveRecordOne.RemainingAmount.Ceil().RoundInt()}, }, + + // zero incentive amount + + // negative incentive amount } for name, tc := range tests { diff --git a/x/concentrated-liquidity/types/codec.go b/x/concentrated-liquidity/types/codec.go index 1995c427ca2..4fcd39c916f 100644 --- a/x/concentrated-liquidity/types/codec.go +++ b/x/concentrated-liquidity/types/codec.go @@ -14,6 +14,7 @@ func RegisterCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&MsgWithdrawPosition{}, "osmosis/cl-withdraw-position", nil) cdc.RegisterConcrete(&MsgCollectFees{}, "osmosis/cl-collect-fees", nil) cdc.RegisterConcrete(&MsgCollectIncentives{}, "osmosis/cl-collect-incentives", nil) + cdc.RegisterConcrete(&MsgCreateIncentive{}, "osmosis/cl-create-incentive", nil) } func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { @@ -28,6 +29,7 @@ func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { &MsgWithdrawPosition{}, &MsgCollectFees{}, &MsgCollectIncentives{}, + &MsgCreateIncentive{}, ) msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) diff --git a/x/concentrated-liquidity/types/errors.go b/x/concentrated-liquidity/types/errors.go index 15e9976c30c..723d7d08399 100644 --- a/x/concentrated-liquidity/types/errors.go +++ b/x/concentrated-liquidity/types/errors.go @@ -263,6 +263,15 @@ func (e IncentiveInsufficientBalance) Error() string { return fmt.Sprintf("sender has insufficient balance to create this incentive record. Pool id (%d), incentive denom (%s), incentive amount needed (%s)", e.PoolId, e.IncentiveDenom, e.IncentiveAmount) } +type NonPositiveIncentiveAmount struct { + PoolId uint64 + IncentiveAmount sdk.Dec +} + +func (e NonPositiveIncentiveAmount) Error() string { + return fmt.Sprintf("incentive amount must be position (nonzero and nonnegative). Pool id (%d), incentive amount (%s)", e.PoolId, e.IncentiveAmount) +} + type NonPositiveEmissionRate struct { PoolId uint64 EmissionRate sdk.Dec diff --git a/x/concentrated-liquidity/types/msgs.go b/x/concentrated-liquidity/types/msgs.go index c55451ee91d..74d85588424 100644 --- a/x/concentrated-liquidity/types/msgs.go +++ b/x/concentrated-liquidity/types/msgs.go @@ -157,3 +157,36 @@ func (msg MsgCollectIncentives) GetSigners() []sdk.AccAddress { } return []sdk.AccAddress{sender} } + +var _ sdk.Msg = &MsgCreateIncentive{} + +func (msg MsgCreateIncentive) Route() string { return RouterKey } +func (msg MsgCreateIncentive) Type() string { return TypeMsgCollectIncentives } +func (msg MsgCreateIncentive) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + return fmt.Errorf("Invalid sender address (%s)", err) + } + + if !msg.IncentiveAmount.IsPositive() { + return NonPositiveIncentiveAmount{PoolId: msg.PoolId, IncentiveAmount: msg.IncentiveAmount.ToDec()} + } + + if !msg.EmissionRate.IsPositive() { + return NonPositiveEmissionRate{PoolId: msg.PoolId, EmissionRate: msg.EmissionRate} + } + + return nil +} + +func (msg MsgCreateIncentive) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +func (msg MsgCreateIncentive) GetSigners() []sdk.AccAddress { + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + return []sdk.AccAddress{sender} +} From 21268bacd26ff2568c7b828fb1503176ca755dff Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 6 Mar 2023 10:00:43 -0800 Subject: [PATCH 123/136] add check and related tests --- x/concentrated-liquidity/incentives.go | 5 ++- x/concentrated-liquidity/incentives_test.go | 36 ++++++++++++++++++--- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index fb90af0dbee..253873020e7 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -508,7 +508,10 @@ func (k Keeper) createIncentive(ctx sdk.Context, poolId uint64, sender sdk.AccAd return types.IncentiveRecord{}, err } - // TODO: check nonpositive incentive amount (error NonPositiveIncentiveAmount) + // Ensure incentive amount is nonzero and nonnegative + if !incentiveAmount.IsPositive() { + return types.IncentiveRecord{}, types.NonPositiveIncentiveAmount{PoolId: poolId, IncentiveAmount: incentiveAmount.ToDec()} + } // Ensure start time is >= current blocktime if startTime.Before(ctx.BlockTime()) { diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index da3d68fc407..3cf34818d6f 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -223,6 +223,12 @@ func withDenom(record types.IncentiveRecord, denom string) types.IncentiveRecord return record } +func withAmount(record types.IncentiveRecord, amount sdk.Dec) types.IncentiveRecord { + record.RemainingAmount = amount + + return record +} + func withStartTime(record types.IncentiveRecord, startTime time.Time) types.IncentiveRecord { record.StartTime = startTime @@ -2794,6 +2800,32 @@ func (s *KeeperTestSuite) TestCreateIncentive() { expectedError: types.PoolNotFoundError{PoolId: 2}, }, + "zero incentive amount": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + sdk.ZeroInt(), + ), + ), + recordToSet: withAmount(incentiveRecordOne, sdk.ZeroDec()), + + expectedError: types.NonPositiveIncentiveAmount{PoolId: 1, IncentiveAmount: sdk.ZeroDec()}, + }, + "negative incentive amount": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + sdk.ZeroInt(), + ), + ), + recordToSet: withAmount(incentiveRecordOne, sdk.NewDec(-1)), + + expectedError: types.NonPositiveIncentiveAmount{PoolId: 1, IncentiveAmount: sdk.NewDec(-1)}, + }, "start time too early": { poolId: defaultPoolId, sender: s.TestAccs[0], @@ -2854,10 +2886,6 @@ func (s *KeeperTestSuite) TestCreateIncentive() { expectedError: types.IncentiveInsufficientBalance{PoolId: 1, IncentiveDenom: incentiveRecordOne.IncentiveDenom, IncentiveAmount: incentiveRecordOne.RemainingAmount.Ceil().RoundInt()}, }, - - // zero incentive amount - - // negative incentive amount } for name, tc := range tests { From c8633441fb7f1ba4af3411113a7d3b8710341dd4 Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 6 Mar 2023 10:18:51 -0800 Subject: [PATCH 124/136] add further tests and lint --- x/concentrated-liquidity/incentives.go | 27 +++-- x/concentrated-liquidity/incentives_test.go | 118 +++++++++++++------- x/concentrated-liquidity/msg_server.go | 9 +- x/concentrated-liquidity/types/errors.go | 36 +++--- x/concentrated-liquidity/types/events.go | 36 +++--- x/concentrated-liquidity/types/msgs.go | 4 +- 6 files changed, 138 insertions(+), 92 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 253873020e7..94d3b0d815e 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -510,17 +510,17 @@ func (k Keeper) createIncentive(ctx sdk.Context, poolId uint64, sender sdk.AccAd // Ensure incentive amount is nonzero and nonnegative if !incentiveAmount.IsPositive() { - return types.IncentiveRecord{}, types.NonPositiveIncentiveAmount{PoolId: poolId, IncentiveAmount: incentiveAmount.ToDec()} + return types.IncentiveRecord{}, types.NonPositiveIncentiveAmountError{PoolId: poolId, IncentiveAmount: incentiveAmount.ToDec()} } // Ensure start time is >= current blocktime if startTime.Before(ctx.BlockTime()) { - return types.IncentiveRecord{}, types.StartTimeTooEarly{PoolId: poolId, CurrentBlockTime: ctx.BlockTime(), StartTime: startTime} + return types.IncentiveRecord{}, types.StartTimeTooEarlyError{PoolId: poolId, CurrentBlockTime: ctx.BlockTime(), StartTime: startTime} } // Ensure emission rate is nonzero and nonnegative if !emissionRate.IsPositive() { - return types.IncentiveRecord{}, types.NonPositiveEmissionRate{PoolId: poolId, EmissionRate: emissionRate} + return types.IncentiveRecord{}, types.NonPositiveEmissionRateError{PoolId: poolId, EmissionRate: emissionRate} } // Ensure min uptime is one of the supported periods @@ -531,27 +531,30 @@ func (k Keeper) createIncentive(ctx sdk.Context, poolId uint64, sender sdk.AccAd } } if !validUptime { - return types.IncentiveRecord{}, types.InvalidMinUptime{PoolId: poolId, MinUptime: minUptime, SupportedUptimes: types.SupportedUptimes} + return types.IncentiveRecord{}, types.InvalidMinUptimeError{PoolId: poolId, MinUptime: minUptime, SupportedUptimes: types.SupportedUptimes} } // Ensure sender has balance for incentive denom incentiveCoin := sdk.NewCoin(incentiveDenom, incentiveAmount) senderHasBalance := k.bankKeeper.HasBalance(ctx, sender, incentiveCoin) if !senderHasBalance { - return types.IncentiveRecord{}, types.IncentiveInsufficientBalance{PoolId: poolId, IncentiveDenom: incentiveDenom, IncentiveAmount: incentiveAmount} + return types.IncentiveRecord{}, types.IncentiveInsufficientBalanceError{PoolId: poolId, IncentiveDenom: incentiveDenom, IncentiveAmount: incentiveAmount} } - + // Sync global uptime accumulators to current blocktime to ensure consistency in reward emissions - k.updateUptimeAccumulatorsToNow(ctx, poolId) + err = k.updateUptimeAccumulatorsToNow(ctx, poolId) + if err != nil { + return types.IncentiveRecord{}, err + } // Set up incentive record to put in state incentiveRecord := types.IncentiveRecord{ - PoolId: poolId, - IncentiveDenom: incentiveDenom, + PoolId: poolId, + IncentiveDenom: incentiveDenom, RemainingAmount: incentiveAmount.ToDec(), - EmissionRate: emissionRate, - StartTime: startTime, - MinUptime: minUptime, + EmissionRate: emissionRate, + StartTime: startTime, + MinUptime: minUptime, } // Set incentive record in state diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 3cf34818d6f..a05f648a0a8 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -2762,18 +2762,19 @@ func (s *KeeperTestSuite) TestCollectIncentives() { func (s *KeeperTestSuite) TestCreateIncentive() { type testCreateIncentive struct { - poolId uint64 - isInvalidPoolId bool - sender sdk.AccAddress - senderBalance sdk.Coins - recordToSet types.IncentiveRecord - - expectedError error + poolId uint64 + isInvalidPoolId bool + sender sdk.AccAddress + senderBalance sdk.Coins + recordToSet types.IncentiveRecord + existingRecords []types.IncentiveRecord + + expectedError error } tests := map[string]testCreateIncentive{ "valid incentive record": { - poolId: defaultPoolId, - sender: s.TestAccs[0], + poolId: defaultPoolId, + sender: s.TestAccs[0], senderBalance: sdk.NewCoins( sdk.NewCoin( incentiveRecordOne.IncentiveDenom, @@ -2782,14 +2783,47 @@ func (s *KeeperTestSuite) TestCreateIncentive() { ), recordToSet: incentiveRecordOne, }, + "record with different denom, emission rate, and min uptime": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordTwo.IncentiveDenom, + incentiveRecordTwo.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: incentiveRecordTwo, + }, + "record with different start time": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: withStartTime(incentiveRecordOne, defaultStartTime.Add(time.Hour)), + }, + "record with different incentive amount": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + sdk.NewInt(8), + ), + ), + recordToSet: withAmount(incentiveRecordOne, sdk.NewDec(8)), + }, // Error catching "pool doesn't exist": { isInvalidPoolId: true, - poolId: defaultPoolId, - sender: s.TestAccs[0], + poolId: defaultPoolId, + sender: s.TestAccs[0], senderBalance: sdk.NewCoins( sdk.NewCoin( incentiveRecordOne.IncentiveDenom, @@ -2801,8 +2835,8 @@ func (s *KeeperTestSuite) TestCreateIncentive() { expectedError: types.PoolNotFoundError{PoolId: 2}, }, "zero incentive amount": { - poolId: defaultPoolId, - sender: s.TestAccs[0], + poolId: defaultPoolId, + sender: s.TestAccs[0], senderBalance: sdk.NewCoins( sdk.NewCoin( incentiveRecordOne.IncentiveDenom, @@ -2811,11 +2845,11 @@ func (s *KeeperTestSuite) TestCreateIncentive() { ), recordToSet: withAmount(incentiveRecordOne, sdk.ZeroDec()), - expectedError: types.NonPositiveIncentiveAmount{PoolId: 1, IncentiveAmount: sdk.ZeroDec()}, + expectedError: types.NonPositiveIncentiveAmountError{PoolId: 1, IncentiveAmount: sdk.ZeroDec()}, }, "negative incentive amount": { - poolId: defaultPoolId, - sender: s.TestAccs[0], + poolId: defaultPoolId, + sender: s.TestAccs[0], senderBalance: sdk.NewCoins( sdk.NewCoin( incentiveRecordOne.IncentiveDenom, @@ -2824,11 +2858,11 @@ func (s *KeeperTestSuite) TestCreateIncentive() { ), recordToSet: withAmount(incentiveRecordOne, sdk.NewDec(-1)), - expectedError: types.NonPositiveIncentiveAmount{PoolId: 1, IncentiveAmount: sdk.NewDec(-1)}, + expectedError: types.NonPositiveIncentiveAmountError{PoolId: 1, IncentiveAmount: sdk.NewDec(-1)}, }, "start time too early": { - poolId: defaultPoolId, - sender: s.TestAccs[0], + poolId: defaultPoolId, + sender: s.TestAccs[0], senderBalance: sdk.NewCoins( sdk.NewCoin( incentiveRecordOne.IncentiveDenom, @@ -2837,11 +2871,11 @@ func (s *KeeperTestSuite) TestCreateIncentive() { ), recordToSet: withStartTime(incentiveRecordOne, defaultBlockTime.Add(-1*time.Second)), - expectedError: types.StartTimeTooEarly{PoolId: 1, CurrentBlockTime: defaultBlockTime, StartTime: defaultBlockTime.Add(-1*time.Second)}, + expectedError: types.StartTimeTooEarlyError{PoolId: 1, CurrentBlockTime: defaultBlockTime, StartTime: defaultBlockTime.Add(-1 * time.Second)}, }, "zero emission rate": { - poolId: defaultPoolId, - sender: s.TestAccs[0], + poolId: defaultPoolId, + sender: s.TestAccs[0], senderBalance: sdk.NewCoins( sdk.NewCoin( incentiveRecordOne.IncentiveDenom, @@ -2850,11 +2884,11 @@ func (s *KeeperTestSuite) TestCreateIncentive() { ), recordToSet: withEmissionRate(incentiveRecordOne, sdk.ZeroDec()), - expectedError: types.NonPositiveEmissionRate{PoolId: 1, EmissionRate: sdk.ZeroDec()}, + expectedError: types.NonPositiveEmissionRateError{PoolId: 1, EmissionRate: sdk.ZeroDec()}, }, "negative emission rate": { - poolId: defaultPoolId, - sender: s.TestAccs[0], + poolId: defaultPoolId, + sender: s.TestAccs[0], senderBalance: sdk.NewCoins( sdk.NewCoin( incentiveRecordOne.IncentiveDenom, @@ -2863,28 +2897,28 @@ func (s *KeeperTestSuite) TestCreateIncentive() { ), recordToSet: withEmissionRate(incentiveRecordOne, sdk.NewDec(-1)), - expectedError: types.NonPositiveEmissionRate{PoolId: 1, EmissionRate: sdk.NewDec(-1)}, + expectedError: types.NonPositiveEmissionRateError{PoolId: 1, EmissionRate: sdk.NewDec(-1)}, }, "unsupported min uptime": { - poolId: defaultPoolId, - sender: s.TestAccs[0], + poolId: defaultPoolId, + sender: s.TestAccs[0], senderBalance: sdk.NewCoins( sdk.NewCoin( incentiveRecordOne.IncentiveDenom, incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), ), ), - recordToSet: withMinUptime(incentiveRecordOne, time.Hour * 3), + recordToSet: withMinUptime(incentiveRecordOne, time.Hour*3), - expectedError: types.InvalidMinUptime{PoolId: 1, MinUptime: time.Hour * 3, SupportedUptimes: types.SupportedUptimes}, + expectedError: types.InvalidMinUptimeError{PoolId: 1, MinUptime: time.Hour * 3, SupportedUptimes: types.SupportedUptimes}, }, "insufficient sender balance": { - poolId: defaultPoolId, - sender: s.TestAccs[0], + poolId: defaultPoolId, + sender: s.TestAccs[0], senderBalance: sdk.NewCoins(), - recordToSet: incentiveRecordOne, + recordToSet: incentiveRecordOne, - expectedError: types.IncentiveInsufficientBalance{PoolId: 1, IncentiveDenom: incentiveRecordOne.IncentiveDenom, IncentiveAmount: incentiveRecordOne.RemainingAmount.Ceil().RoundInt()}, + expectedError: types.IncentiveInsufficientBalanceError{PoolId: 1, IncentiveDenom: incentiveRecordOne.IncentiveDenom, IncentiveAmount: incentiveRecordOne.RemainingAmount.Ceil().RoundInt()}, }, } @@ -2900,15 +2934,17 @@ func (s *KeeperTestSuite) TestCreateIncentive() { clKeeper := s.App.ConcentratedLiquidityKeeper s.FundAcc(tc.sender, tc.senderBalance) - // TODO: add existing records to ensure records aren't wiped - if tc.isInvalidPoolId { tc.poolId = tc.poolId + 1 } + if tc.existingRecords != nil { + clKeeper.SetMultipleIncentiveRecords(s.Ctx, tc.existingRecords) + } + // system under test - incentiveRecord, err := clKeeper.CreateIncentive(s.Ctx, tc.poolId, tc.sender, tc.recordToSet.IncentiveDenom, tc.recordToSet.RemainingAmount.RoundInt(), tc.recordToSet.EmissionRate, tc.recordToSet.StartTime, tc.recordToSet.MinUptime) + incentiveRecord, err := clKeeper.CreateIncentive(s.Ctx, tc.poolId, tc.sender, tc.recordToSet.IncentiveDenom, tc.recordToSet.RemainingAmount.Ceil().RoundInt(), tc.recordToSet.EmissionRate, tc.recordToSet.StartTime, tc.recordToSet.MinUptime) // Assertions @@ -2930,6 +2966,12 @@ func (s *KeeperTestSuite) TestCreateIncentive() { recordInState, err := clKeeper.GetIncentiveRecord(s.Ctx, tc.poolId, tc.recordToSet.IncentiveDenom, tc.recordToSet.MinUptime) s.Require().Equal(tc.recordToSet, recordInState) s.Require().Equal(tc.recordToSet, incentiveRecord) + + // Ensure that existing records aren't affected + for _, incentiveRecord := range tc.existingRecords { + _, err := clKeeper.GetIncentiveRecord(s.Ctx, tc.poolId, incentiveRecord.IncentiveDenom, incentiveRecord.MinUptime) + s.Require().NoError(err) + } }) } -} \ No newline at end of file +} diff --git a/x/concentrated-liquidity/msg_server.go b/x/concentrated-liquidity/msg_server.go index a1e1af8a55a..c05fb50f794 100644 --- a/x/concentrated-liquidity/msg_server.go +++ b/x/concentrated-liquidity/msg_server.go @@ -228,9 +228,10 @@ func (server msgServer) CreateIncentive(goCtx context.Context, msg *types.MsgCre }) return &types.MsgCreateIncentiveResponse{ - IncentiveDenom: incentiveRecord.IncentiveDenom, + IncentiveDenom: incentiveRecord.IncentiveDenom, IncentiveAmount: incentiveRecord.RemainingAmount, - EmissionRate: incentiveRecord.EmissionRate, - StartTime: incentiveRecord.StartTime, - MinUptime: incentiveRecord.MinUptime}, nil + EmissionRate: incentiveRecord.EmissionRate, + StartTime: incentiveRecord.StartTime, + MinUptime: incentiveRecord.MinUptime, + }, nil } diff --git a/x/concentrated-liquidity/types/errors.go b/x/concentrated-liquidity/types/errors.go index 723d7d08399..15685988d66 100644 --- a/x/concentrated-liquidity/types/errors.go +++ b/x/concentrated-liquidity/types/errors.go @@ -243,51 +243,51 @@ func (e IncentiveRecordNotFoundError) Error() string { return fmt.Sprintf("incentive record not found. pool id (%d), incentive denom (%s), minimum uptime (%s)", e.PoolId, e.IncentiveDenom, e.MinUptime.String()) } -type StartTimeTooEarly struct { - PoolId uint64 +type StartTimeTooEarlyError struct { + PoolId uint64 CurrentBlockTime time.Time - StartTime time.Time + StartTime time.Time } -func (e StartTimeTooEarly) Error() string { +func (e StartTimeTooEarlyError) Error() string { return fmt.Sprintf("start time cannot be before current blocktime. Pool id (%d), current blocktime (%s), start time (%s)", e.PoolId, e.CurrentBlockTime.String(), e.StartTime.String()) } -type IncentiveInsufficientBalance struct { - PoolId uint64 - IncentiveDenom string +type IncentiveInsufficientBalanceError struct { + PoolId uint64 + IncentiveDenom string IncentiveAmount sdk.Int } -func (e IncentiveInsufficientBalance) Error() string { +func (e IncentiveInsufficientBalanceError) Error() string { return fmt.Sprintf("sender has insufficient balance to create this incentive record. Pool id (%d), incentive denom (%s), incentive amount needed (%s)", e.PoolId, e.IncentiveDenom, e.IncentiveAmount) } -type NonPositiveIncentiveAmount struct { - PoolId uint64 +type NonPositiveIncentiveAmountError struct { + PoolId uint64 IncentiveAmount sdk.Dec } -func (e NonPositiveIncentiveAmount) Error() string { +func (e NonPositiveIncentiveAmountError) Error() string { return fmt.Sprintf("incentive amount must be position (nonzero and nonnegative). Pool id (%d), incentive amount (%s)", e.PoolId, e.IncentiveAmount) } -type NonPositiveEmissionRate struct { - PoolId uint64 +type NonPositiveEmissionRateError struct { + PoolId uint64 EmissionRate sdk.Dec } -func (e NonPositiveEmissionRate) Error() string { +func (e NonPositiveEmissionRateError) Error() string { return fmt.Sprintf("emission rate must be position (nonzero and nonnegative). Pool id (%d), emission rate (%s)", e.PoolId, e.EmissionRate) } -type InvalidMinUptime struct { - PoolId uint64 - MinUptime time.Duration +type InvalidMinUptimeError struct { + PoolId uint64 + MinUptime time.Duration SupportedUptimes []time.Duration } -func (e InvalidMinUptime) Error() string { +func (e InvalidMinUptimeError) Error() string { return fmt.Sprintf("attempted to create an incentive record with an unsupported minimum uptime. Pool id (%d), specified min uptime (%s), supported uptimes (%s)", e.PoolId, e.MinUptime, e.SupportedUptimes) } diff --git a/x/concentrated-liquidity/types/events.go b/x/concentrated-liquidity/types/events.go index 904ea182f28..502b97cf4ce 100644 --- a/x/concentrated-liquidity/types/events.go +++ b/x/concentrated-liquidity/types/events.go @@ -7,23 +7,23 @@ const ( TypeEvtCollectIncentives = "collect_incentives" TypeEvtCreateIncentive = "create_incentive" - AttributeValueCategory = ModuleName - AttributeKeyPoolId = "pool_id" - AttributeAmount0 = "amount0" - AttributeAmount1 = "amount1" - AttributeKeySwapFee = "swap_fee" - AttributeKeyTokensIn = "tokens_in" - AttributeKeyTokensOut = "tokens_out" - AttributeLiquidity = "liquidity" - AttributeLowerTick = "lower_tick" - AttributeUpperTick = "upper_tick" - AttributeIncentiveDenom = "incentive_denom" - AttributeIncentiveAmount = "incentive_amount" + AttributeValueCategory = ModuleName + AttributeKeyPoolId = "pool_id" + AttributeAmount0 = "amount0" + AttributeAmount1 = "amount1" + AttributeKeySwapFee = "swap_fee" + AttributeKeyTokensIn = "tokens_in" + AttributeKeyTokensOut = "tokens_out" + AttributeLiquidity = "liquidity" + AttributeLowerTick = "lower_tick" + AttributeUpperTick = "upper_tick" + AttributeIncentiveDenom = "incentive_denom" + AttributeIncentiveAmount = "incentive_amount" AttributeIncentiveEmissionRate = "incentive_emission_rate" - AttributeIncentiveStartTime = "incentive_start_time" - AttributeIncentiveMinUptime = "incentive_min_uptime" - TypeEvtPoolJoined = "pool_joined" - TypeEvtPoolExited = "pool_exited" - TypeEvtPoolCreated = "pool_created" - TypeEvtTokenSwapped = "token_swapped" + AttributeIncentiveStartTime = "incentive_start_time" + AttributeIncentiveMinUptime = "incentive_min_uptime" + TypeEvtPoolJoined = "pool_joined" + TypeEvtPoolExited = "pool_exited" + TypeEvtPoolCreated = "pool_created" + TypeEvtTokenSwapped = "token_swapped" ) diff --git a/x/concentrated-liquidity/types/msgs.go b/x/concentrated-liquidity/types/msgs.go index 74d85588424..6625b9626cc 100644 --- a/x/concentrated-liquidity/types/msgs.go +++ b/x/concentrated-liquidity/types/msgs.go @@ -169,11 +169,11 @@ func (msg MsgCreateIncentive) ValidateBasic() error { } if !msg.IncentiveAmount.IsPositive() { - return NonPositiveIncentiveAmount{PoolId: msg.PoolId, IncentiveAmount: msg.IncentiveAmount.ToDec()} + return NonPositiveIncentiveAmountError{PoolId: msg.PoolId, IncentiveAmount: msg.IncentiveAmount.ToDec()} } if !msg.EmissionRate.IsPositive() { - return NonPositiveEmissionRate{PoolId: msg.PoolId, EmissionRate: msg.EmissionRate} + return NonPositiveEmissionRateError{PoolId: msg.PoolId, EmissionRate: msg.EmissionRate} } return nil From a8c6d4c4a4f3134bd1e3d21404d8d8d177385301 Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 6 Mar 2023 10:22:40 -0800 Subject: [PATCH 125/136] add test case for existing incentive records --- x/concentrated-liquidity/incentives_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index a05f648a0a8..c1c95e50614 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -2816,6 +2816,18 @@ func (s *KeeperTestSuite) TestCreateIncentive() { ), recordToSet: withAmount(incentiveRecordOne, sdk.NewDec(8)), }, + "existing incentive records": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: incentiveRecordOne, + existingRecords: []types.IncentiveRecord{incentiveRecordTwo, incentiveRecordThree}, + }, // Error catching From 8d03bfa4240c82b469c17a043558ea3e103caf36 Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 6 Mar 2023 14:18:50 -0800 Subject: [PATCH 126/136] pull relevant changes into new branch --- x/concentrated-liquidity/export_test.go | 8 + x/concentrated-liquidity/fees.go | 27 +-- x/concentrated-liquidity/incentives.go | 116 +++++++----- x/concentrated-liquidity/incentives_test.go | 193 ++++++++++++++++++-- x/concentrated-liquidity/lp.go | 10 +- x/concentrated-liquidity/lp_test.go | 34 ++-- x/concentrated-liquidity/types/errors.go | 8 - 7 files changed, 278 insertions(+), 118 deletions(-) diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index e90060dd432..599896616d0 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -239,3 +239,11 @@ func GetUptimeTrackerValues(uptimeTrackers []model.UptimeTracker) []sdk.DecCoins func (k Keeper) CreateIncentive(ctx sdk.Context, poolId uint64, sender sdk.AccAddress, incentiveDenom string, incentiveAmount sdk.Int, emissionRate sdk.Dec, startTime time.Time, minUptime time.Duration) (types.IncentiveRecord, error) { return k.createIncentive(ctx, poolId, sender, incentiveDenom, incentiveAmount, emissionRate, startTime, minUptime) } + +func PrepareAccumAndClaimRewards(accum accum.AccumulatorObject, positionKey string, growthOutside sdk.DecCoins) (sdk.Coins, error) { + return prepareAccumAndClaimRewards(accum, positionKey, growthOutside) +} + +func (k Keeper) ClaimAllIncentivesForPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, position *model.Position, lowerTick int64, upperTick int64, forfeitIncentives bool) (sdk.Coins, error) { + return k.claimAllIncentivesForPosition(ctx, poolId, owner, position, lowerTick, upperTick, forfeitIncentives) +} diff --git a/x/concentrated-liquidity/fees.go b/x/concentrated-liquidity/fees.go index 0657d340648..1e710e8dbf8 100644 --- a/x/concentrated-liquidity/fees.go +++ b/x/concentrated-liquidity/fees.go @@ -17,9 +17,7 @@ const ( uintBase = 10 ) -var ( - emptyCoins = sdk.DecCoins(nil) -) +var emptyCoins = sdk.DecCoins(nil) // createFeeAccumulator creates an accumulator object in the store using the given poolId. // The accumulator is initialized with the default(zero) values. @@ -216,32 +214,11 @@ func (k Keeper) collectFees(ctx sdk.Context, poolId uint64, owner sdk.AccAddress return sdk.Coins{}, err } - // replace position's accumulator before calculating unclaimed rewards - err = preparePositionAccumulator(feeAccumulator, positionKey, feeGrowthOutside) - if err != nil { - return sdk.Coins{}, err - } - - // claim fees. - feesClaimed, err := feeAccumulator.ClaimRewards(positionKey) - if err != nil { - return sdk.Coins{}, err - } - - // Check if feeAccumulator was deleted after claiming rewards. If not, we update the custom accumulator value. - hasPosition, err = feeAccumulator.HasPosition(positionKey) + feesClaimed, err := prepareAccumAndClaimRewards(feeAccumulator, positionKey, feeGrowthOutside) if err != nil { return sdk.Coins{}, err } - if hasPosition { - customAccumulatorValue := feeAccumulator.GetValue().Sub(feeGrowthOutside) - err := feeAccumulator.SetPositionCustomAcc(positionKey, customAccumulatorValue) - if err != nil { - return sdk.Coins{}, err - } - } - // Once we have iterated through all the positions, we do a single bank send from the pool to the owner. pool, err := k.getPoolById(ctx, poolId) if err != nil { diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 94d3b0d815e..61e7ac8ff03 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -416,74 +416,102 @@ func (k Keeper) initOrUpdatePositionUptime(ctx sdk.Context, poolId uint64, posit return nil } -// collectIncentives collects incentives for all uptime accumulators for all positions belonging to `owner` that have exactly -// the same lower and upper ticks. -// -// Upon successful collection, it bank sends the incentives from the pool address to the owner and returns the collected coins. -// Returns error if: -// - pool with the given id does not exist -// - no position given by pool id, owner, lower tick and upper tick exists -// - other internal database or math errors. -func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64) (sdk.Coins, error) { - uptimeAccumulators, err := k.getUptimeAccumulators(ctx, poolId) +// prepareAccumAndClaimRewards claims and returns the rewards that `positionKey` is entitled to, updating the accumulator's value before +// and after claiming to ensure that rewards are never overdistributed. +func prepareAccumAndClaimRewards(accum accum.AccumulatorObject, positionKey string, growthOutside sdk.DecCoins) (sdk.Coins, error) { + err := preparePositionAccumulator(accum, positionKey, growthOutside) if err != nil { return sdk.Coins{}, err } - positionsInRange, err := k.getAllPositionsWithVaryingFreezeTimes(ctx, poolId, owner, lowerTick, upperTick) + // Claim incentives + incentivesClaimedCurrAccum, err := accum.ClaimRewards(positionKey) if err != nil { return sdk.Coins{}, err } - if len(positionsInRange) == 0 { - return sdk.Coins{}, types.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick} + // Check if position record was deleted after claiming rewards. If not, we update the custom accumulator value. + hasPosition, err := accum.HasPosition(positionKey) + if err != nil { + return sdk.Coins{}, err } + if hasPosition { + customAccumulatorValue := accum.GetValue().Sub(growthOutside) + err := accum.SetPositionCustomAcc(positionKey, customAccumulatorValue) + if err != nil { + return sdk.Coins{}, err + } + } + + return incentivesClaimedCurrAccum, nil +} + +// claimAllIncentivesForPosition claims and returns all the incentives for a given position. +// It takes in a `forfeitIncentives` boolean to indicate whether the accrued incentives should be forfeited, in which case it +// redeposits the accrued rewards back into the accumulator as additional rewards for other participants. +func (k Keeper) claimAllIncentivesForPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, position *model.Position, lowerTick int64, upperTick int64, forfeitIncentives bool) (sdk.Coins, error) { + uptimeAccumulators, err := k.getUptimeAccumulators(ctx, poolId) + if err != nil { + return sdk.Coins{}, err + } + // Compute uptime growth outside of the range between lower tick and upper tick uptimeGrowthOutside, err := k.GetUptimeGrowthOutsideRange(ctx, poolId, lowerTick, upperTick) if err != nil { return sdk.Coins{}, err } - collectedIncentives := sdk.Coins(nil) - for _, position := range positionsInRange { - positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, position.JoinTime, position.FreezeDuration)) - collectedIncentivesForPosition := sdk.Coins(nil) + positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, position.JoinTime, position.FreezeDuration)) + collectedIncentivesForPosition := sdk.Coins(nil) + for uptimeIndex, uptimeAccum := range uptimeAccumulators { + hasPosition, err := uptimeAccum.HasPosition(positionName) + if err != nil { + return sdk.Coins{}, err + } - for uptimeIndex, uptimeAccum := range uptimeAccumulators { - hasPosition, err := uptimeAccum.HasPosition(positionName) + if hasPosition { + collectedIncentivesForUptime, err := prepareAccumAndClaimRewards(uptimeAccum, positionName, uptimeGrowthOutside[uptimeIndex]) if err != nil { return sdk.Coins{}, err } - if hasPosition { - // Replace position's accumulator before calculating unclaimed rewards - err = preparePositionAccumulator(uptimeAccum, positionName, uptimeGrowthOutside[uptimeIndex]) - if err != nil { - return sdk.Coins{}, err - } + // If the collected incentives are forfeited, we deposit them back into the accumulator to be distributed + // to other qualifying positions. + if forfeitIncentives { + uptimeAccum.AddToAccumulator(sdk.NewDecCoinsFromCoins(collectedIncentivesForUptime...)) + } - // Claim incentives - incentivesClaimedCurrAccum, err := uptimeAccum.ClaimRewards(positionName) - if err != nil { - return sdk.Coins{}, err - } - collectedIncentivesForPosition = collectedIncentivesForPosition.Add(incentivesClaimedCurrAccum...) + collectedIncentivesForPosition = collectedIncentivesForPosition.Add(collectedIncentivesForUptime...) + } + } - // Check if position record was deleted after claiming rewards. If not, we update the custom accumulator value. - hasPosition, err = uptimeAccum.HasPosition(positionName) - if err != nil { - return sdk.Coins{}, err - } + return collectedIncentivesForPosition, nil +} - if hasPosition { - customAccumulatorValue := uptimeAccum.GetValue().Sub(uptimeGrowthOutside[uptimeIndex]) - err := uptimeAccum.SetPositionCustomAcc(positionName, customAccumulatorValue) - if err != nil { - return sdk.Coins{}, err - } - } - } +// collectIncentives collects incentives for all uptime accumulators for all positions belonging to `owner` that have exactly +// the same lower and upper ticks. +// +// Upon successful collection, it bank sends the incentives from the pool address to the owner and returns the collected coins. +// Returns error if: +// - pool with the given id does not exist +// - no position given by pool id, owner, lower tick and upper tick exists +// - other internal database or math errors. +func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccAddress, lowerTick int64, upperTick int64) (sdk.Coins, error) { + positionsInRange, err := k.getAllPositionsWithVaryingFreezeTimes(ctx, poolId, owner, lowerTick, upperTick) + if err != nil { + return sdk.Coins{}, err + } + + if len(positionsInRange) == 0 { + return sdk.Coins{}, types.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick} + } + + collectedIncentives := sdk.Coins(nil) + for _, position := range positionsInRange { + collectedIncentivesForPosition, err := k.claimAllIncentivesForPosition(ctx, poolId, owner, &position, lowerTick, upperTick, false) + if err != nil { + return sdk.Coins{}, err } collectedIncentives = collectedIncentives.Add(collectedIncentivesForPosition...) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index c1c95e50614..e22295cae8e 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -6,6 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/osmosis-labs/osmosis/osmoutils" "github.com/osmosis-labs/osmosis/osmoutils/accum" cl "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity" "github.com/osmosis-labs/osmosis/v15/x/concentrated-liquidity/model" @@ -2636,24 +2637,6 @@ func (s *KeeperTestSuite) TestCollectIncentives() { // Error catching - "accumulator does not exist": { - isInvalidPoolIdGiven: true, - - currentTick: 1, - positionParams: positionParameters{ - owner: ownerWithValidPosition, - lowerTick: 0, - upperTick: 2, - liquidity: DefaultLiquidityAmt, - joinTime: defaultJoinTime, - freezeDuration: oneDayFreeze, - collectTime: defaultJoinTime.Add(100), - }, - numPositions: 1, - - expectedIncentivesClaimed: sdk.Coins{}, - expectedError: accum.AccumDoesNotExistError{AccumName: "uptime/2/0"}, - }, "position does not exist": { currentTick: 1, positionParams: positionParameters{ @@ -2825,7 +2808,7 @@ func (s *KeeperTestSuite) TestCreateIncentive() { incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), ), ), - recordToSet: incentiveRecordOne, + recordToSet: incentiveRecordOne, existingRecords: []types.IncentiveRecord{incentiveRecordTwo, incentiveRecordThree}, }, @@ -2987,3 +2970,175 @@ func (s *KeeperTestSuite) TestCreateIncentive() { }) } } + +func (s *KeeperTestSuite) TestPrepareAccumAndClaimRewards() { + validPositionKey := cl.FormatPositionAccumulatorKey(defaultPoolId, s.TestAccs[0], DefaultLowerTick, DefaultUpperTick) + invalidPositionKey := cl.FormatPositionAccumulatorKey(defaultPoolId+1, s.TestAccs[0], DefaultLowerTick, DefaultUpperTick+1) + tests := map[string]struct { + poolId uint64 + growthInside sdk.DecCoins + growthOutside sdk.DecCoins + invalidPositionKey bool + expectError error + }{ + "happy path": { + growthInside: oneEthCoins.Add(oneEthCoins...), + growthOutside: oneEthCoins, + }, + "error: non existent position": { + growthOutside: oneEthCoins, + invalidPositionKey: true, + expectError: accum.NoPositionError{Name: invalidPositionKey}, + }, + } + for name, tc := range tests { + tc := tc + s.Run(name, func() { + // Setup test env. + s.SetupTest() + s.PrepareConcentratedPool() + clKeeper := s.App.ConcentratedLiquidityKeeper + + poolFeeAccumulator, err := clKeeper.GetFeeAccumulator(s.Ctx, defaultPoolId) + s.Require().NoError(err) + positionKey := validPositionKey + + // Initialize position accumulator. + err = poolFeeAccumulator.NewPositionCustomAcc(positionKey, sdk.OneDec(), sdk.DecCoins{}, nil) + s.Require().NoError(err) + + // Record the initial position accumulator value. + positionPre, err := accum.GetPosition(poolFeeAccumulator, positionKey) + s.Require().NoError(err) + + // If the test case requires an invalid position key, set it. + if tc.invalidPositionKey { + positionKey = invalidPositionKey + } + + poolFeeAccumulator.AddToAccumulator(tc.growthOutside.Add(tc.growthInside...)) + + // System under test. + amountClaimed, err := cl.PrepareAccumAndClaimRewards(poolFeeAccumulator, positionKey, tc.growthOutside) + + if tc.expectError != nil { + s.Require().Error(err) + s.Require().ErrorIs(err, tc.expectError) + return + } + s.Require().NoError(err) + + // We expect claimed rewards to be equal to growth inside + expectedCoins := sdk.NormalizeCoins(tc.growthInside) + s.Require().Equal(expectedCoins, amountClaimed) + + // Record the final position accumulator value. + positionPost, err := accum.GetPosition(poolFeeAccumulator, positionKey) + s.Require().NoError(err) + + // Check that the difference between the new and old position accumulator values is equal to the growth inside (since + // we recalibrate the position accum value after claiming). + positionAccumDelta := positionPost.InitAccumValue.Sub(positionPre.InitAccumValue) + s.Require().Equal(tc.growthInside, positionAccumDelta) + }) + } +} + +// Note that the non-forfeit cases are thoroughly tested in `TestCollectIncentives` +func (s *KeeperTestSuite) TestClaimAllIncentives() { + uptimeHelper := getExpectedUptimes() + defaultSender := s.TestAccs[0] + tests := map[string]struct { + name string + poolId uint64 + growthInside []sdk.DecCoins + growthOutside []sdk.DecCoins + forfeitIncentives bool + expectError error + }{ + "happy path: claim rewards without forfeiting": { + growthInside: uptimeHelper.hundredTokensMultiDenom, + growthOutside: uptimeHelper.twoHundredTokensMultiDenom, + }, + "claim and forfeit rewards": { + growthInside: uptimeHelper.hundredTokensMultiDenom, + growthOutside: uptimeHelper.twoHundredTokensMultiDenom, + forfeitIncentives: true, + }, + "claim and forfeit rewards when no rewards have accrued": { + forfeitIncentives: true, + }, + "claim and forfeit rewards with varying amounts and different denoms": { + growthInside: uptimeHelper.varyingTokensMultiDenom, + growthOutside: uptimeHelper.varyingTokensSingleDenom, + forfeitIncentives: true, + }, + } + for _, tc := range tests { + tc := tc + s.Run(tc.name, func() { + // Setup test env. + s.SetupTest() + clPool := s.PrepareConcentratedPool() + clKeeper := s.App.ConcentratedLiquidityKeeper + + // Initialize position. + err := clKeeper.InitOrUpdatePosition(s.Ctx, validPoolId, defaultSender, DefaultLowerTick, DefaultUpperTick, sdk.OneDec(), s.Ctx.BlockTime(), time.Hour*24*14) + s.Require().NoError(err) + + clPool.SetCurrentTick(DefaultCurrTick) + if tc.growthOutside != nil { + s.addUptimeGrowthOutsideRange(s.Ctx, validPoolId, defaultSender, DefaultCurrTick.Int64(), DefaultLowerTick, DefaultUpperTick, tc.growthOutside) + } + + if tc.growthInside != nil { + s.addUptimeGrowthInsideRange(s.Ctx, validPoolId, defaultSender, DefaultCurrTick.Int64(), DefaultLowerTick, DefaultUpperTick, tc.growthInside) + } + + err = clKeeper.SetPool(s.Ctx, clPool) + s.Require().NoError(err) + + // Store initial accum values for comparison later + initUptimeAccumValues, err := clKeeper.GetUptimeAccumulatorValues(s.Ctx, validPoolId) + s.Require().NoError(err) + + // Get newly created position to pass into sut function + position, err := clKeeper.GetPosition(s.Ctx, validPoolId, defaultSender, DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime(), time.Hour*24*14) + + // System under test. + amountClaimed, err := clKeeper.ClaimAllIncentivesForPosition(s.Ctx, validPoolId, defaultSender, position, DefaultLowerTick, DefaultUpperTick, tc.forfeitIncentives) + + if tc.expectError != nil { + s.Require().Error(err) + s.Require().ErrorIs(err, tc.expectError) + return + } + s.Require().NoError(err) + + // We expect claimed rewards to be equal to growth inside + expectedCoins := sdk.Coins(nil) + for _, growthInside := range tc.growthInside { + expectedCoins = expectedCoins.Add(sdk.NormalizeCoins(growthInside)...) + } + s.Require().Equal(expectedCoins, amountClaimed) + + // Ensure that forfeited incentives were properly added to their respective accumulators + if tc.forfeitIncentives { + newUptimeAccumValues, err := clKeeper.GetUptimeAccumulatorValues(s.Ctx, validPoolId) + s.Require().NoError(err) + + // Subtract the initial accum values to get the delta + uptimeAccumDeltaValues, err := osmoutils.SubDecCoinArrays(newUptimeAccumValues, initUptimeAccumValues) + s.Require().NoError(err) + + // Convert DecCoins to Coins by truncation for comparison + normalizedUptimeAccumDelta := sdk.NewCoins() + for _, uptimeAccumDelta := range uptimeAccumDeltaValues { + normalizedUptimeAccumDelta = normalizedUptimeAccumDelta.Add(sdk.NormalizeCoins(uptimeAccumDelta)...) + } + + s.Require().Equal(normalizedUptimeAccumDelta, amountClaimed) + } + }) + } +} diff --git a/x/concentrated-liquidity/lp.go b/x/concentrated-liquidity/lp.go index 91a43d925ab..a3c7612e127 100644 --- a/x/concentrated-liquidity/lp.go +++ b/x/concentrated-liquidity/lp.go @@ -127,12 +127,12 @@ func (k Keeper) withdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAd return sdk.Int{}, sdk.Int{}, err } - // Check if position is still frozen - // TODO: consider replacing this check with ClaimIncentives and distributing rewards back into the accumulator if BlockTime < frozenUntil - // if (joinTime + freezeDuration) is more than (currentBlockTime) the position is still frozen. - // Note: JoinTime is set to currentBlockTime when a user creates or updates position. + // If the position is still frozen, claim and forfeit any accrued incentives for the position. if joinTime.Add(position.FreezeDuration).After(ctx.BlockTime()) { - return sdk.Int{}, sdk.Int{}, types.PositionStillFrozenError{FreezeDuration: position.FreezeDuration} + _, err := k.claimAllIncentivesForPosition(ctx, poolId, owner, position, lowerTick, upperTick, true) + if err != nil { + return sdk.Int{}, sdk.Int{}, err + } } // Check if the requested liquidity amount to withdraw is less than or equal to the available liquidity for the position. diff --git a/x/concentrated-liquidity/lp_test.go b/x/concentrated-liquidity/lp_test.go index 9b60b6ce136..36a821462d2 100644 --- a/x/concentrated-liquidity/lp_test.go +++ b/x/concentrated-liquidity/lp_test.go @@ -325,49 +325,50 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { amount1Expected: baseCase.amount1Expected.QuoRaw(2), // 2500 usdc }, }, - "error: no position created": { + "position still unfreezing": { // setup parameters for creation a pool and position. - setupConfig: baseCase, + setupConfig: &frozenBaseCase, // system under test parameters // for withdrawing a position. sutConfigOverwrite: &lpTest{ - lowerTick: -1, // valid tick at which no position exists - expectedError: types.PositionNotFoundError{PoolId: 1, LowerTick: -1, UpperTick: 315000, JoinTime: defaultJoinTime, FreezeDuration: DefaultFreezeDuration}, + amount0Expected: baseCase.amount0Expected, // 0.998976 eth + amount1Expected: baseCase.amount1Expected, // 5000 usdc }, }, - "error: no position created (position exists but wrong freeze duration value)": { + "withdraw liquidity that is still frozen": { // setup parameters for creation a pool and position. - setupConfig: baseCase, + setupConfig: &frozenBaseCase, // system under test parameters // for withdrawing a position. sutConfigOverwrite: &lpTest{ - freezeDuration: DefaultFreezeDuration, - expectedError: types.PositionNotFoundError{PoolId: 1, LowerTick: 305450, UpperTick: 315000, JoinTime: defaultJoinTime, FreezeDuration: DefaultFreezeDuration}, + amount0Expected: baseCase.amount0Expected, // 0.998976 eth + amount1Expected: baseCase.amount1Expected, // 5000 usdc }, - createPositionFreezeOverwrite: true, }, - "error: position still unfreezing": { + "error: no position created": { // setup parameters for creation a pool and position. - setupConfig: &frozenBaseCase, + setupConfig: baseCase, // system under test parameters // for withdrawing a position. sutConfigOverwrite: &lpTest{ - freezeDuration: DefaultFreezeDuration, - expectedError: types.PositionStillFrozenError{FreezeDuration: DefaultFreezeDuration}, + lowerTick: -1, // valid tick at which no position exists + expectedError: types.PositionNotFoundError{PoolId: 1, LowerTick: -1, UpperTick: 315000, JoinTime: defaultJoinTime, FreezeDuration: DefaultFreezeDuration}, }, }, - "error: withdraw liquidity that is still frozen": { + "error: no position created (position exists but wrong freeze duration value)": { // setup parameters for creation a pool and position. - setupConfig: &frozenBaseCase, + setupConfig: baseCase, // system under test parameters // for withdrawing a position. sutConfigOverwrite: &lpTest{ - expectedError: types.PositionStillFrozenError{FreezeDuration: DefaultFreezeDuration}, + freezeDuration: DefaultFreezeDuration, + expectedError: types.PositionNotFoundError{PoolId: 1, LowerTick: 305450, UpperTick: 315000, JoinTime: defaultJoinTime, FreezeDuration: DefaultFreezeDuration}, }, + createPositionFreezeOverwrite: true, }, "error: pool id for pool that does not exist": { // setup parameters for creating a pool and position. @@ -958,7 +959,6 @@ func (s *KeeperTestSuite) TestinitializeInitialPositionForPool() { } else { s.Require().NoError(err) } - }) } } diff --git a/x/concentrated-liquidity/types/errors.go b/x/concentrated-liquidity/types/errors.go index 15685988d66..550fb8e9e58 100644 --- a/x/concentrated-liquidity/types/errors.go +++ b/x/concentrated-liquidity/types/errors.go @@ -225,14 +225,6 @@ func (e InvalidSwapFeeError) Error() string { return fmt.Sprintf("invalid swap fee(%s), must be in [0, 1) range", e.ActualFee) } -type PositionStillFrozenError struct { - FreezeDuration time.Duration -} - -func (e PositionStillFrozenError) Error() string { - return fmt.Sprintf("position is still under freeze duration %s", e.FreezeDuration) -} - type IncentiveRecordNotFoundError struct { PoolId uint64 IncentiveDenom string From 3d882b69c05169b433e9bbec360608630891c820 Mon Sep 17 00:00:00 2001 From: alpo Date: Mon, 6 Mar 2023 14:22:29 -0800 Subject: [PATCH 127/136] lint --- x/concentrated-liquidity/incentives.go | 4 ++-- x/concentrated-liquidity/incentives_test.go | 24 ++++++++++----------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 61e7ac8ff03..3b223efc5c4 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -455,7 +455,7 @@ func (k Keeper) claimAllIncentivesForPosition(ctx sdk.Context, poolId uint64, ow if err != nil { return sdk.Coins{}, err } - + // Compute uptime growth outside of the range between lower tick and upper tick uptimeGrowthOutside, err := k.GetUptimeGrowthOutsideRange(ctx, poolId, lowerTick, upperTick) if err != nil { @@ -506,7 +506,7 @@ func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA if len(positionsInRange) == 0 { return sdk.Coins{}, types.PositionNotFoundError{PoolId: poolId, LowerTick: lowerTick, UpperTick: upperTick} } - + collectedIncentives := sdk.Coins(nil) for _, position := range positionsInRange { collectedIncentivesForPosition, err := k.claimAllIncentivesForPosition(ctx, poolId, owner, &position, lowerTick, upperTick, false) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index e22295cae8e..60b147059a4 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -3049,28 +3049,28 @@ func (s *KeeperTestSuite) TestClaimAllIncentives() { uptimeHelper := getExpectedUptimes() defaultSender := s.TestAccs[0] tests := map[string]struct { - name string - poolId uint64 - growthInside []sdk.DecCoins - growthOutside []sdk.DecCoins + name string + poolId uint64 + growthInside []sdk.DecCoins + growthOutside []sdk.DecCoins forfeitIncentives bool - expectError error + expectError error }{ "happy path: claim rewards without forfeiting": { - growthInside: uptimeHelper.hundredTokensMultiDenom, - growthOutside: uptimeHelper.twoHundredTokensMultiDenom, + growthInside: uptimeHelper.hundredTokensMultiDenom, + growthOutside: uptimeHelper.twoHundredTokensMultiDenom, }, "claim and forfeit rewards": { - growthInside: uptimeHelper.hundredTokensMultiDenom, - growthOutside: uptimeHelper.twoHundredTokensMultiDenom, + growthInside: uptimeHelper.hundredTokensMultiDenom, + growthOutside: uptimeHelper.twoHundredTokensMultiDenom, forfeitIncentives: true, }, "claim and forfeit rewards when no rewards have accrued": { forfeitIncentives: true, }, "claim and forfeit rewards with varying amounts and different denoms": { - growthInside: uptimeHelper.varyingTokensMultiDenom, - growthOutside: uptimeHelper.varyingTokensSingleDenom, + growthInside: uptimeHelper.varyingTokensMultiDenom, + growthOutside: uptimeHelper.varyingTokensSingleDenom, forfeitIncentives: true, }, } @@ -3094,7 +3094,7 @@ func (s *KeeperTestSuite) TestClaimAllIncentives() { if tc.growthInside != nil { s.addUptimeGrowthInsideRange(s.Ctx, validPoolId, defaultSender, DefaultCurrTick.Int64(), DefaultLowerTick, DefaultUpperTick, tc.growthInside) } - + err = clKeeper.SetPool(s.Ctx, clPool) s.Require().NoError(err) From c28338a4486e4d27bfd9bc84da352fd708926f94 Mon Sep 17 00:00:00 2001 From: alpo <62043214+AlpinYukseloglu@users.noreply.github.com> Date: Fri, 10 Mar 2023 10:38:38 -0800 Subject: [PATCH 128/136] minor test comment updates Co-authored-by: Roman --- x/concentrated-liquidity/incentives_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 37f4ec83b61..8d185726ac1 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -1976,7 +1976,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the - // uptimes the position qualifies for. + // uptimes the position qualifies for. At the same time, growth outside does not affect the current position's incentive rewards. expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze, defaultMultiplier), }, "(lower < curr < upper) no uptime growth inside or outside range, 1W freeze duration": { @@ -2044,7 +2044,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the - // uptimes the position qualifies for. + // uptimes the position qualifies for. At the same time, growth outside does not affect the current position's incentive rewards. expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze, defaultMultiplier), }, "(lower < curr < upper) no uptime growth inside or outside range, no freeze": { @@ -2184,7 +2184,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the - // uptimes the position qualifies for. + // uptimes the position qualifies for. At the same time, growth outside does not affect the current position's incentive rewards. expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze, defaultMultiplier), }, "(curr < lower < upper) no uptime growth inside or outside range, 1W freeze duration": { @@ -2253,7 +2253,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the - // uptimes the position qualifies for. + // uptimes the position qualifies for. At the same time, growth outside does not affect the current position's incentive rewards. expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneWeekFreeze, defaultMultiplier), }, "(curr < lower < upper) no uptime growth inside or outside range, no freeze": { @@ -2393,7 +2393,7 @@ func (s *KeeperTestSuite) TestCollectIncentives() { numPositions: 1, // Since there is no other existing liquidity, we expect all of the growth inside to accrue to be claimed for the - // uptimes the position qualifies for. + // uptimes the position qualifies for. At the same time, growth outside does not affect the current position's incentive rewards. expectedIncentivesClaimed: expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, oneDayFreeze, defaultMultiplier), }, "(lower < upper < curr) no uptime growth inside or outside range, 1W freeze duration": { From 2ab16101c0d1e3a544d885218df9ec01dd79bad6 Mon Sep 17 00:00:00 2001 From: alpo <62043214+AlpinYukseloglu@users.noreply.github.com> Date: Fri, 10 Mar 2023 10:39:29 -0800 Subject: [PATCH 129/136] godoc update Co-authored-by: Roman --- x/concentrated-liquidity/msg_server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/msg_server.go b/x/concentrated-liquidity/msg_server.go index 247deda52fe..e5e03be57eb 100644 --- a/x/concentrated-liquidity/msg_server.go +++ b/x/concentrated-liquidity/msg_server.go @@ -161,7 +161,7 @@ func (server msgServer) CollectFees(goCtx context.Context, msg *types.MsgCollect return &types.MsgCollectFeesResponse{CollectedFees: collectedFees}, nil } -// Note: collects incentives for all positions in given range that belong to sender +// CollectIncentives collects incentives for all positions in given range that belong to sender func (server msgServer) CollectIncentives(goCtx context.Context, msg *types.MsgCollectIncentives) (*types.MsgCollectIncentivesResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) From a4afed17f1ca86584336cfadff81ae84c83110fd Mon Sep 17 00:00:00 2001 From: alpo Date: Fri, 10 Mar 2023 11:38:01 -0800 Subject: [PATCH 130/136] expand withdraw tests to better include incentives logic --- x/concentrated-liquidity/lp_test.go | 16 +++++++++++++--- x/concentrated-liquidity/simulation/sim_msgs.go | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/x/concentrated-liquidity/lp_test.go b/x/concentrated-liquidity/lp_test.go index 9b60b6ce136..d13e5500ea1 100644 --- a/x/concentrated-liquidity/lp_test.go +++ b/x/concentrated-liquidity/lp_test.go @@ -293,6 +293,8 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { frozenBaseCase := *baseCase frozenBaseCase.freezeDuration = DefaultFreezeDuration defaultJoinTime := s.Ctx.BlockTime() + uptimeHelper := getExpectedUptimes() + defaultUptimeGrowth := uptimeHelper.hundredTokensMultiDenom tests := map[string]struct { setupConfig *lpTest @@ -466,22 +468,30 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { err = concentratedLiquidityKeeper.ChargeFee(ctx, pool.GetId(), globalFeeGrowth) s.Require().NoError(err) + // Add global uptime growth + err = addToUptimeAccums(s.Ctx, pool.GetId(), concentratedLiquidityKeeper, defaultUptimeGrowth) + s.Require().NoError(err) + // Determine the liquidity expected to remain after the withdraw. expectedRemainingLiquidity := liquidityCreated.Sub(config.liquidityAmount) expectedFeesClaimed := sdk.NewCoins() + expectedIncentivesClaimed := sdk.NewCoins() // Set the expected fees claimed to the amount of liquidity created since the global fee growth is 1. // Fund the pool account with the expected fees claimed. if expectedRemainingLiquidity.IsZero() { expectedFeesClaimed = expectedFeesClaimed.Add(sdk.NewCoin(ETH, liquidityCreated.TruncateInt())) s.FundAcc(pool.GetAddress(), expectedFeesClaimed) + + expectedIncentivesClaimed = expectedIncentivesFromUptimeGrowth(defaultUptimeGrowth, liquidityCreated, config.freezeDuration, sdk.OneInt()) + s.FundAcc(pool.GetAddress(), expectedIncentivesClaimed) } // Note the pool and owner balances before collecting fees. poolBalanceBeforeCollect := s.App.BankKeeper.GetAllBalances(ctx, pool.GetAddress()) ownerBalancerBeforeCollect := s.App.BankKeeper.GetAllBalances(ctx, owner) - expectedBalanceDelta := expectedFeesClaimed.Add(sdk.NewCoin(ETH, config.amount0Expected.Abs())).Add(sdk.NewCoin(USDC, config.amount1Expected.Abs())) + expectedBalanceDelta := expectedFeesClaimed.Add(expectedIncentivesClaimed...).Add(sdk.NewCoin(ETH, config.amount0Expected.Abs())).Add(sdk.NewCoin(USDC, config.amount1Expected.Abs())) if tc.setupConfig != &frozenBaseCase { s.Ctx = s.Ctx.WithBlockTime(defaultJoinTime.Add(time.Hour * 24)) @@ -502,8 +512,8 @@ func (s *KeeperTestSuite) TestWithdrawPosition() { s.Require().Equal(config.amount0Expected.String(), amtDenom0.String()) s.Require().Equal(config.amount1Expected.String(), amtDenom1.String()) - // If the remaining liquidity is zero, all fees should be collected and the position should be deleted. - // Check if all fees were collected. + // If the remaining liquidity is zero, all fees and incentives should be collected and the position should be deleted. + // Check if all fees and incentives were collected. poolBalanceAfterCollect := s.App.BankKeeper.GetAllBalances(ctx, pool.GetAddress()) ownerBalancerAfterCollect := s.App.BankKeeper.GetAllBalances(ctx, owner) diff --git a/x/concentrated-liquidity/simulation/sim_msgs.go b/x/concentrated-liquidity/simulation/sim_msgs.go index 9d62e143645..c34cd502e2b 100644 --- a/x/concentrated-liquidity/simulation/sim_msgs.go +++ b/x/concentrated-liquidity/simulation/sim_msgs.go @@ -199,7 +199,7 @@ func RandMsgCollectIncentives(k clkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx s return nil, fmt.Errorf("no sender with denoms %s exists", poolDenoms) } - positions, err := k.GetUserPositions(ctx, sender.Address) + positions, err := k.GetUserPositions(ctx, sender.Address, 0) if err != nil { return nil, fmt.Errorf("position does not exist") } From 663a8d6995771ec5e20787493af5ac3d62e3fa11 Mon Sep 17 00:00:00 2001 From: alpo Date: Fri, 10 Mar 2023 11:52:49 -0800 Subject: [PATCH 131/136] minor optimizations and cleanup from code review --- x/concentrated-liquidity/incentives.go | 11 ++++++----- x/concentrated-liquidity/msg_server_test.go | 7 +++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 281d123893c..bc008210b05 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -445,10 +445,9 @@ func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA return sdk.Coins{}, err } - collectedIncentives := sdk.Coins(nil) + collectedIncentives := sdk.Coins{} for _, position := range positionsInRange { positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, position.JoinTime, position.FreezeDuration)) - collectedIncentivesForPosition := sdk.Coins(nil) for uptimeIndex, uptimeAccum := range uptimeAccumulators { hasPosition, err := uptimeAccum.HasPosition(positionName) @@ -468,7 +467,7 @@ func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA if err != nil { return sdk.Coins{}, err } - collectedIncentivesForPosition = collectedIncentivesForPosition.Add(incentivesClaimedCurrAccum...) + collectedIncentives = collectedIncentives.Add(incentivesClaimedCurrAccum...) // Check if position record was deleted after claiming rewards. If not, we update the custom accumulator value. hasPosition, err = uptimeAccum.HasPosition(positionName) @@ -485,11 +484,13 @@ func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA } } } - - collectedIncentives = collectedIncentives.Add(collectedIncentivesForPosition...) } // Once we have iterated through all the positions, we do a single bank send from the pool to the owner. + // We skip this step if collected incentives are zero. + if collectedIncentives.IsZero() { + return collectedIncentives, nil + } pool, err := k.getPoolById(ctx, poolId) if err != nil { return sdk.Coins{}, err diff --git a/x/concentrated-liquidity/msg_server_test.go b/x/concentrated-liquidity/msg_server_test.go index 7703322a5c6..b45a9f4f17f 100644 --- a/x/concentrated-liquidity/msg_server_test.go +++ b/x/concentrated-liquidity/msg_server_test.go @@ -211,6 +211,7 @@ func (suite *KeeperTestSuite) TestCollectFees_Events() { // TestCollectIncentives_Events tests that events are correctly emitted // when calling CollectIncentives. func (suite *KeeperTestSuite) TestCollectIncentives_Events() { + uptimeHelper := getExpectedUptimes() testcases := map[string]struct { upperTick int64 lowerTick int64 @@ -248,6 +249,11 @@ func (suite *KeeperTestSuite) TestCollectIncentives_Events() { pool := suite.PrepareConcentratedPool() suite.SetupDefaultPosition(pool.GetId()) + // Set up accrued incentives + err := addToUptimeAccums(ctx, pool.GetId(), suite.App.ConcentratedLiquidityKeeper, uptimeHelper.hundredTokensMultiDenom) + suite.Require().NoError(err) + suite.FundAcc(pool.GetAddress(), expectedIncentivesFromUptimeGrowth(uptimeHelper.hundredTokensMultiDenom, DefaultLiquidityAmt, DefaultFreezeDuration, sdk.OneInt())) + msgServer := cl.NewMsgServerImpl(suite.App.ConcentratedLiquidityKeeper) // Reset event counts to 0 by creating a new manager. @@ -272,6 +278,7 @@ func (suite *KeeperTestSuite) TestCollectIncentives_Events() { suite.Require().Error(err) suite.Require().ErrorContains(err, tc.expectedError.Error()) suite.Require().Nil(response) + suite.AssertEventEmitted(ctx, sdk.EventTypeMessage, 0) } // Some validate basic checks are defense in depth so they would normally not be possible to reach From b07e76383f8fca4ea226f4575d16883e06efffa0 Mon Sep 17 00:00:00 2001 From: alpo <62043214+AlpinYukseloglu@users.noreply.github.com> Date: Fri, 10 Mar 2023 15:06:10 -0800 Subject: [PATCH 132/136] [CL Incentives] Implement `CreateIncentive` logic and message (#4519) * draft implementation * begin testing * add more test cases * add error catching test cases * implement createIncentive message * cli and codec * add check and related tests * add further tests and lint * add test case for existing incentive records --- go.work.sum | 2037 +++++++++++++++++ proto/osmosis/concentrated-liquidity/tx.proto | 53 + x/concentrated-liquidity/client/cli/tx.go | 11 + x/concentrated-liquidity/export_test.go | 4 + x/concentrated-liquidity/incentives.go | 67 + x/concentrated-liquidity/incentives_test.go | 248 +- x/concentrated-liquidity/msg_server.go | 41 + x/concentrated-liquidity/types/codec.go | 2 + x/concentrated-liquidity/types/errors.go | 48 + x/concentrated-liquidity/types/events.go | 34 +- .../types/expected_keepers.go | 1 + x/concentrated-liquidity/types/msgs.go | 33 + x/concentrated-liquidity/types/tx.pb.go | 948 +++++++- 13 files changed, 3450 insertions(+), 77 deletions(-) create mode 100644 go.work.sum diff --git a/go.work.sum b/go.work.sum new file mode 100644 index 00000000000..7b55d06630e --- /dev/null +++ b/go.work.sum @@ -0,0 +1,2037 @@ +4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= +bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= +cloud.google.com/go v0.25.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.2/go.mod h1:H8IAquKe2L30IxoupDgqTaQvKSwF/c8prYHynGIWQbA= +cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +code.gitea.io/sdk/gitea v0.12.0/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= +contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= +contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= +contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= +contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= +filippo.io/edwards25519 v1.0.0-beta.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= +github.com/99designs/keyring v1.1.6/go.mod h1:16e0ds7LGQQcT59QqkTg72Hh5ShM51Byv5PEmW6uoRU= +github.com/Abirdcfly/dupword v0.0.7/go.mod h1:K/4M1kj+Zh39d2aotRwypvasonOyAMH1c/IZJzE0dmk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= +github.com/AkihiroSuda/containerd-fuse-overlayfs v1.0.0/go.mod h1:0mMDvQFeLbbn1Wy8P2j3hwFhqBq+FKn8OZPno8WLmp8= +github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v19.1.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v42.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= +github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v10.15.5+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.1.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.10.2/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= +github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= +github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= +github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15-0.20200908182639-5b44b70ab3ab/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.10/go.mod h1:g5uw8EV2mAlzqe94tfNBNdr89fnbD/n3HV0OhsddkmM= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= +github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim v0.9.4/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/Microsoft/hcsshim/test v0.0.0-20200826032352-301c83a30e7c/go.mod h1:30A5igQ91GEmhYJF8TaRP79pMBOYynRsyOByfVV0dU4= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= +github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/apex/log v1.1.4/go.mod h1:AlpoD9aScyQfJDVHmLMEcx4oU6LqzkWp4Mg9GdAcEvQ= +github.com/apex/log v1.3.0/go.mod h1:jd8Vpsr46WAe3EZSQ/IUMs2qQD/GOycT5rPWCO1yGcs= +github.com/apex/logs v0.0.4/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= +github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= +github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= +github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.11/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.90/go.mod h1:es1KtYUFs7le0xQ3rOihkuoVD90z7D0fR2Qm4S00/gU= +github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.31.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= +github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bombsimon/wsl/v2 v2.0.0/go.mod h1:mf25kr/SqFEPhhcxW1+7pxzGlW+hIl/hYTKY95VwV8U= +github.com/bombsimon/wsl/v2 v2.2.0/go.mod h1:Azh8c3XGEJl9LyX0/sFC+CKMc7Ssgua0g+6abzXN4Pg= +github.com/bombsimon/wsl/v3 v3.0.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= +github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= +github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= +github.com/bufbuild/buf v1.9.0/go.mod h1:1Q+rMHiMVcfgScEF/GOldxmu4o9TrQ2sQQh58K6MscE= +github.com/bufbuild/connect-go v1.0.0/go.mod h1:9iNvh/NOsfhNBUH5CtvXeVUskQO1xsrEviH7ZArwZ3I= +github.com/bufbuild/protocompile v0.1.0/go.mod h1:ix/MMMdsT3fzxfw91dvbfzKW3fRRnuPCP47kpAm5m/4= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= +github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= +github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= +github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= +github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/chavacava/garif v0.0.0-20220630083739-93517212f375/go.mod h1:4m1Rv7xfuwWPNKXlThldNuJvutYM6J95wNuuVmn55To= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1-0.20201117152358-0edc412565dc/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= +github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= +github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= +github.com/containerd/containerd v1.6.3-0.20220401172941-5ff8fce1fcc6/go.mod h1:WSt2SnDLAGWlu+Vl+EWay37seZLKqgRt6XLjIMy8SYM= +github.com/containerd/containerd v1.6.8/go.mod h1:By6p5KqPK0/7/CgO/A6t/Gz+CUYUu2zf1hUaaymVXB0= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= +github.com/containerd/continuity v0.2.3-0.20220330195504-d132b287edc8/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fuse-overlayfs-snapshotter v1.0.2/go.mod h1:nRZceC8a7dRm3Ao6cJAwuJWPFiBPaibHiFntRUnzhwU= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.4/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= +github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/stargz-snapshotter v0.0.0-20201027054423-3a04e4c2c116/go.mod h1:o59b3PCKVAf9jjiKtCc/9hLAd+5p/rfhBfm6aBcTEr4= +github.com/containerd/stargz-snapshotter v0.11.3/go.mod h1:2j2EAUyvrLU4D9unYlTIwGhDKQIk74KJ9E71lJsQCVM= +github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= +github.com/containerd/stargz-snapshotter/estargz v0.11.3/go.mod h1:7vRJIcImfY8bpifnMjt+HTJoQxASq7T28MYbP15/Nf0= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= +github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= +github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/ledger-cosmos-go v0.11.1/go.mod h1:J8//BsAGTo3OC/vDLjMRFLW6q0WAaXvHnVc7ZmE8iUY= +github.com/cosmos/ledger-go v0.9.2/go.mod h1:oZJ2hHAZROdlHiwTg4t7kP+GKIIkBT+o6c9QWFanOyI= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cristalhq/acmd v0.8.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/daixiang0/gci v0.8.1/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c= +github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= +github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= +github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/cli v0.0.0-20190925022749-754388324470/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.0-beta1.0.20201029214301-1d20b15adc38+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.13+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.14+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.6.0-rc.1.0.20180327202408-83389a148052+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v0.0.0-20200511152416-a93e9eb0e95c/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20180531152204-71cd53e4a197/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v17.12.0-ce-rc1.0.20200730172259-9f28837c1d93+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.0-beta1.0.20201110211921-af34b94a78a1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.3-0.20211208011758-87521affb077+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libnetwork v0.8.0-dev.2.0.20200917202933-d0951081b35f/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-critic/go-critic v0.4.1/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= +github.com/go-critic/go-critic v0.4.3/go.mod h1:j4O3D4RoIwRqlZw5jJpx0BNfXWWbpcJoKu5cYSe4YmQ= +github.com/go-critic/go-critic v0.6.5/go.mod h1:ezfP/Lh7MA6dBNn4c6ab5ALv3sKnZVLx37tr00uuaOY= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= +github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astcopy v1.0.2/go.mod h1:4TcEdbElGc9twQEYpVo/aieIXfHhiuLh4aLAck6dO7Y= +github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/flock v0.7.3/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v4.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.3.2/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.23.7/go.mod h1:g/38bxfhp4rI7zeWSxcdIeHTQGS58TCak8FYcyCmavQ= +github.com/golangci/golangci-lint v1.27.0/go.mod h1:+eZALfxIuthdrHPtfM7w/R3POJLjHDfJJw8XZl9xOng= +github.com/golangci/golangci-lint v1.50.1/go.mod h1:AQjHBopYS//oB8xs0y0M/dtxdKHkdhl0RvmjUct0/4w= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= +github.com/google/crfs v0.0.0-20191108021818-71d77da419c9/go.mod h1:etGhoOqfwPkooV6aqoX3eBGQOJblqdoc9XvWOeuxpPw= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-containerregistry v0.0.0-20191010200024-a3d713f9b7f8/go.mod h1:KyKXa9ciM8+lgMXwOVsXi7UxGrsf9mM61Mzs+xKUrKE= +github.com/google/go-containerregistry v0.1.2/go.mod h1:GPivBPgdAyd2SU+vf6EpsgOtWDuPqjW0hJZt4rNdTZ4= +github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= +github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= +github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= +github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/gookit/color v1.2.4/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= +github.com/gookit/color v1.5.1/go.mod h1:wZFzea4X8qN6vHOSP2apMb4/+w/orMznEzYsIHPaqKM= +github.com/gookit/color v1.5.2/go.mod h1:w8h4bGiHeeBpvQVePTutdbERIUf3oJE5lZ8HM0UgXyg= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= +github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= +github.com/goreleaser/goreleaser v0.136.0/go.mod h1:wiKrPUeSNh6Wu8nUHxZydSOVQ/OZvOaO7DTtFqie904= +github.com/goreleaser/nfpm v1.2.1/go.mod h1:TtWrABZozuLOttX2uDlYyECfQX7x5XYkVxhjYcR6G9w= +github.com/goreleaser/nfpm v1.3.0/go.mod h1:w0p7Kc9TAUgWMyrub63ex3M2Mgw88M4GZXoTq5UCb40= +github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= +github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= +github.com/hanwen/go-fuse/v2 v2.0.3/go.mod h1:0EQM6aH2ctVpvZ6a+onrQ/vaykxh2GH7hy3e13vzTUY= +github.com/hanwen/go-fuse/v2 v2.1.1-0.20220112183258-f57e95bda82d/go.mod h1:B1nGE/6RBFyBRC1RRnf23UpwCdyJ31eukw34oAKukAc= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= +github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c/go.mod h1:fHzc09UnyJyqyW+bFuq864eh+wC7dj65aXmXLRe5to0= +github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87/go.mod h1:XGsKKeXxeRr95aEOgipvluMPlgjr7dGlk9ZTWOjcUcg= +github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= +github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= +github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/informalsystems/tm-load-test v1.0.0/go.mod h1:WVaSKaQdfZK3v0C74EMzn7//+3aeCZF8wkIKBz2/M74= +github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= +github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= +github.com/jaguilar/vt100 v0.0.0-20150826170717-2703a27b14ea/go.mod h1:QMdK4dGB3YhEW2BmA1wgGpPYI3HZy/5gD705PXKUVSg= +github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= +github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= +github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= +github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= +github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= +github.com/kisielk/errcheck v1.6.2/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= +github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= +github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= +github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= +github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= +github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= +github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/mgechev/revive v1.2.4/go.mod h1:iAWlQishqCuj4yhV24FTnKSXGpbAA+0SckXB8GQMX/Q= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= +github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/buildkit v0.8.1/go.mod h1:/kyU1hKy/aYCuP39GZA9MaKioovHku57N6cqlKZIaiQ= +github.com/moby/buildkit v0.10.4/go.mod h1:Yajz9vt1Zw5q9Pp4pdb3TCSUXJBIroIQGQ3TTs/sLug= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mount v0.1.0/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= +github.com/moby/sys/mount v0.1.1/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= +github.com/moby/sys/mount v0.3.0/go.mod h1:U2Z3ur2rXPFrFmy4q6WMwWrBOAQGYtYTRVM8BIvzbwk= +github.com/moby/sys/mountinfo v0.1.0/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.6.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20200915141129-7f0af18e79f2/go.mod h1:TjQg8pa4iejrUrjiz0MCtMV38jdMNW4doKSiBrEvCQQ= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= +github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= +github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= +github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= +github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= +github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= +github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= +github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/networkplumbing/go-nft v0.2.0/go.mod h1:HnnM+tYvlGAsMU7yoYwXEVLLiDW9gdMmb5HoGcwpuQs= +github.com/nishanths/exhaustive v0.8.3/go.mod h1:qj+zJJUgJ76tR92+25+03oYUhzF4R7/2Wk7fGTfCHmg= +github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= +github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= +github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= +github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= +github.com/onsi/ginkgo/v2 v2.8.0/go.mod h1:6JsQiECmxCa3V5st74AL/AmsV482EDdVrGaVW6z3oYU= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.20.0/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= +github.com/onsi/gomega v1.25.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc10/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runc v1.1.1/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= +github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= +github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= +github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v1.0.5/go.mod h1:APVvOesVSAnne5SClsPxPdfvZTVDojXh1/G3qb5wjGI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= +github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8/go.mod h1:CGFX09Ci3pq9QZdj86B+VGIdNj4VyCo2iPOGS9esB/k= +github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= +github.com/quasilyte/go-ruleguard v0.3.18/go.mod h1:lOIzcYlgxrQ2sGJ735EHXmf/e9MJ516j16K/Ifcttvs= +github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.21/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= +github.com/quasilyte/gogrep v0.0.0-20220828223005-86e4605de09f/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= +github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= +github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= +github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= +github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= +github.com/ryancurrah/gomodguard v1.0.4/go.mod h1:9T/Cfuxs5StfsocWr4WzDL36HqnX0fVb9d5fSEaLhoE= +github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= +github.com/ryancurrah/gomodguard v1.2.4/go.mod h1:+Kem4VjWwvFpUJRJSwa16s1tBJe+vbv02+naTow2f6M= +github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= +github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= +github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= +github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= +github.com/sashamelentyev/usestdlibvars v1.20.0/go.mod h1:0GaP+ecfZMXShS0A94CJn6aEuPRILv8h/VuWI9n1ygg= +github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/securego/gosec v0.0.0-20200103095621-79fbf3af8d83/go.mod h1:vvbZ2Ae7AzSq3/kywjUDxSNq2SJ27RxCz2un0H3ePqE= +github.com/securego/gosec v0.0.0-20200401082031-e946c8c39989/go.mod h1:i9l/TNj+yDFh9SZXUTvspXTjbFXgZGP/UvhU1S65A4A= +github.com/securego/gosec/v2 v2.3.0/go.mod h1:UzeVyUXbxukhLeHKV3VVqo7HdoQR9MrRfFmZYotn8ME= +github.com/securego/gosec/v2 v2.13.1/go.mod h1:EO1sImBMBWFjOTFzMWfTRrZW6M15gm60ljzrmy/wtHo= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= +github.com/shirou/gopsutil/v3 v3.22.9/go.mod h1:bBYl1kjgEJpWpxeHmLI+dVHWtyAwfcmSBLDsp2TNT8A= +github.com/shirou/gopsutil/v3 v3.23.1/go.mod h1:NN6mnm5/0k8jw4cBfCnJtr5L7ErOTg18tMNpgFkn0hA= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sivchari/tenv v1.7.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= +github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= +github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVjBcBGsVmMmak= +github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= +github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= +github.com/tendermint/tm-db v0.6.6/go.mod h1:wP8d49A85B7/erz/r4YbKssKw6ylsO/hKtFk7E1aWZI= +github.com/tetafro/godot v0.3.7/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= +github.com/tetafro/godot v0.4.2/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= +github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= +github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= +github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= +github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= +github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= +github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tomarrell/wrapcheck/v2 v2.7.0/go.mod h1:ao7l5p0aOlUNJKI0qVwB4Yjlqutd0IvAB9Rdwyilxvg= +github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= +github.com/tommy-muehle/go-mnd v1.1.1/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/tonistiigi/fsutil v0.0.0-20201103201449-0834f99b7b85/go.mod h1:a7cilN64dG941IOXfhJhlH0qB92hxJ9A1ewrdUmJ6xo= +github.com/tonistiigi/fsutil v0.0.0-20220115021204-b19f7f9cb274/go.mod h1:oPAfvw32vlUJSjyDcQ3Bu0nb2ON2B+G0dtVN/SZNJiA= +github.com/tonistiigi/go-actions-cache v0.0.0-20220404170428-0bdeb6e1eac7/go.mod h1:qqvyZqkfwkoJuPU/bw61bItaoO0SJ8YSW0vSVRRvsRg= +github.com/tonistiigi/go-archvariant v1.0.0/go.mod h1:TxFmO5VS6vMq2kvs3ht04iPXtu2rUT/erOnGFYfk5Ho= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= +github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= +github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= +github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= +github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= +github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJbreVojo06krnTgaeAz/Z7lynpPk/Q2c= +github.com/vektra/mockery/v2 v2.14.0/go.mod h1:bnD1T8tExSgPD1ripLkDbr60JA9VtQeu12P3wgLZd7M= +github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= +github.com/xanzy/go-gitlab v0.32.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= +go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= +go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= +go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= +go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= +go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A= +go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.29.0/go.mod h1:LsankqVDx4W+RhZNA5uWarULII/MBhF5qwCYxTuyXjs= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.3/go.mod h1:Dts42MGkzZne2yCru741+bFiTMWkIj/LLRizad7b9tw= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.29.0/go.mod h1:vHItvsnJtp7ES++nFLLFBzUWny7fJQSvTlxFcqQGUr4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.29.0/go.mod h1:tLYsuf2v8fZreBVwp9gVMhefZlLFZaUiNVSq8QxXRII= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= +go.opentelemetry.io/otel v1.4.0/go.mod h1:jeAqMFKy2uLIxCtKxoFj0FAL5zAPKQagc3+GtBWakzk= +go.opentelemetry.io/otel v1.4.1/go.mod h1:StM6F/0fSwpd8dKWDCdRr7uRvEPYdW0hBSlbdTiUde4= +go.opentelemetry.io/otel v1.11.0/go.mod h1:H2KtuEphyMvlhZ+F7tg9GRhAOe60moNx61Ex+WmiKkk= +go.opentelemetry.io/otel/exporters/jaeger v1.4.1/go.mod h1:ZW7vkOu9nC1CxsD8bHNHCia5JUbwP39vxgd1q4Z5rCI= +go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.4.1/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.4.1/go.mod h1:o5RW5o2pKpJLD5dNTCmjF1DorYwMeFJmb/rKr5sLaa8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.4.1/go.mod h1:c6E4V3/U+miqjs/8l950wggHGL1qzlp0Ypj9xoGrPqo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.4.1/go.mod h1:VwYo0Hak6Efuy0TXsZs8o1hnV3dHDPNtDbycG0hI8+M= +go.opentelemetry.io/otel/internal/metric v0.27.0/go.mod h1:n1CVxRqKqYZtqyTh9U/onvKapPGv7y/rpyOTI+LFNzw= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v0.27.0/go.mod h1:raXDJ7uP2/Jc0nVZWQjJtzoyssOYWu/+pjZqRzfvZ7g= +go.opentelemetry.io/otel/metric v0.32.3/go.mod h1:pgiGmKohxHyTPHGOff+vrtIH39/R9fiO/WoenUQ3kcc= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= +go.opentelemetry.io/otel/sdk v1.4.1/go.mod h1:NBwHDgDIBYjwK2WNu1OPgsIc2IJzmBXNnvIJxJc8BpE= +go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= +go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= +go.opentelemetry.io/otel/trace v1.4.0/go.mod h1:uc3eRsqDfWs9R7b92xbQbU42/eTNz4N+gLP8qJCi4aE= +go.opentelemetry.io/otel/trace v1.4.1/go.mod h1:iYEVbroFCNut9QkwEczV9vMRPHNKSSwYZjulEtsmhFc= +go.opentelemetry.io/otel/trace v1.11.0/go.mod h1:nyYjis9jy0gytE9LXGU+/m1sHTKbRY0fX0hulNNDP1U= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= +go.opentelemetry.io/proto/otlp v0.12.0/go.mod h1:TsIjwGWIx5VFYv9KGVlOpxoBl5Dy+63SUguV7GGvlSQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= +golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= +golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20221002003631-540bb7301a08/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220726230323-06994584191e/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221017152216-f25eb7ecb193/go.mod h1:RpDiru2p0u2F0lLpEoqnP2+7xs0ifAuOcJ442g6GU2s= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200917073148-efd3b9a0ff20/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201013081832-0aaa2718063a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210313202042-bd2e13477e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211031064116-611d5d643895/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220727055044-e65921a090b8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220919170432-7a66f970e087/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190228203856-589c23e65e65/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200102140908-9497f49d5709/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204192400-7124308813f3/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200331202046-9d5940d49312/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200502202811-ed308ab3e770/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.11-0.20220513221640-090b14e8501f/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.12-0.20220628192153-7743d1d949f1/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.4.1-0.20221208213631-3f74d914ae6d/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.2.0/go.mod h1:IfRCZScioGtypHNTlz3gFk67J8uePVW7uDTBzXuIkhU= +google.golang.org/api v0.3.0/go.mod h1:IuvZyQh8jgscv8qWfQ4ABd8m7hEudgBFM/EdhA3BnXw= +google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.25.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= +google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211101144312-62acf1d99145/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220725144611-272f38e5d71b/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +honnef.co/go/tools v0.3.3/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw= +k8s.io/api v0.0.0-20180904230853-4e7be11eab3f/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= +k8s.io/api v0.17.4/go.mod h1:5qxx6vjmwUVG2nHQTKGlLts8Tbok8PzHl4vHtVFuZCA= +k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= +k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= +k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= +k8s.io/api v0.23.4/go.mod h1:i77F4JfyNNrhOjZF7OwwNJS5Y1S9dpwvb9iYRYRczfI= +k8s.io/apimachinery v0.0.0-20180904193909-def12e63c512/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= +k8s.io/apimachinery v0.17.4/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= +k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= +k8s.io/apimachinery v0.23.4/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= +k8s.io/apiserver v0.17.4/go.mod h1:5ZDQ6Xr5MNBxyi3iUZXS84QOhZl+W7Oq2us/29c0j9I= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= +k8s.io/client-go v0.0.0-20180910083459-2cefa64ff137/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/client-go v0.17.4/go.mod h1:ouF6o5pz3is8qU0/qYL2RnoxOPqgfuidYLowytyLJmc= +k8s.io/client-go v0.19.0/go.mod h1:H9E/VT95blcFQnlyShFgnFT9ZnJOAceiUHM3MlRC+mU= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= +k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= +k8s.io/client-go v0.23.4/go.mod h1:PKnIL4pqLuvYUK1WU7RLTMYKPiIh7MYShLshtRY9cj0= +k8s.io/cloud-provider v0.17.4/go.mod h1:XEjKDzfD+b9MTLXQFlDGkk6Ho8SGMpaU8Uugx/KNK9U= +k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= +k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= +k8s.io/component-base v0.17.4/go.mod h1:5BRqHMbbQPm2kKu35v3G+CpVq4K0RJKC7TRioF0I9lE= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= +k8s.io/cri-api v0.24.0-alpha.3/go.mod h1:c/NLI5Zdyup5+oEYqFO2IE32ptofNiZpS1nL2y51gAg= +k8s.io/csi-translation-lib v0.17.4/go.mod h1:CsxmjwxEI0tTNMzffIAcgR9lX4wOh6AKHdxQrT7L0oo= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= +k8s.io/kubernetes v1.11.10/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuBkhu+yxOc1Js= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= +mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7/go.mod h1:HGC5lll35J70Y5v7vCGb9oLhHoScFwkHDJm/05RdSTc= +mvdan.cc/unparam v0.0.0-20220706161116-678bad134442/go.mod h1:F/Cxw/6mVrNKqrR2YjFf5CaW0Bw4RL8RfbEf4GRggJk= +pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4= diff --git a/proto/osmosis/concentrated-liquidity/tx.proto b/proto/osmosis/concentrated-liquidity/tx.proto index a68f2ab2438..ea8b8e2e8aa 100644 --- a/proto/osmosis/concentrated-liquidity/tx.proto +++ b/proto/osmosis/concentrated-liquidity/tx.proto @@ -132,4 +132,57 @@ message MsgCollectIncentivesResponse { (gogoproto.moretags) = "yaml:\"collected_incentives\"", (gogoproto.nullable) = false ]; +} + +// ===================== MsgCreateIncentive +message MsgCreateIncentive { + uint64 pool_id = 1 [ (gogoproto.moretags) = "yaml:\"pool_id\"" ]; + string sender = 2 [ (gogoproto.moretags) = "yaml:\"sender\"" ]; + string incentive_denom = 3; + string incentive_amount = 4 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", + (gogoproto.moretags) = "yaml:\"incentive_amount\"", + (gogoproto.nullable) = false + ]; + string emission_rate = 5 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.moretags) = "yaml:\"emission_rate\"", + (gogoproto.nullable) = false + ]; + google.protobuf.Timestamp start_time = 6 [ + (gogoproto.nullable) = false, + (gogoproto.stdtime) = true, + (gogoproto.moretags) = "yaml:\"start_time\"" + ]; + google.protobuf.Duration min_uptime = 7 [ + (gogoproto.nullable) = false, + (gogoproto.stdduration) = true, + (gogoproto.jsontag) = "duration,omitempty", + (gogoproto.moretags) = "yaml:\"min_uptime\"" + ]; +} + +message MsgCreateIncentiveResponse { + string incentive_denom = 1; + string incentive_amount = 2 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.moretags) = "yaml:\"incentive_amount\"", + (gogoproto.nullable) = false + ]; + string emission_rate = 3 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.moretags) = "yaml:\"emission_rate\"", + (gogoproto.nullable) = false + ]; + google.protobuf.Timestamp start_time = 4 [ + (gogoproto.nullable) = false, + (gogoproto.stdtime) = true, + (gogoproto.moretags) = "yaml:\"start_time\"" + ]; + google.protobuf.Duration min_uptime = 5 [ + (gogoproto.nullable) = false, + (gogoproto.stdduration) = true, + (gogoproto.jsontag) = "duration,omitempty", + (gogoproto.moretags) = "yaml:\"min_uptime\"" + ]; } \ No newline at end of file diff --git a/x/concentrated-liquidity/client/cli/tx.go b/x/concentrated-liquidity/client/cli/tx.go index 6b677673bf7..9c917ac5ebe 100644 --- a/x/concentrated-liquidity/client/cli/tx.go +++ b/x/concentrated-liquidity/client/cli/tx.go @@ -17,6 +17,7 @@ func NewTxCmd() *cobra.Command { osmocli.AddTxCmd(txCmd, NewCreateConcentratedPoolCmd) osmocli.AddTxCmd(txCmd, NewCollectFeesCmd) osmocli.AddTxCmd(txCmd, NewCollectIncentivesCmd) + osmocli.AddTxCmd(txCmd, NewCreateIncentiveCmd) return txCmd } @@ -71,3 +72,13 @@ func NewCollectIncentivesCmd() (*osmocli.TxCliDesc, *types.MsgCollectIncentives) Flags: osmocli.FlagDesc{RequiredFlags: []*flag.FlagSet{FlagSetJustPoolId()}}, }, &types.MsgCollectIncentives{} } + +func NewCreateIncentiveCmd() (*osmocli.TxCliDesc, *types.MsgCreateIncentive) { + return &osmocli.TxCliDesc{ + Use: "create-incentive [incentive-denom] [incentive-amount] [emission-rate] [start-time] [min-uptime]", + Short: "create an incentive record to emit incentives (per second) to a given pool", + Example: "create-incentive uosmo 69082 0.02 100 2023-03-03 03:20:35.419543805 24h --pool-id 1 --from val --chain-id osmosis-1", + CustomFlagOverrides: poolIdFlagOverride, + Flags: osmocli.FlagDesc{RequiredFlags: []*flag.FlagSet{FlagSetJustPoolId()}}, + }, &types.MsgCreateIncentive{} +} diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index 6840226c49f..3ca2966156d 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -239,3 +239,7 @@ func (k Keeper) CollectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA func GetUptimeTrackerValues(uptimeTrackers []model.UptimeTracker) []sdk.DecCoins { return getUptimeTrackerValues(uptimeTrackers) } + +func (k Keeper) CreateIncentive(ctx sdk.Context, poolId uint64, sender sdk.AccAddress, incentiveDenom string, incentiveAmount sdk.Int, emissionRate sdk.Dec, startTime time.Time, minUptime time.Duration) (types.IncentiveRecord, error) { + return k.createIncentive(ctx, poolId, sender, incentiveDenom, incentiveAmount, emissionRate, startTime, minUptime) +} diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index bc008210b05..4b7f9e679fb 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -501,3 +501,70 @@ func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA } return collectedIncentives, nil } + +// createIncentive creates an incentive record in state for the given pool +func (k Keeper) createIncentive(ctx sdk.Context, poolId uint64, sender sdk.AccAddress, incentiveDenom string, incentiveAmount sdk.Int, emissionRate sdk.Dec, startTime time.Time, minUptime time.Duration) (types.IncentiveRecord, error) { + pool, err := k.getPoolById(ctx, poolId) + if err != nil { + return types.IncentiveRecord{}, err + } + + // Ensure incentive amount is nonzero and nonnegative + if !incentiveAmount.IsPositive() { + return types.IncentiveRecord{}, types.NonPositiveIncentiveAmountError{PoolId: poolId, IncentiveAmount: incentiveAmount.ToDec()} + } + + // Ensure start time is >= current blocktime + if startTime.Before(ctx.BlockTime()) { + return types.IncentiveRecord{}, types.StartTimeTooEarlyError{PoolId: poolId, CurrentBlockTime: ctx.BlockTime(), StartTime: startTime} + } + + // Ensure emission rate is nonzero and nonnegative + if !emissionRate.IsPositive() { + return types.IncentiveRecord{}, types.NonPositiveEmissionRateError{PoolId: poolId, EmissionRate: emissionRate} + } + + // Ensure min uptime is one of the supported periods + validUptime := false + for _, supportedUptime := range types.SupportedUptimes { + if minUptime == supportedUptime { + validUptime = true + } + } + if !validUptime { + return types.IncentiveRecord{}, types.InvalidMinUptimeError{PoolId: poolId, MinUptime: minUptime, SupportedUptimes: types.SupportedUptimes} + } + + // Ensure sender has balance for incentive denom + incentiveCoin := sdk.NewCoin(incentiveDenom, incentiveAmount) + senderHasBalance := k.bankKeeper.HasBalance(ctx, sender, incentiveCoin) + if !senderHasBalance { + return types.IncentiveRecord{}, types.IncentiveInsufficientBalanceError{PoolId: poolId, IncentiveDenom: incentiveDenom, IncentiveAmount: incentiveAmount} + } + + // Sync global uptime accumulators to current blocktime to ensure consistency in reward emissions + err = k.updateUptimeAccumulatorsToNow(ctx, poolId) + if err != nil { + return types.IncentiveRecord{}, err + } + + // Set up incentive record to put in state + incentiveRecord := types.IncentiveRecord{ + PoolId: poolId, + IncentiveDenom: incentiveDenom, + RemainingAmount: incentiveAmount.ToDec(), + EmissionRate: emissionRate, + StartTime: startTime, + MinUptime: minUptime, + } + + // Set incentive record in state + k.setIncentiveRecord(ctx, incentiveRecord) + + // Transfer tokens from sender to pool balance + if err := k.bankKeeper.SendCoins(ctx, sender, pool.GetAddress(), sdk.NewCoins(incentiveCoin)); err != nil { + return types.IncentiveRecord{}, err + } + + return incentiveRecord, nil +} diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 8d185726ac1..88549cd5c85 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -37,7 +37,7 @@ var ( testEmissionThree = sdk.MustNewDecFromStr("165.4") testEmissionFour = sdk.MustNewDecFromStr("57.93") - defaultBlockTime = time.Unix(0, 0).UTC() + defaultBlockTime = time.Unix(1, 1).UTC() defaultTimeBuffer = time.Hour defaultStartTime = defaultBlockTime.Add(defaultTimeBuffer) @@ -223,14 +223,26 @@ func withDenom(record types.IncentiveRecord, denom string) types.IncentiveRecord return record } +func withAmount(record types.IncentiveRecord, amount sdk.Dec) types.IncentiveRecord { + record.RemainingAmount = amount + + return record +} + func withStartTime(record types.IncentiveRecord, startTime time.Time) types.IncentiveRecord { record.StartTime = startTime return record } -func withMinUpTimeTime(record types.IncentiveRecord, minUpTime time.Duration) types.IncentiveRecord { - record.MinUptime = minUpTime +func withMinUptime(record types.IncentiveRecord, minUptime time.Duration) types.IncentiveRecord { + record.MinUptime = minUptime + + return record +} + +func withEmissionRate(record types.IncentiveRecord, emissionRate sdk.Dec) types.IncentiveRecord { + record.EmissionRate = emissionRate return record } @@ -460,7 +472,7 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulatorValues() { func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { incentiveRecordOneWithDifferentStartTime := withStartTime(incentiveRecordOne, incentiveRecordOne.StartTime.Add(10)) - incentiveRecordOneWithDifferentMinUpTime := withMinUpTimeTime(incentiveRecordOne, testUptimeTwo) + incentiveRecordOneWithDifferentMinUpTime := withMinUptime(incentiveRecordOne, testUptimeTwo) incentiveRecordOneWithDifferentDenom := withDenom(incentiveRecordOne, testDenomTwo) type calcAccruedIncentivesTest struct { @@ -2747,3 +2759,231 @@ func (s *KeeperTestSuite) TestCollectIncentives() { }) } } + +func (s *KeeperTestSuite) TestCreateIncentive() { + type testCreateIncentive struct { + poolId uint64 + isInvalidPoolId bool + sender sdk.AccAddress + senderBalance sdk.Coins + recordToSet types.IncentiveRecord + existingRecords []types.IncentiveRecord + + expectedError error + } + tests := map[string]testCreateIncentive{ + "valid incentive record": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: incentiveRecordOne, + }, + "record with different denom, emission rate, and min uptime": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordTwo.IncentiveDenom, + incentiveRecordTwo.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: incentiveRecordTwo, + }, + "record with different start time": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: withStartTime(incentiveRecordOne, defaultStartTime.Add(time.Hour)), + }, + "record with different incentive amount": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + sdk.NewInt(8), + ), + ), + recordToSet: withAmount(incentiveRecordOne, sdk.NewDec(8)), + }, + "existing incentive records": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: incentiveRecordOne, + existingRecords: []types.IncentiveRecord{incentiveRecordTwo, incentiveRecordThree}, + }, + + // Error catching + + "pool doesn't exist": { + isInvalidPoolId: true, + + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: incentiveRecordOne, + + expectedError: types.PoolNotFoundError{PoolId: 2}, + }, + "zero incentive amount": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + sdk.ZeroInt(), + ), + ), + recordToSet: withAmount(incentiveRecordOne, sdk.ZeroDec()), + + expectedError: types.NonPositiveIncentiveAmountError{PoolId: 1, IncentiveAmount: sdk.ZeroDec()}, + }, + "negative incentive amount": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + sdk.ZeroInt(), + ), + ), + recordToSet: withAmount(incentiveRecordOne, sdk.NewDec(-1)), + + expectedError: types.NonPositiveIncentiveAmountError{PoolId: 1, IncentiveAmount: sdk.NewDec(-1)}, + }, + "start time too early": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: withStartTime(incentiveRecordOne, defaultBlockTime.Add(-1*time.Second)), + + expectedError: types.StartTimeTooEarlyError{PoolId: 1, CurrentBlockTime: defaultBlockTime, StartTime: defaultBlockTime.Add(-1 * time.Second)}, + }, + "zero emission rate": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: withEmissionRate(incentiveRecordOne, sdk.ZeroDec()), + + expectedError: types.NonPositiveEmissionRateError{PoolId: 1, EmissionRate: sdk.ZeroDec()}, + }, + "negative emission rate": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: withEmissionRate(incentiveRecordOne, sdk.NewDec(-1)), + + expectedError: types.NonPositiveEmissionRateError{PoolId: 1, EmissionRate: sdk.NewDec(-1)}, + }, + "unsupported min uptime": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins( + sdk.NewCoin( + incentiveRecordOne.IncentiveDenom, + incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), + ), + ), + recordToSet: withMinUptime(incentiveRecordOne, time.Hour*3), + + expectedError: types.InvalidMinUptimeError{PoolId: 1, MinUptime: time.Hour * 3, SupportedUptimes: types.SupportedUptimes}, + }, + "insufficient sender balance": { + poolId: defaultPoolId, + sender: s.TestAccs[0], + senderBalance: sdk.NewCoins(), + recordToSet: incentiveRecordOne, + + expectedError: types.IncentiveInsufficientBalanceError{PoolId: 1, IncentiveDenom: incentiveRecordOne.IncentiveDenom, IncentiveAmount: incentiveRecordOne.RemainingAmount.Ceil().RoundInt()}, + }, + } + + for name, tc := range tests { + tc := tc + s.Run(name, func() { + s.SetupTest() + + // We fix blocktime to ensure tests are deterministic + s.Ctx = s.Ctx.WithBlockTime(defaultBlockTime) + + s.PrepareConcentratedPool() + clKeeper := s.App.ConcentratedLiquidityKeeper + s.FundAcc(tc.sender, tc.senderBalance) + + if tc.isInvalidPoolId { + tc.poolId = tc.poolId + 1 + } + + if tc.existingRecords != nil { + clKeeper.SetMultipleIncentiveRecords(s.Ctx, tc.existingRecords) + } + + // system under test + + incentiveRecord, err := clKeeper.CreateIncentive(s.Ctx, tc.poolId, tc.sender, tc.recordToSet.IncentiveDenom, tc.recordToSet.RemainingAmount.Ceil().RoundInt(), tc.recordToSet.EmissionRate, tc.recordToSet.StartTime, tc.recordToSet.MinUptime) + + // Assertions + + if tc.expectedError != nil { + s.Require().Error(err) + s.Require().ErrorContains(err, tc.expectedError.Error()) + + // Ensure nothing was placed in state + recordInState, err := clKeeper.GetIncentiveRecord(s.Ctx, tc.poolId, tc.recordToSet.IncentiveDenom, tc.recordToSet.MinUptime) + s.Require().Error(err) + s.Require().Equal(types.IncentiveRecord{}, recordInState) + + return + } + + s.Require().NoError(err) + + // Returned incentive record should equal both to what's in state and what we expect + recordInState, err := clKeeper.GetIncentiveRecord(s.Ctx, tc.poolId, tc.recordToSet.IncentiveDenom, tc.recordToSet.MinUptime) + s.Require().Equal(tc.recordToSet, recordInState) + s.Require().Equal(tc.recordToSet, incentiveRecord) + + // Ensure that existing records aren't affected + for _, incentiveRecord := range tc.existingRecords { + _, err := clKeeper.GetIncentiveRecord(s.Ctx, tc.poolId, incentiveRecord.IncentiveDenom, incentiveRecord.MinUptime) + s.Require().NoError(err) + } + }) + } +} diff --git a/x/concentrated-liquidity/msg_server.go b/x/concentrated-liquidity/msg_server.go index e5e03be57eb..22f9741a144 100644 --- a/x/concentrated-liquidity/msg_server.go +++ b/x/concentrated-liquidity/msg_server.go @@ -194,3 +194,44 @@ func (server msgServer) CollectIncentives(goCtx context.Context, msg *types.MsgC return &types.MsgCollectIncentivesResponse{CollectedIncentives: collectedIncentives}, nil } + +func (server msgServer) CreateIncentive(goCtx context.Context, msg *types.MsgCreateIncentive) (*types.MsgCreateIncentiveResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + return nil, err + } + + incentiveRecord, err := server.keeper.createIncentive(ctx, msg.PoolId, sender, msg.IncentiveDenom, msg.IncentiveAmount, msg.EmissionRate, msg.StartTime, msg.MinUptime) + if err != nil { + return nil, err + } + + ctx.EventManager().EmitEvents(sdk.Events{ + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender), + ), + sdk.NewEvent( + types.TypeEvtCreateIncentive, + sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory), + sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender), + sdk.NewAttribute(types.AttributeKeyPoolId, strconv.FormatUint(msg.PoolId, 10)), + sdk.NewAttribute(types.AttributeIncentiveDenom, msg.IncentiveDenom), + sdk.NewAttribute(types.AttributeIncentiveAmount, msg.IncentiveAmount.String()), + sdk.NewAttribute(types.AttributeIncentiveEmissionRate, msg.EmissionRate.String()), + sdk.NewAttribute(types.AttributeIncentiveStartTime, msg.StartTime.String()), + sdk.NewAttribute(types.AttributeIncentiveMinUptime, msg.MinUptime.String()), + ), + }) + + return &types.MsgCreateIncentiveResponse{ + IncentiveDenom: incentiveRecord.IncentiveDenom, + IncentiveAmount: incentiveRecord.RemainingAmount, + EmissionRate: incentiveRecord.EmissionRate, + StartTime: incentiveRecord.StartTime, + MinUptime: incentiveRecord.MinUptime, + }, nil +} diff --git a/x/concentrated-liquidity/types/codec.go b/x/concentrated-liquidity/types/codec.go index 1995c427ca2..4fcd39c916f 100644 --- a/x/concentrated-liquidity/types/codec.go +++ b/x/concentrated-liquidity/types/codec.go @@ -14,6 +14,7 @@ func RegisterCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&MsgWithdrawPosition{}, "osmosis/cl-withdraw-position", nil) cdc.RegisterConcrete(&MsgCollectFees{}, "osmosis/cl-collect-fees", nil) cdc.RegisterConcrete(&MsgCollectIncentives{}, "osmosis/cl-collect-incentives", nil) + cdc.RegisterConcrete(&MsgCreateIncentive{}, "osmosis/cl-create-incentive", nil) } func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { @@ -28,6 +29,7 @@ func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { &MsgWithdrawPosition{}, &MsgCollectFees{}, &MsgCollectIncentives{}, + &MsgCreateIncentive{}, ) msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) diff --git a/x/concentrated-liquidity/types/errors.go b/x/concentrated-liquidity/types/errors.go index f75d8ccb94e..15685988d66 100644 --- a/x/concentrated-liquidity/types/errors.go +++ b/x/concentrated-liquidity/types/errors.go @@ -243,6 +243,54 @@ func (e IncentiveRecordNotFoundError) Error() string { return fmt.Sprintf("incentive record not found. pool id (%d), incentive denom (%s), minimum uptime (%s)", e.PoolId, e.IncentiveDenom, e.MinUptime.String()) } +type StartTimeTooEarlyError struct { + PoolId uint64 + CurrentBlockTime time.Time + StartTime time.Time +} + +func (e StartTimeTooEarlyError) Error() string { + return fmt.Sprintf("start time cannot be before current blocktime. Pool id (%d), current blocktime (%s), start time (%s)", e.PoolId, e.CurrentBlockTime.String(), e.StartTime.String()) +} + +type IncentiveInsufficientBalanceError struct { + PoolId uint64 + IncentiveDenom string + IncentiveAmount sdk.Int +} + +func (e IncentiveInsufficientBalanceError) Error() string { + return fmt.Sprintf("sender has insufficient balance to create this incentive record. Pool id (%d), incentive denom (%s), incentive amount needed (%s)", e.PoolId, e.IncentiveDenom, e.IncentiveAmount) +} + +type NonPositiveIncentiveAmountError struct { + PoolId uint64 + IncentiveAmount sdk.Dec +} + +func (e NonPositiveIncentiveAmountError) Error() string { + return fmt.Sprintf("incentive amount must be position (nonzero and nonnegative). Pool id (%d), incentive amount (%s)", e.PoolId, e.IncentiveAmount) +} + +type NonPositiveEmissionRateError struct { + PoolId uint64 + EmissionRate sdk.Dec +} + +func (e NonPositiveEmissionRateError) Error() string { + return fmt.Sprintf("emission rate must be position (nonzero and nonnegative). Pool id (%d), emission rate (%s)", e.PoolId, e.EmissionRate) +} + +type InvalidMinUptimeError struct { + PoolId uint64 + MinUptime time.Duration + SupportedUptimes []time.Duration +} + +func (e InvalidMinUptimeError) Error() string { + return fmt.Sprintf("attempted to create an incentive record with an unsupported minimum uptime. Pool id (%d), specified min uptime (%s), supported uptimes (%s)", e.PoolId, e.MinUptime, e.SupportedUptimes) +} + type QueryRangeUnsupportedError struct { RequestedRange sdk.Int MaxRange sdk.Int diff --git a/x/concentrated-liquidity/types/events.go b/x/concentrated-liquidity/types/events.go index 1f8032da8bb..502b97cf4ce 100644 --- a/x/concentrated-liquidity/types/events.go +++ b/x/concentrated-liquidity/types/events.go @@ -5,19 +5,25 @@ const ( TypeEvtWithdrawPosition = "withdraw_position" TypeEvtCollectFees = "collect_fees" TypeEvtCollectIncentives = "collect_incentives" + TypeEvtCreateIncentive = "create_incentive" - AttributeValueCategory = ModuleName - AttributeKeyPoolId = "pool_id" - AttributeAmount0 = "amount0" - AttributeAmount1 = "amount1" - AttributeKeySwapFee = "swap_fee" - AttributeKeyTokensIn = "tokens_in" - AttributeKeyTokensOut = "tokens_out" - AttributeLiquidity = "liquidity" - AttributeLowerTick = "lower_tick" - AttributeUpperTick = "upper_tick" - TypeEvtPoolJoined = "pool_joined" - TypeEvtPoolExited = "pool_exited" - TypeEvtPoolCreated = "pool_created" - TypeEvtTokenSwapped = "token_swapped" + AttributeValueCategory = ModuleName + AttributeKeyPoolId = "pool_id" + AttributeAmount0 = "amount0" + AttributeAmount1 = "amount1" + AttributeKeySwapFee = "swap_fee" + AttributeKeyTokensIn = "tokens_in" + AttributeKeyTokensOut = "tokens_out" + AttributeLiquidity = "liquidity" + AttributeLowerTick = "lower_tick" + AttributeUpperTick = "upper_tick" + AttributeIncentiveDenom = "incentive_denom" + AttributeIncentiveAmount = "incentive_amount" + AttributeIncentiveEmissionRate = "incentive_emission_rate" + AttributeIncentiveStartTime = "incentive_start_time" + AttributeIncentiveMinUptime = "incentive_min_uptime" + TypeEvtPoolJoined = "pool_joined" + TypeEvtPoolExited = "pool_exited" + TypeEvtPoolCreated = "pool_created" + TypeEvtTokenSwapped = "token_swapped" ) diff --git a/x/concentrated-liquidity/types/expected_keepers.go b/x/concentrated-liquidity/types/expected_keepers.go index 664907622be..46cc5e095f6 100644 --- a/x/concentrated-liquidity/types/expected_keepers.go +++ b/x/concentrated-liquidity/types/expected_keepers.go @@ -12,6 +12,7 @@ import ( type BankKeeper interface { GetDenomMetaData(ctx sdk.Context, denom string) (banktypes.Metadata, bool) SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error + HasBalance(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coin) bool } // PoolManagerKeeper defines the interface needed to be fulfilled for diff --git a/x/concentrated-liquidity/types/msgs.go b/x/concentrated-liquidity/types/msgs.go index c55451ee91d..6625b9626cc 100644 --- a/x/concentrated-liquidity/types/msgs.go +++ b/x/concentrated-liquidity/types/msgs.go @@ -157,3 +157,36 @@ func (msg MsgCollectIncentives) GetSigners() []sdk.AccAddress { } return []sdk.AccAddress{sender} } + +var _ sdk.Msg = &MsgCreateIncentive{} + +func (msg MsgCreateIncentive) Route() string { return RouterKey } +func (msg MsgCreateIncentive) Type() string { return TypeMsgCollectIncentives } +func (msg MsgCreateIncentive) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + return fmt.Errorf("Invalid sender address (%s)", err) + } + + if !msg.IncentiveAmount.IsPositive() { + return NonPositiveIncentiveAmountError{PoolId: msg.PoolId, IncentiveAmount: msg.IncentiveAmount.ToDec()} + } + + if !msg.EmissionRate.IsPositive() { + return NonPositiveEmissionRateError{PoolId: msg.PoolId, EmissionRate: msg.EmissionRate} + } + + return nil +} + +func (msg MsgCreateIncentive) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +func (msg MsgCreateIncentive) GetSigners() []sdk.AccAddress { + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + return []sdk.AccAddress{sender} +} diff --git a/x/concentrated-liquidity/types/tx.pb.go b/x/concentrated-liquidity/types/tx.pb.go index 6d58153f204..06bf94fbfe2 100644 --- a/x/concentrated-liquidity/types/tx.pb.go +++ b/x/concentrated-liquidity/types/tx.pb.go @@ -518,6 +518,147 @@ func (m *MsgCollectIncentivesResponse) GetCollectedIncentives() []types.Coin { return nil } +// ===================== MsgCreateIncentive +type MsgCreateIncentive struct { + PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + Sender string `protobuf:"bytes,2,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + IncentiveDenom string `protobuf:"bytes,3,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` + IncentiveAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=incentive_amount,json=incentiveAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"incentive_amount" yaml:"incentive_amount"` + EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"emission_rate"` + StartTime time.Time `protobuf:"bytes,6,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` + MinUptime time.Duration `protobuf:"bytes,7,opt,name=min_uptime,json=minUptime,proto3,stdduration" json:"duration,omitempty" yaml:"min_uptime"` +} + +func (m *MsgCreateIncentive) Reset() { *m = MsgCreateIncentive{} } +func (m *MsgCreateIncentive) String() string { return proto.CompactTextString(m) } +func (*MsgCreateIncentive) ProtoMessage() {} +func (*MsgCreateIncentive) Descriptor() ([]byte, []int) { + return fileDescriptor_1f1fff802923d7db, []int{8} +} +func (m *MsgCreateIncentive) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateIncentive) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateIncentive.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateIncentive) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateIncentive.Merge(m, src) +} +func (m *MsgCreateIncentive) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateIncentive) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateIncentive.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateIncentive proto.InternalMessageInfo + +func (m *MsgCreateIncentive) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *MsgCreateIncentive) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgCreateIncentive) GetIncentiveDenom() string { + if m != nil { + return m.IncentiveDenom + } + return "" +} + +func (m *MsgCreateIncentive) GetStartTime() time.Time { + if m != nil { + return m.StartTime + } + return time.Time{} +} + +func (m *MsgCreateIncentive) GetMinUptime() time.Duration { + if m != nil { + return m.MinUptime + } + return 0 +} + +type MsgCreateIncentiveResponse struct { + IncentiveDenom string `protobuf:"bytes,1,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` + IncentiveAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=incentive_amount,json=incentiveAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"incentive_amount" yaml:"incentive_amount"` + EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"emission_rate"` + StartTime time.Time `protobuf:"bytes,4,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` + MinUptime time.Duration `protobuf:"bytes,5,opt,name=min_uptime,json=minUptime,proto3,stdduration" json:"duration,omitempty" yaml:"min_uptime"` +} + +func (m *MsgCreateIncentiveResponse) Reset() { *m = MsgCreateIncentiveResponse{} } +func (m *MsgCreateIncentiveResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreateIncentiveResponse) ProtoMessage() {} +func (*MsgCreateIncentiveResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_1f1fff802923d7db, []int{9} +} +func (m *MsgCreateIncentiveResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateIncentiveResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateIncentiveResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateIncentiveResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateIncentiveResponse.Merge(m, src) +} +func (m *MsgCreateIncentiveResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateIncentiveResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateIncentiveResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateIncentiveResponse proto.InternalMessageInfo + +func (m *MsgCreateIncentiveResponse) GetIncentiveDenom() string { + if m != nil { + return m.IncentiveDenom + } + return "" +} + +func (m *MsgCreateIncentiveResponse) GetStartTime() time.Time { + if m != nil { + return m.StartTime + } + return time.Time{} +} + +func (m *MsgCreateIncentiveResponse) GetMinUptime() time.Duration { + if m != nil { + return m.MinUptime + } + return 0 +} + func init() { proto.RegisterType((*MsgCreatePosition)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCreatePosition") proto.RegisterType((*MsgCreatePositionResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCreatePositionResponse") @@ -527,6 +668,8 @@ func init() { proto.RegisterType((*MsgCollectFeesResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCollectFeesResponse") proto.RegisterType((*MsgCollectIncentives)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCollectIncentives") proto.RegisterType((*MsgCollectIncentivesResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCollectIncentivesResponse") + proto.RegisterType((*MsgCreateIncentive)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCreateIncentive") + proto.RegisterType((*MsgCreateIncentiveResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCreateIncentiveResponse") } func init() { @@ -534,65 +677,76 @@ func init() { } var fileDescriptor_1f1fff802923d7db = []byte{ - // 922 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x57, 0x41, 0x6f, 0xdc, 0x44, - 0x14, 0xce, 0x34, 0x61, 0xd3, 0x9d, 0x2a, 0x9b, 0xac, 0x9b, 0x16, 0x77, 0x5b, 0xd6, 0xab, 0x41, - 0x40, 0x10, 0xc4, 0xae, 0x0b, 0x95, 0xaa, 0x22, 0xa4, 0xe2, 0x44, 0x48, 0x41, 0x8a, 0x84, 0xac, - 0x22, 0xa4, 0x0a, 0xc9, 0xf2, 0xda, 0x93, 0xed, 0x90, 0xb5, 0xc7, 0xf5, 0xcc, 0x26, 0x5d, 0xc4, - 0x8d, 0x03, 0x17, 0x0e, 0x05, 0x09, 0x89, 0x1f, 0xc0, 0x7f, 0xa1, 0x07, 0x0e, 0x3d, 0x80, 0x84, - 0x7a, 0x30, 0x28, 0xb9, 0x71, 0xdc, 0x5f, 0x80, 0xec, 0x19, 0xdb, 0x1b, 0x7b, 0x11, 0xdd, 0x04, - 0x21, 0x91, 0x53, 0x76, 0xde, 0xbc, 0xef, 0xfb, 0x66, 0xbe, 0x99, 0xf7, 0xc6, 0x81, 0x6f, 0x50, - 0x16, 0x50, 0x46, 0x98, 0xe1, 0xd1, 0xd0, 0xc3, 0x21, 0x8f, 0x5d, 0x8e, 0xfd, 0xcd, 0x21, 0x79, - 0x34, 0x22, 0x3e, 0xe1, 0x63, 0x83, 0x3f, 0xd6, 0xa3, 0x98, 0x72, 0xaa, 0xbc, 0x26, 0x13, 0xf5, - 0xe9, 0xc4, 0x22, 0x4f, 0x3f, 0x30, 0xfb, 0x98, 0xbb, 0x66, 0x67, 0x7d, 0x40, 0x07, 0x34, 0x43, - 0x18, 0xe9, 0x2f, 0x01, 0xee, 0x68, 0x03, 0x4a, 0x07, 0x43, 0x6c, 0x64, 0xa3, 0xfe, 0x68, 0xcf, - 0xe0, 0x24, 0xc0, 0x8c, 0xbb, 0x41, 0x24, 0x13, 0xba, 0xd5, 0x04, 0x7f, 0x14, 0xbb, 0x9c, 0xd0, - 0x30, 0x9f, 0xf7, 0x32, 0x79, 0xa3, 0xef, 0x32, 0x6c, 0x48, 0x2d, 0xc3, 0xa3, 0x44, 0xce, 0xa3, - 0xaf, 0x1b, 0xb0, 0xbd, 0xcb, 0x06, 0x5b, 0x31, 0x76, 0x39, 0xfe, 0x98, 0x32, 0x92, 0x62, 0x95, - 0xb7, 0xe0, 0x72, 0x44, 0xe9, 0xd0, 0x21, 0xbe, 0x0a, 0x7a, 0x60, 0x63, 0xc9, 0x52, 0x26, 0x89, - 0xd6, 0x1a, 0xbb, 0xc1, 0xf0, 0x2e, 0x92, 0x13, 0xc8, 0x6e, 0xa4, 0xbf, 0x76, 0x7c, 0xe5, 0x4d, - 0xd8, 0x60, 0x38, 0xf4, 0x71, 0xac, 0x5e, 0xe8, 0x81, 0x8d, 0xa6, 0xd5, 0x9e, 0x24, 0xda, 0x8a, - 0xc8, 0x15, 0x71, 0x64, 0xcb, 0x04, 0xe5, 0x5d, 0x08, 0x87, 0xf4, 0x10, 0xc7, 0x0e, 0x27, 0xde, - 0xbe, 0xba, 0xd8, 0x03, 0x1b, 0x8b, 0xd6, 0x95, 0x49, 0xa2, 0xb5, 0x45, 0x7a, 0x39, 0x87, 0xec, - 0x66, 0x36, 0xb8, 0x4f, 0xbc, 0xfd, 0x14, 0x35, 0x8a, 0xa2, 0x1c, 0xb5, 0x54, 0x45, 0x95, 0x73, - 0xc8, 0x6e, 0x66, 0x83, 0x0c, 0xe5, 0xc0, 0x16, 0xa7, 0xfb, 0x38, 0x74, 0x7c, 0xcc, 0x48, 0x8c, - 0xfd, 0x9b, 0xea, 0x4b, 0x3d, 0xb0, 0x71, 0xe9, 0xd6, 0x35, 0x5d, 0x58, 0xa2, 0xa7, 0x96, 0xe4, - 0xf6, 0xeb, 0x5b, 0x94, 0x84, 0xd6, 0x2b, 0x4f, 0x13, 0x6d, 0x61, 0x92, 0x68, 0x57, 0x04, 0xf1, - 0x49, 0x38, 0xb2, 0x57, 0xb2, 0xc0, 0xb6, 0x1c, 0xd7, 0x04, 0x4c, 0xb5, 0x71, 0x16, 0x01, 0xb3, - 0x22, 0x60, 0x2a, 0x07, 0xb0, 0x2d, 0x32, 0x02, 0x12, 0x3a, 0x6e, 0x40, 0x47, 0x21, 0xbf, 0xa9, - 0x2e, 0x67, 0x1e, 0x7f, 0x94, 0x12, 0x3d, 0x4f, 0xb4, 0xd7, 0x07, 0x84, 0x3f, 0x1c, 0xf5, 0x75, - 0x8f, 0x06, 0x86, 0x3c, 0x69, 0xf1, 0x67, 0x93, 0xf9, 0xfb, 0x06, 0x1f, 0x47, 0x98, 0xe9, 0x3b, - 0x21, 0x9f, 0x24, 0x9a, 0x3a, 0x2d, 0x39, 0x45, 0x88, 0xec, 0xd5, 0x2c, 0xb6, 0x4b, 0xc2, 0x0f, - 0x44, 0x64, 0x96, 0xae, 0xa9, 0x5e, 0xfc, 0x77, 0x75, 0xcd, 0x9a, 0xae, 0xa9, 0x7c, 0x09, 0x57, - 0xf7, 0x62, 0x8c, 0xbf, 0xc0, 0x4e, 0x7e, 0x89, 0xd5, 0xa6, 0x74, 0x54, 0xdc, 0x72, 0x3d, 0xbf, - 0xe5, 0xfa, 0xb6, 0x4c, 0xb0, 0xee, 0xa4, 0x0b, 0xfa, 0x33, 0xd1, 0x94, 0x1c, 0xf2, 0x36, 0x0d, - 0x08, 0xc7, 0x41, 0xc4, 0xc7, 0x93, 0x44, 0xbb, 0x2a, 0xc4, 0x2b, 0xac, 0xe8, 0x87, 0xdf, 0x35, - 0x60, 0xb7, 0x44, 0x34, 0x67, 0x42, 0x3f, 0x5f, 0x80, 0xd7, 0x6a, 0x95, 0x60, 0x63, 0x16, 0xd1, - 0x90, 0x61, 0xe5, 0x01, 0x5c, 0xce, 0x4f, 0x00, 0x64, 0x4e, 0xdc, 0x9b, 0xdb, 0x09, 0x59, 0x3f, - 0x85, 0xef, 0x39, 0x61, 0xc9, 0x6d, 0xca, 0x0a, 0x3a, 0x23, 0xb7, 0x59, 0x70, 0x9b, 0xca, 0x21, - 0x6c, 0x17, 0xbd, 0xc6, 0xf1, 0xb2, 0xbd, 0xf9, 0x59, 0x21, 0xcc, 0x77, 0x96, 0xdb, 0xd8, 0x2b, - 0xcf, 0xb2, 0x46, 0x88, 0xec, 0xb5, 0x22, 0xb6, 0x25, 0x43, 0x3f, 0x2e, 0xc1, 0xcb, 0xbb, 0x6c, - 0xf0, 0x29, 0xe1, 0x0f, 0xfd, 0xd8, 0x3d, 0x3c, 0x57, 0xad, 0x85, 0xc3, 0x72, 0xbf, 0xf2, 0x3e, - 0x4b, 0x4f, 0x77, 0xe6, 0xf6, 0xf4, 0xe5, 0xaa, 0xa7, 0x82, 0x0f, 0xd9, 0xab, 0x45, 0x48, 0xd4, - 0x87, 0xf2, 0x09, 0x6c, 0x7e, 0x4e, 0x49, 0xe8, 0xa4, 0x4f, 0x80, 0x6c, 0x35, 0x9d, 0x5a, 0x61, - 0xdc, 0xcf, 0xdf, 0x07, 0xeb, 0x86, 0xec, 0x35, 0x6b, 0x42, 0xa0, 0x80, 0xa2, 0x27, 0xe9, 0xed, - 0xbf, 0x98, 0x8e, 0xd3, 0xe4, 0x59, 0x55, 0xb7, 0xfc, 0xdf, 0x55, 0xdd, 0xaf, 0x00, 0x5e, 0x9f, - 0x71, 0x4d, 0xfe, 0xef, 0x75, 0x87, 0x7e, 0x01, 0xb0, 0x95, 0x76, 0x13, 0x3a, 0x1c, 0x62, 0x8f, - 0x7f, 0x88, 0x31, 0x3b, 0x0f, 0x37, 0x1f, 0x8d, 0xe1, 0xd5, 0x93, 0xbb, 0x2a, 0x0e, 0xca, 0x81, - 0x2d, 0x4f, 0x84, 0xb1, 0xef, 0xec, 0x61, 0xcc, 0x54, 0xd0, 0x5b, 0x9c, 0xeb, 0x35, 0x3c, 0x09, - 0x47, 0xf6, 0x4a, 0x11, 0x48, 0x85, 0xd0, 0x73, 0x00, 0xd7, 0x4b, 0xed, 0x9d, 0xec, 0x5b, 0x8a, - 0x1c, 0x9c, 0x13, 0x5f, 0xbf, 0x05, 0xf0, 0xc6, 0xac, 0xcd, 0x15, 0xf6, 0x3e, 0x82, 0xeb, 0xa5, - 0x3f, 0xa4, 0x98, 0xff, 0x67, 0x93, 0x5f, 0x95, 0x26, 0x5f, 0xaf, 0x9a, 0x5c, 0x92, 0x20, 0xfb, - 0x72, 0x11, 0x2e, 0xa5, 0x6f, 0xfd, 0xb4, 0x04, 0x17, 0x77, 0xd9, 0x40, 0xf9, 0x06, 0xc0, 0x56, - 0xe5, 0xfb, 0xf0, 0x8e, 0xfe, 0x42, 0x1f, 0xb5, 0x7a, 0xed, 0x3d, 0xed, 0xdc, 0x3b, 0x2d, 0xb2, - 0x70, 0xe2, 0x3b, 0x00, 0xd7, 0x6a, 0xaf, 0xca, 0xdd, 0x17, 0xa7, 0xad, 0x62, 0x3b, 0xd6, 0xe9, - 0xb1, 0xc5, 0xa2, 0xbe, 0x02, 0xf0, 0xd2, 0x74, 0xad, 0xdf, 0x9e, 0x63, 0x9b, 0x25, 0xac, 0xf3, - 0xfe, 0xa9, 0x60, 0xc5, 0x2a, 0xbe, 0x07, 0xb0, 0x5d, 0xaf, 0x8f, 0xf7, 0xe6, 0x26, 0x2d, 0xc1, - 0x9d, 0xad, 0x33, 0x80, 0xf3, 0x75, 0x59, 0x9f, 0x3d, 0x3d, 0xea, 0x82, 0x67, 0x47, 0x5d, 0xf0, - 0xc7, 0x51, 0x17, 0x3c, 0x39, 0xee, 0x2e, 0x3c, 0x3b, 0xee, 0x2e, 0xfc, 0x76, 0xdc, 0x5d, 0x78, - 0x60, 0x4d, 0x75, 0x5a, 0x29, 0xb4, 0x39, 0x74, 0xfb, 0x2c, 0x1f, 0x18, 0x07, 0xe6, 0x6d, 0xe3, - 0xf1, 0xdf, 0xfe, 0x8f, 0x95, 0x76, 0xe2, 0x7e, 0x23, 0x7b, 0x9f, 0xde, 0xf9, 0x2b, 0x00, 0x00, - 0xff, 0xff, 0x93, 0x6f, 0x8b, 0x14, 0x92, 0x0d, 0x00, 0x00, + // 1091 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0x4f, 0x6f, 0x1b, 0x45, + 0x14, 0xcf, 0xc4, 0x6e, 0x52, 0x4f, 0x89, 0x13, 0x6f, 0xd3, 0xb2, 0x75, 0x8b, 0x37, 0x1a, 0x04, + 0x0d, 0x82, 0xec, 0x76, 0x5b, 0x2a, 0x55, 0x45, 0x48, 0xc5, 0x89, 0x2a, 0x05, 0x29, 0x12, 0x5a, + 0xb5, 0x02, 0x55, 0x48, 0xab, 0xf5, 0xee, 0xc4, 0x1d, 0xec, 0xdd, 0x71, 0x77, 0xc6, 0x49, 0x8d, + 0xb8, 0x71, 0xe0, 0xc2, 0xa1, 0x20, 0x21, 0xf1, 0x01, 0xf8, 0x22, 0x9c, 0xe8, 0x81, 0x43, 0x0f, + 0x20, 0xa1, 0x1e, 0x0c, 0x4a, 0x6e, 0xdc, 0xf0, 0x27, 0x40, 0xbb, 0x33, 0x3b, 0xeb, 0xd8, 0x86, + 0xc6, 0x09, 0xa9, 0x44, 0x4e, 0xf1, 0x7b, 0xf3, 0x7e, 0xef, 0xcd, 0xfc, 0xde, 0x9f, 0x99, 0x0d, + 0xbc, 0x4a, 0x59, 0x48, 0x19, 0x61, 0x96, 0x4f, 0x23, 0x1f, 0x47, 0x3c, 0xf6, 0x38, 0x0e, 0xd6, + 0xda, 0xe4, 0x51, 0x97, 0x04, 0x84, 0xf7, 0x2c, 0xfe, 0xd8, 0xec, 0xc4, 0x94, 0x53, 0xed, 0x0d, + 0x69, 0x68, 0x0e, 0x1b, 0x2a, 0x3b, 0x73, 0xc7, 0x6e, 0x60, 0xee, 0xd9, 0xd5, 0xe5, 0x26, 0x6d, + 0xd2, 0x14, 0x61, 0x25, 0xbf, 0x04, 0xb8, 0x6a, 0x34, 0x29, 0x6d, 0xb6, 0xb1, 0x95, 0x4a, 0x8d, + 0xee, 0xb6, 0xc5, 0x49, 0x88, 0x19, 0xf7, 0xc2, 0x8e, 0x34, 0xa8, 0x8d, 0x1a, 0x04, 0xdd, 0xd8, + 0xe3, 0x84, 0x46, 0xd9, 0xba, 0x9f, 0x86, 0xb7, 0x1a, 0x1e, 0xc3, 0x96, 0x8c, 0x65, 0xf9, 0x94, + 0xc8, 0x75, 0xf4, 0xd5, 0x1c, 0xac, 0x6c, 0xb1, 0xe6, 0x7a, 0x8c, 0x3d, 0x8e, 0x3f, 0xa2, 0x8c, + 0x24, 0x58, 0xed, 0x6d, 0x38, 0xdf, 0xa1, 0xb4, 0xed, 0x92, 0x40, 0x07, 0x2b, 0x60, 0xb5, 0x58, + 0xd7, 0x06, 0x7d, 0xa3, 0xdc, 0xf3, 0xc2, 0xf6, 0x6d, 0x24, 0x17, 0x90, 0x33, 0x97, 0xfc, 0xda, + 0x0c, 0xb4, 0xb7, 0xe0, 0x1c, 0xc3, 0x51, 0x80, 0x63, 0x7d, 0x76, 0x05, 0xac, 0x96, 0xea, 0x95, + 0x41, 0xdf, 0x58, 0x10, 0xb6, 0x42, 0x8f, 0x1c, 0x69, 0xa0, 0xbd, 0x0b, 0x61, 0x9b, 0xee, 0xe2, + 0xd8, 0xe5, 0xc4, 0x6f, 0xe9, 0x85, 0x15, 0xb0, 0x5a, 0xa8, 0x5f, 0x18, 0xf4, 0x8d, 0x8a, 0x30, + 0xcf, 0xd7, 0x90, 0x53, 0x4a, 0x85, 0x7b, 0xc4, 0x6f, 0x25, 0xa8, 0x6e, 0xa7, 0x93, 0xa1, 0x8a, + 0xa3, 0xa8, 0x7c, 0x0d, 0x39, 0xa5, 0x54, 0x48, 0x51, 0x2e, 0x2c, 0x73, 0xda, 0xc2, 0x91, 0x1b, + 0x60, 0x46, 0x62, 0x1c, 0x5c, 0xd3, 0xcf, 0xac, 0x80, 0xd5, 0x73, 0xd7, 0x2f, 0x99, 0x82, 0x12, + 0x33, 0xa1, 0x24, 0xa3, 0xdf, 0x5c, 0xa7, 0x24, 0xaa, 0xbf, 0xf6, 0xb4, 0x6f, 0xcc, 0x0c, 0xfa, + 0xc6, 0x05, 0xe1, 0xf8, 0x20, 0x1c, 0x39, 0x0b, 0xa9, 0x62, 0x43, 0xca, 0x63, 0x01, 0x6c, 0x7d, + 0xee, 0x38, 0x01, 0xec, 0x91, 0x00, 0xb6, 0xb6, 0x03, 0x2b, 0xc2, 0x22, 0x24, 0x91, 0xeb, 0x85, + 0xb4, 0x1b, 0xf1, 0x6b, 0xfa, 0x7c, 0xca, 0xf1, 0x87, 0x89, 0xa3, 0xe7, 0x7d, 0xe3, 0xcd, 0x26, + 0xe1, 0x0f, 0xbb, 0x0d, 0xd3, 0xa7, 0xa1, 0x25, 0x33, 0x2d, 0xfe, 0xac, 0xb1, 0xa0, 0x65, 0xf1, + 0x5e, 0x07, 0x33, 0x73, 0x33, 0xe2, 0x83, 0xbe, 0xa1, 0x0f, 0x87, 0x1c, 0x72, 0x88, 0x9c, 0xc5, + 0x54, 0xb7, 0x45, 0xa2, 0x0f, 0x84, 0x66, 0x52, 0x5c, 0x5b, 0x3f, 0xfb, 0xdf, 0xc6, 0xb5, 0xc7, + 0xe2, 0xda, 0xda, 0x17, 0x70, 0x71, 0x3b, 0xc6, 0xf8, 0x73, 0xec, 0x66, 0x45, 0xac, 0x97, 0x24, + 0xa3, 0xa2, 0xca, 0xcd, 0xac, 0xca, 0xcd, 0x0d, 0x69, 0x50, 0xbf, 0x95, 0x6c, 0xe8, 0xcf, 0xbe, + 0xa1, 0x65, 0x90, 0x77, 0x68, 0x48, 0x38, 0x0e, 0x3b, 0xbc, 0x37, 0xe8, 0x1b, 0x17, 0x45, 0xf0, + 0x11, 0xaf, 0xe8, 0xfb, 0xdf, 0x0d, 0xe0, 0x94, 0x85, 0x36, 0xf3, 0x84, 0x7e, 0x9e, 0x85, 0x97, + 0xc6, 0x3a, 0xc1, 0xc1, 0xac, 0x43, 0x23, 0x86, 0xb5, 0x07, 0x70, 0x3e, 0xcb, 0x00, 0x48, 0x99, + 0xb8, 0x33, 0x35, 0x13, 0xb2, 0x7f, 0x14, 0xef, 0x99, 0xc3, 0xdc, 0xb7, 0x2d, 0x3b, 0xe8, 0x98, + 0xbe, 0x6d, 0xe5, 0xdb, 0xd6, 0x76, 0x61, 0x45, 0xcd, 0x1a, 0xd7, 0x4f, 0xcf, 0x16, 0xa4, 0x8d, + 0x30, 0x5d, 0x2e, 0x37, 0xb0, 0x9f, 0xe7, 0x72, 0xcc, 0x21, 0x72, 0x96, 0x94, 0x6e, 0x5d, 0xaa, + 0x7e, 0x28, 0xc2, 0xf3, 0x5b, 0xac, 0xf9, 0x31, 0xe1, 0x0f, 0x83, 0xd8, 0xdb, 0x3d, 0x55, 0xa3, + 0x85, 0xc3, 0xfc, 0xbc, 0xb2, 0x9e, 0x25, 0xa7, 0x9b, 0x53, 0x73, 0xfa, 0xea, 0x28, 0xa7, 0xc2, + 0x1f, 0x72, 0x16, 0x95, 0x4a, 0xf4, 0x87, 0x76, 0x1f, 0x96, 0x3e, 0xa3, 0x24, 0x72, 0x93, 0x2b, + 0x40, 0x8e, 0x9a, 0xea, 0x58, 0x63, 0xdc, 0xcb, 0xee, 0x87, 0xfa, 0x15, 0x39, 0x6b, 0x96, 0x44, + 0x00, 0x05, 0x45, 0x4f, 0x92, 0xea, 0x3f, 0x9b, 0xc8, 0x89, 0xf1, 0xa4, 0xae, 0x9b, 0x7f, 0x79, + 0x5d, 0xf7, 0x2b, 0x80, 0x97, 0x27, 0x94, 0xc9, 0xff, 0xbd, 0xef, 0xd0, 0x2f, 0x00, 0x96, 0x93, + 0x69, 0x42, 0xdb, 0x6d, 0xec, 0xf3, 0xbb, 0x18, 0xb3, 0xd3, 0x50, 0xf9, 0xa8, 0x07, 0x2f, 0x1e, + 0x3c, 0x95, 0x4a, 0x94, 0x0b, 0xcb, 0xbe, 0x50, 0xe3, 0xc0, 0xdd, 0xc6, 0x98, 0xe9, 0x60, 0xa5, + 0x30, 0xd5, 0x6d, 0x78, 0x10, 0x8e, 0x9c, 0x05, 0xa5, 0x48, 0x02, 0xa1, 0xe7, 0x00, 0x2e, 0xe7, + 0xb1, 0x37, 0xd3, 0xb7, 0x14, 0xd9, 0x39, 0x25, 0xbc, 0x7e, 0x03, 0xe0, 0x95, 0x49, 0x87, 0x53, + 0xf4, 0x3e, 0x82, 0xcb, 0x39, 0x3f, 0x44, 0xad, 0xbf, 0x98, 0xe4, 0xd7, 0x25, 0xc9, 0x97, 0x47, + 0x49, 0xce, 0x9d, 0x20, 0xe7, 0xbc, 0x52, 0xe7, 0xa1, 0xd1, 0x8f, 0x45, 0xa8, 0xa9, 0x0b, 0x51, + 0xe9, 0x4f, 0x8c, 0xee, 0xab, 0x70, 0x51, 0x6d, 0xc9, 0x0d, 0x70, 0x44, 0xc3, 0x94, 0xf3, 0x92, + 0x53, 0x56, 0xea, 0x8d, 0x44, 0x9b, 0x4c, 0xdf, 0xdc, 0x50, 0x4e, 0xdf, 0xe2, 0xd4, 0xd3, 0x57, + 0xf4, 0xaf, 0x9c, 0xbe, 0xa3, 0xfe, 0x90, 0x93, 0xef, 0x45, 0x4e, 0xdf, 0x16, 0x5c, 0xc0, 0x21, + 0x61, 0x8c, 0xd0, 0xc8, 0x4d, 0x9e, 0xf0, 0x72, 0xe0, 0xdf, 0x9d, 0x7a, 0xe0, 0x2f, 0x8b, 0x90, + 0x07, 0x9c, 0x21, 0xe7, 0x95, 0x4c, 0x76, 0x3c, 0x8e, 0xb5, 0x4f, 0x20, 0x64, 0xdc, 0x8b, 0xf9, + 0x61, 0x67, 0x7d, 0xd6, 0x49, 0xb2, 0xc8, 0x72, 0xac, 0x18, 0xf6, 0xa5, 0x54, 0x91, 0x4e, 0xfb, + 0x10, 0xc2, 0xe4, 0x11, 0xd6, 0xed, 0xa4, 0x9e, 0x5f, 0x38, 0xe8, 0x6f, 0xfc, 0xeb, 0xa0, 0x97, + 0xe1, 0x72, 0x87, 0x62, 0xc6, 0x97, 0x42, 0x12, 0xdd, 0x17, 0xf2, 0x5f, 0x05, 0x58, 0x1d, 0xaf, + 0x21, 0x55, 0xd5, 0x13, 0x72, 0x0e, 0x0e, 0x9d, 0xf3, 0xd9, 0xe3, 0xdd, 0xb8, 0x47, 0xc9, 0x79, + 0xe1, 0xa5, 0xe5, 0xbc, 0x78, 0x62, 0x39, 0x3f, 0x73, 0xc2, 0x39, 0xbf, 0xfe, 0x53, 0x11, 0x16, + 0xb6, 0x58, 0x53, 0xfb, 0x1a, 0xc0, 0xf2, 0xc8, 0x77, 0xe5, 0x2d, 0xf3, 0x50, 0x1f, 0xc3, 0xe6, + 0xd8, 0x3b, 0xbc, 0x7a, 0xe7, 0xa8, 0x48, 0x55, 0x6b, 0xdf, 0x02, 0xb8, 0x34, 0xf6, 0x1a, 0xbd, + 0x7d, 0x78, 0xb7, 0xa3, 0xd8, 0x6a, 0xfd, 0xe8, 0x58, 0xb5, 0xa9, 0x2f, 0x01, 0x3c, 0x37, 0xfc, + 0x46, 0xb8, 0x39, 0xc5, 0x31, 0x73, 0x58, 0xf5, 0xfd, 0x23, 0xc1, 0xd4, 0x2e, 0xbe, 0x03, 0xb0, + 0x32, 0x7e, 0xaf, 0xbe, 0x37, 0xb5, 0xd3, 0x1c, 0x5c, 0x5d, 0x3f, 0x06, 0x38, 0xdb, 0x57, 0xfd, + 0xd3, 0xa7, 0x7b, 0x35, 0xf0, 0x6c, 0xaf, 0x06, 0xfe, 0xd8, 0xab, 0x81, 0x27, 0xfb, 0xb5, 0x99, + 0x67, 0xfb, 0xb5, 0x99, 0xdf, 0xf6, 0x6b, 0x33, 0x0f, 0xea, 0x43, 0xad, 0x27, 0x03, 0xad, 0xb5, + 0xbd, 0x06, 0xcb, 0x04, 0x6b, 0xc7, 0xbe, 0x69, 0x3d, 0xfe, 0xc7, 0xff, 0xcd, 0x24, 0xad, 0xd9, + 0x98, 0x4b, 0x4b, 0xff, 0xc6, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x73, 0x5a, 0x90, 0x5a, 0xca, + 0x11, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1207,6 +1361,150 @@ func (m *MsgCollectIncentivesResponse) MarshalToSizedBuffer(dAtA []byte) (int, e return len(dAtA) - i, nil } +func (m *MsgCreateIncentive) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateIncentive) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateIncentive) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + n6, err6 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MinUptime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime):]) + if err6 != nil { + return 0, err6 + } + i -= n6 + i = encodeVarintTx(dAtA, i, uint64(n6)) + i-- + dAtA[i] = 0x3a + n7, err7 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + if err7 != nil { + return 0, err7 + } + i -= n7 + i = encodeVarintTx(dAtA, i, uint64(n7)) + i-- + dAtA[i] = 0x32 + { + size := m.EmissionRate.Size() + i -= size + if _, err := m.EmissionRate.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + { + size := m.IncentiveAmount.Size() + i -= size + if _, err := m.IncentiveAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + if len(m.IncentiveDenom) > 0 { + i -= len(m.IncentiveDenom) + copy(dAtA[i:], m.IncentiveDenom) + i = encodeVarintTx(dAtA, i, uint64(len(m.IncentiveDenom))) + i-- + dAtA[i] = 0x1a + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0x12 + } + if m.PoolId != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MsgCreateIncentiveResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateIncentiveResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateIncentiveResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + n8, err8 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MinUptime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime):]) + if err8 != nil { + return 0, err8 + } + i -= n8 + i = encodeVarintTx(dAtA, i, uint64(n8)) + i-- + dAtA[i] = 0x2a + n9, err9 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + if err9 != nil { + return 0, err9 + } + i -= n9 + i = encodeVarintTx(dAtA, i, uint64(n9)) + i-- + dAtA[i] = 0x22 + { + size := m.EmissionRate.Size() + i -= size + if _, err := m.EmissionRate.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size := m.IncentiveAmount.Size() + i -= size + if _, err := m.IncentiveAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.IncentiveDenom) > 0 { + i -= len(m.IncentiveDenom) + copy(dAtA[i:], m.IncentiveDenom) + i = encodeVarintTx(dAtA, i, uint64(len(m.IncentiveDenom))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -1380,6 +1678,55 @@ func (m *MsgCollectIncentivesResponse) Size() (n int) { return n } +func (m *MsgCreateIncentive) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PoolId != 0 { + n += 1 + sovTx(uint64(m.PoolId)) + } + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.IncentiveDenom) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.IncentiveAmount.Size() + n += 1 + l + sovTx(uint64(l)) + l = m.EmissionRate.Size() + n += 1 + l + sovTx(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) + n += 1 + l + sovTx(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime) + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgCreateIncentiveResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.IncentiveDenom) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.IncentiveAmount.Size() + n += 1 + l + sovTx(uint64(l)) + l = m.EmissionRate.Size() + n += 1 + l + sovTx(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) + n += 1 + l + sovTx(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime) + n += 1 + l + sovTx(uint64(l)) + return n +} + func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -2647,6 +2994,489 @@ func (m *MsgCollectIncentivesResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgCreateIncentive) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCreateIncentive: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateIncentive: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IncentiveDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IncentiveDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IncentiveAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.IncentiveAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EmissionRate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.EmissionRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinUptime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.MinUptime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateIncentiveResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCreateIncentiveResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateIncentiveResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IncentiveDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IncentiveDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IncentiveAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.IncentiveAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EmissionRate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.EmissionRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinUptime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.MinUptime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 From bded5b6bfc6a83b9ce4d2ba448b6b71f82f5b4e6 Mon Sep 17 00:00:00 2001 From: alpo <62043214+AlpinYukseloglu@users.noreply.github.com> Date: Fri, 10 Mar 2023 15:09:49 -0800 Subject: [PATCH 133/136] Revert "[CL Incentives] Implement `CreateIncentive` logic and message (#4519)" (#4568) This reverts commit b07e76383f8fca4ea226f4575d16883e06efffa0. --- go.work.sum | 2037 ----------------- proto/osmosis/concentrated-liquidity/tx.proto | 53 - x/concentrated-liquidity/client/cli/tx.go | 11 - x/concentrated-liquidity/export_test.go | 4 - x/concentrated-liquidity/incentives.go | 67 - x/concentrated-liquidity/incentives_test.go | 248 +- x/concentrated-liquidity/msg_server.go | 41 - x/concentrated-liquidity/types/codec.go | 2 - x/concentrated-liquidity/types/errors.go | 48 - x/concentrated-liquidity/types/events.go | 34 +- .../types/expected_keepers.go | 1 - x/concentrated-liquidity/types/msgs.go | 33 - x/concentrated-liquidity/types/tx.pb.go | 948 +------- 13 files changed, 77 insertions(+), 3450 deletions(-) delete mode 100644 go.work.sum diff --git a/go.work.sum b/go.work.sum deleted file mode 100644 index 7b55d06630e..00000000000 --- a/go.work.sum +++ /dev/null @@ -1,2037 +0,0 @@ -4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= -bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= -cloud.google.com/go v0.25.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.37.2/go.mod h1:H8IAquKe2L30IxoupDgqTaQvKSwF/c8prYHynGIWQbA= -cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -code.gitea.io/sdk/gitea v0.12.0/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= -contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= -contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= -contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= -contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= -filippo.io/edwards25519 v1.0.0-beta.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= -github.com/99designs/keyring v1.1.6/go.mod h1:16e0ds7LGQQcT59QqkTg72Hh5ShM51Byv5PEmW6uoRU= -github.com/Abirdcfly/dupword v0.0.7/go.mod h1:K/4M1kj+Zh39d2aotRwypvasonOyAMH1c/IZJzE0dmk= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= -github.com/AkihiroSuda/containerd-fuse-overlayfs v1.0.0/go.mod h1:0mMDvQFeLbbn1Wy8P2j3hwFhqBq+FKn8OZPno8WLmp8= -github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v19.1.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v42.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= -github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v10.15.5+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.1.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= -github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest v0.10.2/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= -github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= -github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= -github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= -github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= -github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= -github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.15-0.20200908182639-5b44b70ab3ab/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.10/go.mod h1:g5uw8EV2mAlzqe94tfNBNdr89fnbD/n3HV0OhsddkmM= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= -github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= -github.com/Microsoft/hcsshim v0.9.4/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= -github.com/Microsoft/hcsshim/test v0.0.0-20200826032352-301c83a30e7c/go.mod h1:30A5igQ91GEmhYJF8TaRP79pMBOYynRsyOByfVV0dU4= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= -github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= -github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= -github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/apex/log v1.1.4/go.mod h1:AlpoD9aScyQfJDVHmLMEcx4oU6LqzkWp4Mg9GdAcEvQ= -github.com/apex/log v1.3.0/go.mod h1:jd8Vpsr46WAe3EZSQ/IUMs2qQD/GOycT5rPWCO1yGcs= -github.com/apex/logs v0.0.4/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= -github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= -github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= -github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.11/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.15.90/go.mod h1:es1KtYUFs7le0xQ3rOihkuoVD90z7D0fR2Qm4S00/gU= -github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.25.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.31.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= -github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= -github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= -github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bombsimon/wsl/v2 v2.0.0/go.mod h1:mf25kr/SqFEPhhcxW1+7pxzGlW+hIl/hYTKY95VwV8U= -github.com/bombsimon/wsl/v2 v2.2.0/go.mod h1:Azh8c3XGEJl9LyX0/sFC+CKMc7Ssgua0g+6abzXN4Pg= -github.com/bombsimon/wsl/v3 v3.0.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= -github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= -github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= -github.com/bufbuild/buf v1.9.0/go.mod h1:1Q+rMHiMVcfgScEF/GOldxmu4o9TrQ2sQQh58K6MscE= -github.com/bufbuild/connect-go v1.0.0/go.mod h1:9iNvh/NOsfhNBUH5CtvXeVUskQO1xsrEviH7ZArwZ3I= -github.com/bufbuild/protocompile v0.1.0/go.mod h1:ix/MMMdsT3fzxfw91dvbfzKW3fRRnuPCP47kpAm5m/4= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= -github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= -github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= -github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= -github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/chavacava/garif v0.0.0-20220630083739-93517212f375/go.mod h1:4m1Rv7xfuwWPNKXlThldNuJvutYM6J95wNuuVmn55To= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1-0.20201117152358-0edc412565dc/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= -github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= -github.com/containerd/containerd v1.6.3-0.20220401172941-5ff8fce1fcc6/go.mod h1:WSt2SnDLAGWlu+Vl+EWay37seZLKqgRt6XLjIMy8SYM= -github.com/containerd/containerd v1.6.8/go.mod h1:By6p5KqPK0/7/CgO/A6t/Gz+CUYUu2zf1hUaaymVXB0= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= -github.com/containerd/continuity v0.2.3-0.20220330195504-d132b287edc8/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fuse-overlayfs-snapshotter v1.0.2/go.mod h1:nRZceC8a7dRm3Ao6cJAwuJWPFiBPaibHiFntRUnzhwU= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= -github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= -github.com/containerd/go-cni v1.1.4/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= -github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= -github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter v0.0.0-20201027054423-3a04e4c2c116/go.mod h1:o59b3PCKVAf9jjiKtCc/9hLAd+5p/rfhBfm6aBcTEr4= -github.com/containerd/stargz-snapshotter v0.11.3/go.mod h1:2j2EAUyvrLU4D9unYlTIwGhDKQIk74KJ9E71lJsQCVM= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/stargz-snapshotter/estargz v0.11.3/go.mod h1:7vRJIcImfY8bpifnMjt+HTJoQxASq7T28MYbP15/Nf0= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= -github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= -github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= -github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= -github.com/cosmos/ledger-cosmos-go v0.11.1/go.mod h1:J8//BsAGTo3OC/vDLjMRFLW6q0WAaXvHnVc7ZmE8iUY= -github.com/cosmos/ledger-go v0.9.2/go.mod h1:oZJ2hHAZROdlHiwTg4t7kP+GKIIkBT+o6c9QWFanOyI= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cristalhq/acmd v0.8.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= -github.com/daixiang0/gci v0.8.1/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c= -github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/cli v0.0.0-20190925022749-754388324470/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.0-beta1.0.20201029214301-1d20b15adc38+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.13+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.14+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.6.0-rc.1.0.20180327202408-83389a148052+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.0.0-20200511152416-a93e9eb0e95c/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20180531152204-71cd53e4a197/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v17.12.0-ce-rc1.0.20200730172259-9f28837c1d93+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.0-beta1.0.20201110211921-af34b94a78a1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.3-0.20211208011758-87521affb077+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libnetwork v0.8.0-dev.2.0.20200917202933-d0951081b35f/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= -github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-critic/go-critic v0.4.1/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= -github.com/go-critic/go-critic v0.4.3/go.mod h1:j4O3D4RoIwRqlZw5jJpx0BNfXWWbpcJoKu5cYSe4YmQ= -github.com/go-critic/go-critic v0.6.5/go.mod h1:ezfP/Lh7MA6dBNn4c6ab5ALv3sKnZVLx37tr00uuaOY= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= -github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astcopy v1.0.2/go.mod h1:4TcEdbElGc9twQEYpVo/aieIXfHhiuLh4aLAck6dO7Y= -github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/flock v0.7.3/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v4.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.3.2/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= -github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= -github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.23.7/go.mod h1:g/38bxfhp4rI7zeWSxcdIeHTQGS58TCak8FYcyCmavQ= -github.com/golangci/golangci-lint v1.27.0/go.mod h1:+eZALfxIuthdrHPtfM7w/R3POJLjHDfJJw8XZl9xOng= -github.com/golangci/golangci-lint v1.50.1/go.mod h1:AQjHBopYS//oB8xs0y0M/dtxdKHkdhl0RvmjUct0/4w= -github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= -github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= -github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= -github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= -github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= -github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= -github.com/google/crfs v0.0.0-20191108021818-71d77da419c9/go.mod h1:etGhoOqfwPkooV6aqoX3eBGQOJblqdoc9XvWOeuxpPw= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-containerregistry v0.0.0-20191010200024-a3d713f9b7f8/go.mod h1:KyKXa9ciM8+lgMXwOVsXi7UxGrsf9mM61Mzs+xKUrKE= -github.com/google/go-containerregistry v0.1.2/go.mod h1:GPivBPgdAyd2SU+vf6EpsgOtWDuPqjW0hJZt4rNdTZ4= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= -github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= -github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/gookit/color v1.2.4/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= -github.com/gookit/color v1.5.1/go.mod h1:wZFzea4X8qN6vHOSP2apMb4/+w/orMznEzYsIHPaqKM= -github.com/gookit/color v1.5.2/go.mod h1:w8h4bGiHeeBpvQVePTutdbERIUf3oJE5lZ8HM0UgXyg= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= -github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/goreleaser/goreleaser v0.136.0/go.mod h1:wiKrPUeSNh6Wu8nUHxZydSOVQ/OZvOaO7DTtFqie904= -github.com/goreleaser/nfpm v1.2.1/go.mod h1:TtWrABZozuLOttX2uDlYyECfQX7x5XYkVxhjYcR6G9w= -github.com/goreleaser/nfpm v1.3.0/go.mod h1:w0p7Kc9TAUgWMyrub63ex3M2Mgw88M4GZXoTq5UCb40= -github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= -github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= -github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= -github.com/hanwen/go-fuse/v2 v2.0.3/go.mod h1:0EQM6aH2ctVpvZ6a+onrQ/vaykxh2GH7hy3e13vzTUY= -github.com/hanwen/go-fuse/v2 v2.1.1-0.20220112183258-f57e95bda82d/go.mod h1:B1nGE/6RBFyBRC1RRnf23UpwCdyJ31eukw34oAKukAc= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= -github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= -github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= -github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c/go.mod h1:fHzc09UnyJyqyW+bFuq864eh+wC7dj65aXmXLRe5to0= -github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87/go.mod h1:XGsKKeXxeRr95aEOgipvluMPlgjr7dGlk9ZTWOjcUcg= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= -github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/informalsystems/tm-load-test v1.0.0/go.mod h1:WVaSKaQdfZK3v0C74EMzn7//+3aeCZF8wkIKBz2/M74= -github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= -github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= -github.com/jaguilar/vt100 v0.0.0-20150826170717-2703a27b14ea/go.mod h1:QMdK4dGB3YhEW2BmA1wgGpPYI3HZy/5gD705PXKUVSg= -github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= -github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= -github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= -github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= -github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= -github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= -github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= -github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= -github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= -github.com/kisielk/errcheck v1.6.2/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= -github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= -github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= -github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= -github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= -github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= -github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= -github.com/mgechev/revive v1.2.4/go.mod h1:iAWlQishqCuj4yhV24FTnKSXGpbAA+0SckXB8GQMX/Q= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= -github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= -github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/buildkit v0.8.1/go.mod h1:/kyU1hKy/aYCuP39GZA9MaKioovHku57N6cqlKZIaiQ= -github.com/moby/buildkit v0.10.4/go.mod h1:Yajz9vt1Zw5q9Pp4pdb3TCSUXJBIroIQGQ3TTs/sLug= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mount v0.1.0/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= -github.com/moby/sys/mount v0.1.1/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74= -github.com/moby/sys/mount v0.3.0/go.mod h1:U2Z3ur2rXPFrFmy4q6WMwWrBOAQGYtYTRVM8BIvzbwk= -github.com/moby/sys/mountinfo v0.1.0/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= -github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.6.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20200915141129-7f0af18e79f2/go.mod h1:TjQg8pa4iejrUrjiz0MCtMV38jdMNW4doKSiBrEvCQQ= -github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= -github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= -github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= -github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= -github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= -github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= -github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= -github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= -github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= -github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= -github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= -github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/networkplumbing/go-nft v0.2.0/go.mod h1:HnnM+tYvlGAsMU7yoYwXEVLLiDW9gdMmb5HoGcwpuQs= -github.com/nishanths/exhaustive v0.8.3/go.mod h1:qj+zJJUgJ76tR92+25+03oYUhzF4R7/2Wk7fGTfCHmg= -github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= -github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= -github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= -github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= -github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= -github.com/onsi/ginkgo/v2 v2.8.0/go.mod h1:6JsQiECmxCa3V5st74AL/AmsV482EDdVrGaVW6z3oYU= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.20.0/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= -github.com/onsi/gomega v1.25.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= -github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc10/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runc v1.1.1/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= -github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= -github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= -github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= -github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= -github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= -github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v1.0.5/go.mod h1:APVvOesVSAnne5SClsPxPdfvZTVDojXh1/G3qb5wjGI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8/go.mod h1:CGFX09Ci3pq9QZdj86B+VGIdNj4VyCo2iPOGS9esB/k= -github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= -github.com/quasilyte/go-ruleguard v0.3.18/go.mod h1:lOIzcYlgxrQ2sGJ735EHXmf/e9MJ516j16K/Ifcttvs= -github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.21/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/gogrep v0.0.0-20220828223005-86e4605de09f/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= -github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= -github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= -github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= -github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= -github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= -github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/ryancurrah/gomodguard v1.0.4/go.mod h1:9T/Cfuxs5StfsocWr4WzDL36HqnX0fVb9d5fSEaLhoE= -github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= -github.com/ryancurrah/gomodguard v1.2.4/go.mod h1:+Kem4VjWwvFpUJRJSwa16s1tBJe+vbv02+naTow2f6M= -github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= -github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= -github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= -github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= -github.com/sashamelentyev/usestdlibvars v1.20.0/go.mod h1:0GaP+ecfZMXShS0A94CJn6aEuPRILv8h/VuWI9n1ygg= -github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/securego/gosec v0.0.0-20200103095621-79fbf3af8d83/go.mod h1:vvbZ2Ae7AzSq3/kywjUDxSNq2SJ27RxCz2un0H3ePqE= -github.com/securego/gosec v0.0.0-20200401082031-e946c8c39989/go.mod h1:i9l/TNj+yDFh9SZXUTvspXTjbFXgZGP/UvhU1S65A4A= -github.com/securego/gosec/v2 v2.3.0/go.mod h1:UzeVyUXbxukhLeHKV3VVqo7HdoQR9MrRfFmZYotn8ME= -github.com/securego/gosec/v2 v2.13.1/go.mod h1:EO1sImBMBWFjOTFzMWfTRrZW6M15gm60ljzrmy/wtHo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= -github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= -github.com/shirou/gopsutil/v3 v3.22.9/go.mod h1:bBYl1kjgEJpWpxeHmLI+dVHWtyAwfcmSBLDsp2TNT8A= -github.com/shirou/gopsutil/v3 v3.23.1/go.mod h1:NN6mnm5/0k8jw4cBfCnJtr5L7ErOTg18tMNpgFkn0hA= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sivchari/tenv v1.7.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= -github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= -github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= -github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVjBcBGsVmMmak= -github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= -github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= -github.com/tendermint/tm-db v0.6.6/go.mod h1:wP8d49A85B7/erz/r4YbKssKw6ylsO/hKtFk7E1aWZI= -github.com/tetafro/godot v0.3.7/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= -github.com/tetafro/godot v0.4.2/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= -github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= -github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= -github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= -github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= -github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tomarrell/wrapcheck/v2 v2.7.0/go.mod h1:ao7l5p0aOlUNJKI0qVwB4Yjlqutd0IvAB9Rdwyilxvg= -github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= -github.com/tommy-muehle/go-mnd v1.1.1/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= -github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= -github.com/tonistiigi/fsutil v0.0.0-20201103201449-0834f99b7b85/go.mod h1:a7cilN64dG941IOXfhJhlH0qB92hxJ9A1ewrdUmJ6xo= -github.com/tonistiigi/fsutil v0.0.0-20220115021204-b19f7f9cb274/go.mod h1:oPAfvw32vlUJSjyDcQ3Bu0nb2ON2B+G0dtVN/SZNJiA= -github.com/tonistiigi/go-actions-cache v0.0.0-20220404170428-0bdeb6e1eac7/go.mod h1:qqvyZqkfwkoJuPU/bw61bItaoO0SJ8YSW0vSVRRvsRg= -github.com/tonistiigi/go-archvariant v1.0.0/go.mod h1:TxFmO5VS6vMq2kvs3ht04iPXtu2rUT/erOnGFYfk5Ho= -github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= -github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= -github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= -github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= -github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= -github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= -github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJbreVojo06krnTgaeAz/Z7lynpPk/Q2c= -github.com/vektra/mockery/v2 v2.14.0/go.mod h1:bnD1T8tExSgPD1ripLkDbr60JA9VtQeu12P3wgLZd7M= -github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= -github.com/xanzy/go-gitlab v0.32.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= -go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= -go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= -go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A= -go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.29.0/go.mod h1:LsankqVDx4W+RhZNA5uWarULII/MBhF5qwCYxTuyXjs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.3/go.mod h1:Dts42MGkzZne2yCru741+bFiTMWkIj/LLRizad7b9tw= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.29.0/go.mod h1:vHItvsnJtp7ES++nFLLFBzUWny7fJQSvTlxFcqQGUr4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.29.0/go.mod h1:tLYsuf2v8fZreBVwp9gVMhefZlLFZaUiNVSq8QxXRII= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -go.opentelemetry.io/otel v1.4.0/go.mod h1:jeAqMFKy2uLIxCtKxoFj0FAL5zAPKQagc3+GtBWakzk= -go.opentelemetry.io/otel v1.4.1/go.mod h1:StM6F/0fSwpd8dKWDCdRr7uRvEPYdW0hBSlbdTiUde4= -go.opentelemetry.io/otel v1.11.0/go.mod h1:H2KtuEphyMvlhZ+F7tg9GRhAOe60moNx61Ex+WmiKkk= -go.opentelemetry.io/otel/exporters/jaeger v1.4.1/go.mod h1:ZW7vkOu9nC1CxsD8bHNHCia5JUbwP39vxgd1q4Z5rCI= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.4.1/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.4.1/go.mod h1:o5RW5o2pKpJLD5dNTCmjF1DorYwMeFJmb/rKr5sLaa8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.4.1/go.mod h1:c6E4V3/U+miqjs/8l950wggHGL1qzlp0Ypj9xoGrPqo= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.4.1/go.mod h1:VwYo0Hak6Efuy0TXsZs8o1hnV3dHDPNtDbycG0hI8+M= -go.opentelemetry.io/otel/internal/metric v0.27.0/go.mod h1:n1CVxRqKqYZtqyTh9U/onvKapPGv7y/rpyOTI+LFNzw= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/metric v0.27.0/go.mod h1:raXDJ7uP2/Jc0nVZWQjJtzoyssOYWu/+pjZqRzfvZ7g= -go.opentelemetry.io/otel/metric v0.32.3/go.mod h1:pgiGmKohxHyTPHGOff+vrtIH39/R9fiO/WoenUQ3kcc= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= -go.opentelemetry.io/otel/sdk v1.4.1/go.mod h1:NBwHDgDIBYjwK2WNu1OPgsIc2IJzmBXNnvIJxJc8BpE= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= -go.opentelemetry.io/otel/trace v1.4.0/go.mod h1:uc3eRsqDfWs9R7b92xbQbU42/eTNz4N+gLP8qJCi4aE= -go.opentelemetry.io/otel/trace v1.4.1/go.mod h1:iYEVbroFCNut9QkwEczV9vMRPHNKSSwYZjulEtsmhFc= -go.opentelemetry.io/otel/trace v1.11.0/go.mod h1:nyYjis9jy0gytE9LXGU+/m1sHTKbRY0fX0hulNNDP1U= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= -go.opentelemetry.io/proto/otlp v0.12.0/go.mod h1:TsIjwGWIx5VFYv9KGVlOpxoBl5Dy+63SUguV7GGvlSQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= -golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20221002003631-540bb7301a08/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220726230323-06994584191e/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221017152216-f25eb7ecb193/go.mod h1:RpDiru2p0u2F0lLpEoqnP2+7xs0ifAuOcJ442g6GU2s= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200917073148-efd3b9a0ff20/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201013081832-0aaa2718063a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210313202042-bd2e13477e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211031064116-611d5d643895/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220727055044-e65921a090b8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220919170432-7a66f970e087/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190228203856-589c23e65e65/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200102140908-9497f49d5709/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204192400-7124308813f3/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200331202046-9d5940d49312/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200502202811-ed308ab3e770/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.11-0.20220513221640-090b14e8501f/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.1.12-0.20220628192153-7743d1d949f1/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.4.1-0.20221208213631-3f74d914ae6d/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.2.0/go.mod h1:IfRCZScioGtypHNTlz3gFk67J8uePVW7uDTBzXuIkhU= -google.golang.org/api v0.3.0/go.mod h1:IuvZyQh8jgscv8qWfQ4ABd8m7hEudgBFM/EdhA3BnXw= -google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= -google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= -google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.25.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= -google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211101144312-62acf1d99145/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220725144611-272f38e5d71b/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= -grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= -honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -honnef.co/go/tools v0.3.3/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw= -k8s.io/api v0.0.0-20180904230853-4e7be11eab3f/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= -k8s.io/api v0.17.4/go.mod h1:5qxx6vjmwUVG2nHQTKGlLts8Tbok8PzHl4vHtVFuZCA= -k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= -k8s.io/api v0.23.4/go.mod h1:i77F4JfyNNrhOjZF7OwwNJS5Y1S9dpwvb9iYRYRczfI= -k8s.io/apimachinery v0.0.0-20180904193909-def12e63c512/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= -k8s.io/apimachinery v0.17.4/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= -k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= -k8s.io/apimachinery v0.23.4/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= -k8s.io/apiserver v0.17.4/go.mod h1:5ZDQ6Xr5MNBxyi3iUZXS84QOhZl+W7Oq2us/29c0j9I= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= -k8s.io/client-go v0.0.0-20180910083459-2cefa64ff137/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= -k8s.io/client-go v0.17.4/go.mod h1:ouF6o5pz3is8qU0/qYL2RnoxOPqgfuidYLowytyLJmc= -k8s.io/client-go v0.19.0/go.mod h1:H9E/VT95blcFQnlyShFgnFT9ZnJOAceiUHM3MlRC+mU= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= -k8s.io/client-go v0.23.4/go.mod h1:PKnIL4pqLuvYUK1WU7RLTMYKPiIh7MYShLshtRY9cj0= -k8s.io/cloud-provider v0.17.4/go.mod h1:XEjKDzfD+b9MTLXQFlDGkk6Ho8SGMpaU8Uugx/KNK9U= -k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/component-base v0.17.4/go.mod h1:5BRqHMbbQPm2kKu35v3G+CpVq4K0RJKC7TRioF0I9lE= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= -k8s.io/cri-api v0.24.0-alpha.3/go.mod h1:c/NLI5Zdyup5+oEYqFO2IE32ptofNiZpS1nL2y51gAg= -k8s.io/csi-translation-lib v0.17.4/go.mod h1:CsxmjwxEI0tTNMzffIAcgR9lX4wOh6AKHdxQrT7L0oo= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= -k8s.io/kubernetes v1.11.10/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuBkhu+yxOc1Js= -k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= -modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= -modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= -modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= -modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= -mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= -mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7/go.mod h1:HGC5lll35J70Y5v7vCGb9oLhHoScFwkHDJm/05RdSTc= -mvdan.cc/unparam v0.0.0-20220706161116-678bad134442/go.mod h1:F/Cxw/6mVrNKqrR2YjFf5CaW0Bw4RL8RfbEf4GRggJk= -pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= -sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4= diff --git a/proto/osmosis/concentrated-liquidity/tx.proto b/proto/osmosis/concentrated-liquidity/tx.proto index ea8b8e2e8aa..a68f2ab2438 100644 --- a/proto/osmosis/concentrated-liquidity/tx.proto +++ b/proto/osmosis/concentrated-liquidity/tx.proto @@ -132,57 +132,4 @@ message MsgCollectIncentivesResponse { (gogoproto.moretags) = "yaml:\"collected_incentives\"", (gogoproto.nullable) = false ]; -} - -// ===================== MsgCreateIncentive -message MsgCreateIncentive { - uint64 pool_id = 1 [ (gogoproto.moretags) = "yaml:\"pool_id\"" ]; - string sender = 2 [ (gogoproto.moretags) = "yaml:\"sender\"" ]; - string incentive_denom = 3; - string incentive_amount = 4 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.moretags) = "yaml:\"incentive_amount\"", - (gogoproto.nullable) = false - ]; - string emission_rate = 5 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.moretags) = "yaml:\"emission_rate\"", - (gogoproto.nullable) = false - ]; - google.protobuf.Timestamp start_time = 6 [ - (gogoproto.nullable) = false, - (gogoproto.stdtime) = true, - (gogoproto.moretags) = "yaml:\"start_time\"" - ]; - google.protobuf.Duration min_uptime = 7 [ - (gogoproto.nullable) = false, - (gogoproto.stdduration) = true, - (gogoproto.jsontag) = "duration,omitempty", - (gogoproto.moretags) = "yaml:\"min_uptime\"" - ]; -} - -message MsgCreateIncentiveResponse { - string incentive_denom = 1; - string incentive_amount = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.moretags) = "yaml:\"incentive_amount\"", - (gogoproto.nullable) = false - ]; - string emission_rate = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.moretags) = "yaml:\"emission_rate\"", - (gogoproto.nullable) = false - ]; - google.protobuf.Timestamp start_time = 4 [ - (gogoproto.nullable) = false, - (gogoproto.stdtime) = true, - (gogoproto.moretags) = "yaml:\"start_time\"" - ]; - google.protobuf.Duration min_uptime = 5 [ - (gogoproto.nullable) = false, - (gogoproto.stdduration) = true, - (gogoproto.jsontag) = "duration,omitempty", - (gogoproto.moretags) = "yaml:\"min_uptime\"" - ]; } \ No newline at end of file diff --git a/x/concentrated-liquidity/client/cli/tx.go b/x/concentrated-liquidity/client/cli/tx.go index 9c917ac5ebe..6b677673bf7 100644 --- a/x/concentrated-liquidity/client/cli/tx.go +++ b/x/concentrated-liquidity/client/cli/tx.go @@ -17,7 +17,6 @@ func NewTxCmd() *cobra.Command { osmocli.AddTxCmd(txCmd, NewCreateConcentratedPoolCmd) osmocli.AddTxCmd(txCmd, NewCollectFeesCmd) osmocli.AddTxCmd(txCmd, NewCollectIncentivesCmd) - osmocli.AddTxCmd(txCmd, NewCreateIncentiveCmd) return txCmd } @@ -72,13 +71,3 @@ func NewCollectIncentivesCmd() (*osmocli.TxCliDesc, *types.MsgCollectIncentives) Flags: osmocli.FlagDesc{RequiredFlags: []*flag.FlagSet{FlagSetJustPoolId()}}, }, &types.MsgCollectIncentives{} } - -func NewCreateIncentiveCmd() (*osmocli.TxCliDesc, *types.MsgCreateIncentive) { - return &osmocli.TxCliDesc{ - Use: "create-incentive [incentive-denom] [incentive-amount] [emission-rate] [start-time] [min-uptime]", - Short: "create an incentive record to emit incentives (per second) to a given pool", - Example: "create-incentive uosmo 69082 0.02 100 2023-03-03 03:20:35.419543805 24h --pool-id 1 --from val --chain-id osmosis-1", - CustomFlagOverrides: poolIdFlagOverride, - Flags: osmocli.FlagDesc{RequiredFlags: []*flag.FlagSet{FlagSetJustPoolId()}}, - }, &types.MsgCreateIncentive{} -} diff --git a/x/concentrated-liquidity/export_test.go b/x/concentrated-liquidity/export_test.go index 3ca2966156d..6840226c49f 100644 --- a/x/concentrated-liquidity/export_test.go +++ b/x/concentrated-liquidity/export_test.go @@ -239,7 +239,3 @@ func (k Keeper) CollectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA func GetUptimeTrackerValues(uptimeTrackers []model.UptimeTracker) []sdk.DecCoins { return getUptimeTrackerValues(uptimeTrackers) } - -func (k Keeper) CreateIncentive(ctx sdk.Context, poolId uint64, sender sdk.AccAddress, incentiveDenom string, incentiveAmount sdk.Int, emissionRate sdk.Dec, startTime time.Time, minUptime time.Duration) (types.IncentiveRecord, error) { - return k.createIncentive(ctx, poolId, sender, incentiveDenom, incentiveAmount, emissionRate, startTime, minUptime) -} diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 4b7f9e679fb..bc008210b05 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -501,70 +501,3 @@ func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA } return collectedIncentives, nil } - -// createIncentive creates an incentive record in state for the given pool -func (k Keeper) createIncentive(ctx sdk.Context, poolId uint64, sender sdk.AccAddress, incentiveDenom string, incentiveAmount sdk.Int, emissionRate sdk.Dec, startTime time.Time, minUptime time.Duration) (types.IncentiveRecord, error) { - pool, err := k.getPoolById(ctx, poolId) - if err != nil { - return types.IncentiveRecord{}, err - } - - // Ensure incentive amount is nonzero and nonnegative - if !incentiveAmount.IsPositive() { - return types.IncentiveRecord{}, types.NonPositiveIncentiveAmountError{PoolId: poolId, IncentiveAmount: incentiveAmount.ToDec()} - } - - // Ensure start time is >= current blocktime - if startTime.Before(ctx.BlockTime()) { - return types.IncentiveRecord{}, types.StartTimeTooEarlyError{PoolId: poolId, CurrentBlockTime: ctx.BlockTime(), StartTime: startTime} - } - - // Ensure emission rate is nonzero and nonnegative - if !emissionRate.IsPositive() { - return types.IncentiveRecord{}, types.NonPositiveEmissionRateError{PoolId: poolId, EmissionRate: emissionRate} - } - - // Ensure min uptime is one of the supported periods - validUptime := false - for _, supportedUptime := range types.SupportedUptimes { - if minUptime == supportedUptime { - validUptime = true - } - } - if !validUptime { - return types.IncentiveRecord{}, types.InvalidMinUptimeError{PoolId: poolId, MinUptime: minUptime, SupportedUptimes: types.SupportedUptimes} - } - - // Ensure sender has balance for incentive denom - incentiveCoin := sdk.NewCoin(incentiveDenom, incentiveAmount) - senderHasBalance := k.bankKeeper.HasBalance(ctx, sender, incentiveCoin) - if !senderHasBalance { - return types.IncentiveRecord{}, types.IncentiveInsufficientBalanceError{PoolId: poolId, IncentiveDenom: incentiveDenom, IncentiveAmount: incentiveAmount} - } - - // Sync global uptime accumulators to current blocktime to ensure consistency in reward emissions - err = k.updateUptimeAccumulatorsToNow(ctx, poolId) - if err != nil { - return types.IncentiveRecord{}, err - } - - // Set up incentive record to put in state - incentiveRecord := types.IncentiveRecord{ - PoolId: poolId, - IncentiveDenom: incentiveDenom, - RemainingAmount: incentiveAmount.ToDec(), - EmissionRate: emissionRate, - StartTime: startTime, - MinUptime: minUptime, - } - - // Set incentive record in state - k.setIncentiveRecord(ctx, incentiveRecord) - - // Transfer tokens from sender to pool balance - if err := k.bankKeeper.SendCoins(ctx, sender, pool.GetAddress(), sdk.NewCoins(incentiveCoin)); err != nil { - return types.IncentiveRecord{}, err - } - - return incentiveRecord, nil -} diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 88549cd5c85..8d185726ac1 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -37,7 +37,7 @@ var ( testEmissionThree = sdk.MustNewDecFromStr("165.4") testEmissionFour = sdk.MustNewDecFromStr("57.93") - defaultBlockTime = time.Unix(1, 1).UTC() + defaultBlockTime = time.Unix(0, 0).UTC() defaultTimeBuffer = time.Hour defaultStartTime = defaultBlockTime.Add(defaultTimeBuffer) @@ -223,26 +223,14 @@ func withDenom(record types.IncentiveRecord, denom string) types.IncentiveRecord return record } -func withAmount(record types.IncentiveRecord, amount sdk.Dec) types.IncentiveRecord { - record.RemainingAmount = amount - - return record -} - func withStartTime(record types.IncentiveRecord, startTime time.Time) types.IncentiveRecord { record.StartTime = startTime return record } -func withMinUptime(record types.IncentiveRecord, minUptime time.Duration) types.IncentiveRecord { - record.MinUptime = minUptime - - return record -} - -func withEmissionRate(record types.IncentiveRecord, emissionRate sdk.Dec) types.IncentiveRecord { - record.EmissionRate = emissionRate +func withMinUpTimeTime(record types.IncentiveRecord, minUpTime time.Duration) types.IncentiveRecord { + record.MinUptime = minUpTime return record } @@ -472,7 +460,7 @@ func (s *KeeperTestSuite) TestCreateAndGetUptimeAccumulatorValues() { func (s *KeeperTestSuite) TestCalcAccruedIncentivesForAccum() { incentiveRecordOneWithDifferentStartTime := withStartTime(incentiveRecordOne, incentiveRecordOne.StartTime.Add(10)) - incentiveRecordOneWithDifferentMinUpTime := withMinUptime(incentiveRecordOne, testUptimeTwo) + incentiveRecordOneWithDifferentMinUpTime := withMinUpTimeTime(incentiveRecordOne, testUptimeTwo) incentiveRecordOneWithDifferentDenom := withDenom(incentiveRecordOne, testDenomTwo) type calcAccruedIncentivesTest struct { @@ -2759,231 +2747,3 @@ func (s *KeeperTestSuite) TestCollectIncentives() { }) } } - -func (s *KeeperTestSuite) TestCreateIncentive() { - type testCreateIncentive struct { - poolId uint64 - isInvalidPoolId bool - sender sdk.AccAddress - senderBalance sdk.Coins - recordToSet types.IncentiveRecord - existingRecords []types.IncentiveRecord - - expectedError error - } - tests := map[string]testCreateIncentive{ - "valid incentive record": { - poolId: defaultPoolId, - sender: s.TestAccs[0], - senderBalance: sdk.NewCoins( - sdk.NewCoin( - incentiveRecordOne.IncentiveDenom, - incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), - ), - ), - recordToSet: incentiveRecordOne, - }, - "record with different denom, emission rate, and min uptime": { - poolId: defaultPoolId, - sender: s.TestAccs[0], - senderBalance: sdk.NewCoins( - sdk.NewCoin( - incentiveRecordTwo.IncentiveDenom, - incentiveRecordTwo.RemainingAmount.Ceil().RoundInt(), - ), - ), - recordToSet: incentiveRecordTwo, - }, - "record with different start time": { - poolId: defaultPoolId, - sender: s.TestAccs[0], - senderBalance: sdk.NewCoins( - sdk.NewCoin( - incentiveRecordOne.IncentiveDenom, - incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), - ), - ), - recordToSet: withStartTime(incentiveRecordOne, defaultStartTime.Add(time.Hour)), - }, - "record with different incentive amount": { - poolId: defaultPoolId, - sender: s.TestAccs[0], - senderBalance: sdk.NewCoins( - sdk.NewCoin( - incentiveRecordOne.IncentiveDenom, - sdk.NewInt(8), - ), - ), - recordToSet: withAmount(incentiveRecordOne, sdk.NewDec(8)), - }, - "existing incentive records": { - poolId: defaultPoolId, - sender: s.TestAccs[0], - senderBalance: sdk.NewCoins( - sdk.NewCoin( - incentiveRecordOne.IncentiveDenom, - incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), - ), - ), - recordToSet: incentiveRecordOne, - existingRecords: []types.IncentiveRecord{incentiveRecordTwo, incentiveRecordThree}, - }, - - // Error catching - - "pool doesn't exist": { - isInvalidPoolId: true, - - poolId: defaultPoolId, - sender: s.TestAccs[0], - senderBalance: sdk.NewCoins( - sdk.NewCoin( - incentiveRecordOne.IncentiveDenom, - incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), - ), - ), - recordToSet: incentiveRecordOne, - - expectedError: types.PoolNotFoundError{PoolId: 2}, - }, - "zero incentive amount": { - poolId: defaultPoolId, - sender: s.TestAccs[0], - senderBalance: sdk.NewCoins( - sdk.NewCoin( - incentiveRecordOne.IncentiveDenom, - sdk.ZeroInt(), - ), - ), - recordToSet: withAmount(incentiveRecordOne, sdk.ZeroDec()), - - expectedError: types.NonPositiveIncentiveAmountError{PoolId: 1, IncentiveAmount: sdk.ZeroDec()}, - }, - "negative incentive amount": { - poolId: defaultPoolId, - sender: s.TestAccs[0], - senderBalance: sdk.NewCoins( - sdk.NewCoin( - incentiveRecordOne.IncentiveDenom, - sdk.ZeroInt(), - ), - ), - recordToSet: withAmount(incentiveRecordOne, sdk.NewDec(-1)), - - expectedError: types.NonPositiveIncentiveAmountError{PoolId: 1, IncentiveAmount: sdk.NewDec(-1)}, - }, - "start time too early": { - poolId: defaultPoolId, - sender: s.TestAccs[0], - senderBalance: sdk.NewCoins( - sdk.NewCoin( - incentiveRecordOne.IncentiveDenom, - incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), - ), - ), - recordToSet: withStartTime(incentiveRecordOne, defaultBlockTime.Add(-1*time.Second)), - - expectedError: types.StartTimeTooEarlyError{PoolId: 1, CurrentBlockTime: defaultBlockTime, StartTime: defaultBlockTime.Add(-1 * time.Second)}, - }, - "zero emission rate": { - poolId: defaultPoolId, - sender: s.TestAccs[0], - senderBalance: sdk.NewCoins( - sdk.NewCoin( - incentiveRecordOne.IncentiveDenom, - incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), - ), - ), - recordToSet: withEmissionRate(incentiveRecordOne, sdk.ZeroDec()), - - expectedError: types.NonPositiveEmissionRateError{PoolId: 1, EmissionRate: sdk.ZeroDec()}, - }, - "negative emission rate": { - poolId: defaultPoolId, - sender: s.TestAccs[0], - senderBalance: sdk.NewCoins( - sdk.NewCoin( - incentiveRecordOne.IncentiveDenom, - incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), - ), - ), - recordToSet: withEmissionRate(incentiveRecordOne, sdk.NewDec(-1)), - - expectedError: types.NonPositiveEmissionRateError{PoolId: 1, EmissionRate: sdk.NewDec(-1)}, - }, - "unsupported min uptime": { - poolId: defaultPoolId, - sender: s.TestAccs[0], - senderBalance: sdk.NewCoins( - sdk.NewCoin( - incentiveRecordOne.IncentiveDenom, - incentiveRecordOne.RemainingAmount.Ceil().RoundInt(), - ), - ), - recordToSet: withMinUptime(incentiveRecordOne, time.Hour*3), - - expectedError: types.InvalidMinUptimeError{PoolId: 1, MinUptime: time.Hour * 3, SupportedUptimes: types.SupportedUptimes}, - }, - "insufficient sender balance": { - poolId: defaultPoolId, - sender: s.TestAccs[0], - senderBalance: sdk.NewCoins(), - recordToSet: incentiveRecordOne, - - expectedError: types.IncentiveInsufficientBalanceError{PoolId: 1, IncentiveDenom: incentiveRecordOne.IncentiveDenom, IncentiveAmount: incentiveRecordOne.RemainingAmount.Ceil().RoundInt()}, - }, - } - - for name, tc := range tests { - tc := tc - s.Run(name, func() { - s.SetupTest() - - // We fix blocktime to ensure tests are deterministic - s.Ctx = s.Ctx.WithBlockTime(defaultBlockTime) - - s.PrepareConcentratedPool() - clKeeper := s.App.ConcentratedLiquidityKeeper - s.FundAcc(tc.sender, tc.senderBalance) - - if tc.isInvalidPoolId { - tc.poolId = tc.poolId + 1 - } - - if tc.existingRecords != nil { - clKeeper.SetMultipleIncentiveRecords(s.Ctx, tc.existingRecords) - } - - // system under test - - incentiveRecord, err := clKeeper.CreateIncentive(s.Ctx, tc.poolId, tc.sender, tc.recordToSet.IncentiveDenom, tc.recordToSet.RemainingAmount.Ceil().RoundInt(), tc.recordToSet.EmissionRate, tc.recordToSet.StartTime, tc.recordToSet.MinUptime) - - // Assertions - - if tc.expectedError != nil { - s.Require().Error(err) - s.Require().ErrorContains(err, tc.expectedError.Error()) - - // Ensure nothing was placed in state - recordInState, err := clKeeper.GetIncentiveRecord(s.Ctx, tc.poolId, tc.recordToSet.IncentiveDenom, tc.recordToSet.MinUptime) - s.Require().Error(err) - s.Require().Equal(types.IncentiveRecord{}, recordInState) - - return - } - - s.Require().NoError(err) - - // Returned incentive record should equal both to what's in state and what we expect - recordInState, err := clKeeper.GetIncentiveRecord(s.Ctx, tc.poolId, tc.recordToSet.IncentiveDenom, tc.recordToSet.MinUptime) - s.Require().Equal(tc.recordToSet, recordInState) - s.Require().Equal(tc.recordToSet, incentiveRecord) - - // Ensure that existing records aren't affected - for _, incentiveRecord := range tc.existingRecords { - _, err := clKeeper.GetIncentiveRecord(s.Ctx, tc.poolId, incentiveRecord.IncentiveDenom, incentiveRecord.MinUptime) - s.Require().NoError(err) - } - }) - } -} diff --git a/x/concentrated-liquidity/msg_server.go b/x/concentrated-liquidity/msg_server.go index 22f9741a144..e5e03be57eb 100644 --- a/x/concentrated-liquidity/msg_server.go +++ b/x/concentrated-liquidity/msg_server.go @@ -194,44 +194,3 @@ func (server msgServer) CollectIncentives(goCtx context.Context, msg *types.MsgC return &types.MsgCollectIncentivesResponse{CollectedIncentives: collectedIncentives}, nil } - -func (server msgServer) CreateIncentive(goCtx context.Context, msg *types.MsgCreateIncentive) (*types.MsgCreateIncentiveResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - - sender, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - return nil, err - } - - incentiveRecord, err := server.keeper.createIncentive(ctx, msg.PoolId, sender, msg.IncentiveDenom, msg.IncentiveAmount, msg.EmissionRate, msg.StartTime, msg.MinUptime) - if err != nil { - return nil, err - } - - ctx.EventManager().EmitEvents(sdk.Events{ - sdk.NewEvent( - sdk.EventTypeMessage, - sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory), - sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender), - ), - sdk.NewEvent( - types.TypeEvtCreateIncentive, - sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory), - sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender), - sdk.NewAttribute(types.AttributeKeyPoolId, strconv.FormatUint(msg.PoolId, 10)), - sdk.NewAttribute(types.AttributeIncentiveDenom, msg.IncentiveDenom), - sdk.NewAttribute(types.AttributeIncentiveAmount, msg.IncentiveAmount.String()), - sdk.NewAttribute(types.AttributeIncentiveEmissionRate, msg.EmissionRate.String()), - sdk.NewAttribute(types.AttributeIncentiveStartTime, msg.StartTime.String()), - sdk.NewAttribute(types.AttributeIncentiveMinUptime, msg.MinUptime.String()), - ), - }) - - return &types.MsgCreateIncentiveResponse{ - IncentiveDenom: incentiveRecord.IncentiveDenom, - IncentiveAmount: incentiveRecord.RemainingAmount, - EmissionRate: incentiveRecord.EmissionRate, - StartTime: incentiveRecord.StartTime, - MinUptime: incentiveRecord.MinUptime, - }, nil -} diff --git a/x/concentrated-liquidity/types/codec.go b/x/concentrated-liquidity/types/codec.go index 4fcd39c916f..1995c427ca2 100644 --- a/x/concentrated-liquidity/types/codec.go +++ b/x/concentrated-liquidity/types/codec.go @@ -14,7 +14,6 @@ func RegisterCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&MsgWithdrawPosition{}, "osmosis/cl-withdraw-position", nil) cdc.RegisterConcrete(&MsgCollectFees{}, "osmosis/cl-collect-fees", nil) cdc.RegisterConcrete(&MsgCollectIncentives{}, "osmosis/cl-collect-incentives", nil) - cdc.RegisterConcrete(&MsgCreateIncentive{}, "osmosis/cl-create-incentive", nil) } func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { @@ -29,7 +28,6 @@ func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { &MsgWithdrawPosition{}, &MsgCollectFees{}, &MsgCollectIncentives{}, - &MsgCreateIncentive{}, ) msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) diff --git a/x/concentrated-liquidity/types/errors.go b/x/concentrated-liquidity/types/errors.go index 15685988d66..f75d8ccb94e 100644 --- a/x/concentrated-liquidity/types/errors.go +++ b/x/concentrated-liquidity/types/errors.go @@ -243,54 +243,6 @@ func (e IncentiveRecordNotFoundError) Error() string { return fmt.Sprintf("incentive record not found. pool id (%d), incentive denom (%s), minimum uptime (%s)", e.PoolId, e.IncentiveDenom, e.MinUptime.String()) } -type StartTimeTooEarlyError struct { - PoolId uint64 - CurrentBlockTime time.Time - StartTime time.Time -} - -func (e StartTimeTooEarlyError) Error() string { - return fmt.Sprintf("start time cannot be before current blocktime. Pool id (%d), current blocktime (%s), start time (%s)", e.PoolId, e.CurrentBlockTime.String(), e.StartTime.String()) -} - -type IncentiveInsufficientBalanceError struct { - PoolId uint64 - IncentiveDenom string - IncentiveAmount sdk.Int -} - -func (e IncentiveInsufficientBalanceError) Error() string { - return fmt.Sprintf("sender has insufficient balance to create this incentive record. Pool id (%d), incentive denom (%s), incentive amount needed (%s)", e.PoolId, e.IncentiveDenom, e.IncentiveAmount) -} - -type NonPositiveIncentiveAmountError struct { - PoolId uint64 - IncentiveAmount sdk.Dec -} - -func (e NonPositiveIncentiveAmountError) Error() string { - return fmt.Sprintf("incentive amount must be position (nonzero and nonnegative). Pool id (%d), incentive amount (%s)", e.PoolId, e.IncentiveAmount) -} - -type NonPositiveEmissionRateError struct { - PoolId uint64 - EmissionRate sdk.Dec -} - -func (e NonPositiveEmissionRateError) Error() string { - return fmt.Sprintf("emission rate must be position (nonzero and nonnegative). Pool id (%d), emission rate (%s)", e.PoolId, e.EmissionRate) -} - -type InvalidMinUptimeError struct { - PoolId uint64 - MinUptime time.Duration - SupportedUptimes []time.Duration -} - -func (e InvalidMinUptimeError) Error() string { - return fmt.Sprintf("attempted to create an incentive record with an unsupported minimum uptime. Pool id (%d), specified min uptime (%s), supported uptimes (%s)", e.PoolId, e.MinUptime, e.SupportedUptimes) -} - type QueryRangeUnsupportedError struct { RequestedRange sdk.Int MaxRange sdk.Int diff --git a/x/concentrated-liquidity/types/events.go b/x/concentrated-liquidity/types/events.go index 502b97cf4ce..1f8032da8bb 100644 --- a/x/concentrated-liquidity/types/events.go +++ b/x/concentrated-liquidity/types/events.go @@ -5,25 +5,19 @@ const ( TypeEvtWithdrawPosition = "withdraw_position" TypeEvtCollectFees = "collect_fees" TypeEvtCollectIncentives = "collect_incentives" - TypeEvtCreateIncentive = "create_incentive" - AttributeValueCategory = ModuleName - AttributeKeyPoolId = "pool_id" - AttributeAmount0 = "amount0" - AttributeAmount1 = "amount1" - AttributeKeySwapFee = "swap_fee" - AttributeKeyTokensIn = "tokens_in" - AttributeKeyTokensOut = "tokens_out" - AttributeLiquidity = "liquidity" - AttributeLowerTick = "lower_tick" - AttributeUpperTick = "upper_tick" - AttributeIncentiveDenom = "incentive_denom" - AttributeIncentiveAmount = "incentive_amount" - AttributeIncentiveEmissionRate = "incentive_emission_rate" - AttributeIncentiveStartTime = "incentive_start_time" - AttributeIncentiveMinUptime = "incentive_min_uptime" - TypeEvtPoolJoined = "pool_joined" - TypeEvtPoolExited = "pool_exited" - TypeEvtPoolCreated = "pool_created" - TypeEvtTokenSwapped = "token_swapped" + AttributeValueCategory = ModuleName + AttributeKeyPoolId = "pool_id" + AttributeAmount0 = "amount0" + AttributeAmount1 = "amount1" + AttributeKeySwapFee = "swap_fee" + AttributeKeyTokensIn = "tokens_in" + AttributeKeyTokensOut = "tokens_out" + AttributeLiquidity = "liquidity" + AttributeLowerTick = "lower_tick" + AttributeUpperTick = "upper_tick" + TypeEvtPoolJoined = "pool_joined" + TypeEvtPoolExited = "pool_exited" + TypeEvtPoolCreated = "pool_created" + TypeEvtTokenSwapped = "token_swapped" ) diff --git a/x/concentrated-liquidity/types/expected_keepers.go b/x/concentrated-liquidity/types/expected_keepers.go index 46cc5e095f6..664907622be 100644 --- a/x/concentrated-liquidity/types/expected_keepers.go +++ b/x/concentrated-liquidity/types/expected_keepers.go @@ -12,7 +12,6 @@ import ( type BankKeeper interface { GetDenomMetaData(ctx sdk.Context, denom string) (banktypes.Metadata, bool) SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error - HasBalance(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coin) bool } // PoolManagerKeeper defines the interface needed to be fulfilled for diff --git a/x/concentrated-liquidity/types/msgs.go b/x/concentrated-liquidity/types/msgs.go index 6625b9626cc..c55451ee91d 100644 --- a/x/concentrated-liquidity/types/msgs.go +++ b/x/concentrated-liquidity/types/msgs.go @@ -157,36 +157,3 @@ func (msg MsgCollectIncentives) GetSigners() []sdk.AccAddress { } return []sdk.AccAddress{sender} } - -var _ sdk.Msg = &MsgCreateIncentive{} - -func (msg MsgCreateIncentive) Route() string { return RouterKey } -func (msg MsgCreateIncentive) Type() string { return TypeMsgCollectIncentives } -func (msg MsgCreateIncentive) ValidateBasic() error { - _, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - return fmt.Errorf("Invalid sender address (%s)", err) - } - - if !msg.IncentiveAmount.IsPositive() { - return NonPositiveIncentiveAmountError{PoolId: msg.PoolId, IncentiveAmount: msg.IncentiveAmount.ToDec()} - } - - if !msg.EmissionRate.IsPositive() { - return NonPositiveEmissionRateError{PoolId: msg.PoolId, EmissionRate: msg.EmissionRate} - } - - return nil -} - -func (msg MsgCreateIncentive) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) -} - -func (msg MsgCreateIncentive) GetSigners() []sdk.AccAddress { - sender, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - panic(err) - } - return []sdk.AccAddress{sender} -} diff --git a/x/concentrated-liquidity/types/tx.pb.go b/x/concentrated-liquidity/types/tx.pb.go index 06bf94fbfe2..6d58153f204 100644 --- a/x/concentrated-liquidity/types/tx.pb.go +++ b/x/concentrated-liquidity/types/tx.pb.go @@ -518,147 +518,6 @@ func (m *MsgCollectIncentivesResponse) GetCollectedIncentives() []types.Coin { return nil } -// ===================== MsgCreateIncentive -type MsgCreateIncentive struct { - PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` - Sender string `protobuf:"bytes,2,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` - IncentiveDenom string `protobuf:"bytes,3,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` - IncentiveAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=incentive_amount,json=incentiveAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"incentive_amount" yaml:"incentive_amount"` - EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"emission_rate"` - StartTime time.Time `protobuf:"bytes,6,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` - MinUptime time.Duration `protobuf:"bytes,7,opt,name=min_uptime,json=minUptime,proto3,stdduration" json:"duration,omitempty" yaml:"min_uptime"` -} - -func (m *MsgCreateIncentive) Reset() { *m = MsgCreateIncentive{} } -func (m *MsgCreateIncentive) String() string { return proto.CompactTextString(m) } -func (*MsgCreateIncentive) ProtoMessage() {} -func (*MsgCreateIncentive) Descriptor() ([]byte, []int) { - return fileDescriptor_1f1fff802923d7db, []int{8} -} -func (m *MsgCreateIncentive) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgCreateIncentive) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgCreateIncentive.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgCreateIncentive) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgCreateIncentive.Merge(m, src) -} -func (m *MsgCreateIncentive) XXX_Size() int { - return m.Size() -} -func (m *MsgCreateIncentive) XXX_DiscardUnknown() { - xxx_messageInfo_MsgCreateIncentive.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgCreateIncentive proto.InternalMessageInfo - -func (m *MsgCreateIncentive) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -func (m *MsgCreateIncentive) GetSender() string { - if m != nil { - return m.Sender - } - return "" -} - -func (m *MsgCreateIncentive) GetIncentiveDenom() string { - if m != nil { - return m.IncentiveDenom - } - return "" -} - -func (m *MsgCreateIncentive) GetStartTime() time.Time { - if m != nil { - return m.StartTime - } - return time.Time{} -} - -func (m *MsgCreateIncentive) GetMinUptime() time.Duration { - if m != nil { - return m.MinUptime - } - return 0 -} - -type MsgCreateIncentiveResponse struct { - IncentiveDenom string `protobuf:"bytes,1,opt,name=incentive_denom,json=incentiveDenom,proto3" json:"incentive_denom,omitempty"` - IncentiveAmount github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=incentive_amount,json=incentiveAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"incentive_amount" yaml:"incentive_amount"` - EmissionRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=emission_rate,json=emissionRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"emission_rate" yaml:"emission_rate"` - StartTime time.Time `protobuf:"bytes,4,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` - MinUptime time.Duration `protobuf:"bytes,5,opt,name=min_uptime,json=minUptime,proto3,stdduration" json:"duration,omitempty" yaml:"min_uptime"` -} - -func (m *MsgCreateIncentiveResponse) Reset() { *m = MsgCreateIncentiveResponse{} } -func (m *MsgCreateIncentiveResponse) String() string { return proto.CompactTextString(m) } -func (*MsgCreateIncentiveResponse) ProtoMessage() {} -func (*MsgCreateIncentiveResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_1f1fff802923d7db, []int{9} -} -func (m *MsgCreateIncentiveResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgCreateIncentiveResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgCreateIncentiveResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgCreateIncentiveResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgCreateIncentiveResponse.Merge(m, src) -} -func (m *MsgCreateIncentiveResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgCreateIncentiveResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgCreateIncentiveResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgCreateIncentiveResponse proto.InternalMessageInfo - -func (m *MsgCreateIncentiveResponse) GetIncentiveDenom() string { - if m != nil { - return m.IncentiveDenom - } - return "" -} - -func (m *MsgCreateIncentiveResponse) GetStartTime() time.Time { - if m != nil { - return m.StartTime - } - return time.Time{} -} - -func (m *MsgCreateIncentiveResponse) GetMinUptime() time.Duration { - if m != nil { - return m.MinUptime - } - return 0 -} - func init() { proto.RegisterType((*MsgCreatePosition)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCreatePosition") proto.RegisterType((*MsgCreatePositionResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCreatePositionResponse") @@ -668,8 +527,6 @@ func init() { proto.RegisterType((*MsgCollectFeesResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCollectFeesResponse") proto.RegisterType((*MsgCollectIncentives)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCollectIncentives") proto.RegisterType((*MsgCollectIncentivesResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCollectIncentivesResponse") - proto.RegisterType((*MsgCreateIncentive)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCreateIncentive") - proto.RegisterType((*MsgCreateIncentiveResponse)(nil), "osmosis.concentratedliquidity.v1beta1.MsgCreateIncentiveResponse") } func init() { @@ -677,76 +534,65 @@ func init() { } var fileDescriptor_1f1fff802923d7db = []byte{ - // 1091 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xcf, 0xc4, 0x6e, 0x52, 0x4f, 0x89, 0x13, 0x6f, 0xd3, 0xb2, 0x75, 0x8b, 0x37, 0x1a, 0x04, - 0x0d, 0x82, 0xec, 0x76, 0x5b, 0x2a, 0x55, 0x45, 0x48, 0xc5, 0x89, 0x2a, 0x05, 0x29, 0x12, 0x5a, - 0xb5, 0x02, 0x55, 0x48, 0xab, 0xf5, 0xee, 0xc4, 0x1d, 0xec, 0xdd, 0x71, 0x77, 0xc6, 0x49, 0x8d, - 0xb8, 0x71, 0xe0, 0xc2, 0xa1, 0x20, 0x21, 0xf1, 0x01, 0xf8, 0x22, 0x9c, 0xe8, 0x81, 0x43, 0x0f, - 0x20, 0xa1, 0x1e, 0x0c, 0x4a, 0x6e, 0xdc, 0xf0, 0x27, 0x40, 0xbb, 0x33, 0x3b, 0xeb, 0xd8, 0x86, - 0xc6, 0x09, 0xa9, 0x44, 0x4e, 0xf1, 0x7b, 0xf3, 0x7e, 0xef, 0xcd, 0xfc, 0xde, 0x9f, 0x99, 0x0d, - 0xbc, 0x4a, 0x59, 0x48, 0x19, 0x61, 0x96, 0x4f, 0x23, 0x1f, 0x47, 0x3c, 0xf6, 0x38, 0x0e, 0xd6, - 0xda, 0xe4, 0x51, 0x97, 0x04, 0x84, 0xf7, 0x2c, 0xfe, 0xd8, 0xec, 0xc4, 0x94, 0x53, 0xed, 0x0d, - 0x69, 0x68, 0x0e, 0x1b, 0x2a, 0x3b, 0x73, 0xc7, 0x6e, 0x60, 0xee, 0xd9, 0xd5, 0xe5, 0x26, 0x6d, - 0xd2, 0x14, 0x61, 0x25, 0xbf, 0x04, 0xb8, 0x6a, 0x34, 0x29, 0x6d, 0xb6, 0xb1, 0x95, 0x4a, 0x8d, - 0xee, 0xb6, 0xc5, 0x49, 0x88, 0x19, 0xf7, 0xc2, 0x8e, 0x34, 0xa8, 0x8d, 0x1a, 0x04, 0xdd, 0xd8, - 0xe3, 0x84, 0x46, 0xd9, 0xba, 0x9f, 0x86, 0xb7, 0x1a, 0x1e, 0xc3, 0x96, 0x8c, 0x65, 0xf9, 0x94, - 0xc8, 0x75, 0xf4, 0xd5, 0x1c, 0xac, 0x6c, 0xb1, 0xe6, 0x7a, 0x8c, 0x3d, 0x8e, 0x3f, 0xa2, 0x8c, - 0x24, 0x58, 0xed, 0x6d, 0x38, 0xdf, 0xa1, 0xb4, 0xed, 0x92, 0x40, 0x07, 0x2b, 0x60, 0xb5, 0x58, - 0xd7, 0x06, 0x7d, 0xa3, 0xdc, 0xf3, 0xc2, 0xf6, 0x6d, 0x24, 0x17, 0x90, 0x33, 0x97, 0xfc, 0xda, - 0x0c, 0xb4, 0xb7, 0xe0, 0x1c, 0xc3, 0x51, 0x80, 0x63, 0x7d, 0x76, 0x05, 0xac, 0x96, 0xea, 0x95, - 0x41, 0xdf, 0x58, 0x10, 0xb6, 0x42, 0x8f, 0x1c, 0x69, 0xa0, 0xbd, 0x0b, 0x61, 0x9b, 0xee, 0xe2, - 0xd8, 0xe5, 0xc4, 0x6f, 0xe9, 0x85, 0x15, 0xb0, 0x5a, 0xa8, 0x5f, 0x18, 0xf4, 0x8d, 0x8a, 0x30, - 0xcf, 0xd7, 0x90, 0x53, 0x4a, 0x85, 0x7b, 0xc4, 0x6f, 0x25, 0xa8, 0x6e, 0xa7, 0x93, 0xa1, 0x8a, - 0xa3, 0xa8, 0x7c, 0x0d, 0x39, 0xa5, 0x54, 0x48, 0x51, 0x2e, 0x2c, 0x73, 0xda, 0xc2, 0x91, 0x1b, - 0x60, 0x46, 0x62, 0x1c, 0x5c, 0xd3, 0xcf, 0xac, 0x80, 0xd5, 0x73, 0xd7, 0x2f, 0x99, 0x82, 0x12, - 0x33, 0xa1, 0x24, 0xa3, 0xdf, 0x5c, 0xa7, 0x24, 0xaa, 0xbf, 0xf6, 0xb4, 0x6f, 0xcc, 0x0c, 0xfa, - 0xc6, 0x05, 0xe1, 0xf8, 0x20, 0x1c, 0x39, 0x0b, 0xa9, 0x62, 0x43, 0xca, 0x63, 0x01, 0x6c, 0x7d, - 0xee, 0x38, 0x01, 0xec, 0x91, 0x00, 0xb6, 0xb6, 0x03, 0x2b, 0xc2, 0x22, 0x24, 0x91, 0xeb, 0x85, - 0xb4, 0x1b, 0xf1, 0x6b, 0xfa, 0x7c, 0xca, 0xf1, 0x87, 0x89, 0xa3, 0xe7, 0x7d, 0xe3, 0xcd, 0x26, - 0xe1, 0x0f, 0xbb, 0x0d, 0xd3, 0xa7, 0xa1, 0x25, 0x33, 0x2d, 0xfe, 0xac, 0xb1, 0xa0, 0x65, 0xf1, - 0x5e, 0x07, 0x33, 0x73, 0x33, 0xe2, 0x83, 0xbe, 0xa1, 0x0f, 0x87, 0x1c, 0x72, 0x88, 0x9c, 0xc5, - 0x54, 0xb7, 0x45, 0xa2, 0x0f, 0x84, 0x66, 0x52, 0x5c, 0x5b, 0x3f, 0xfb, 0xdf, 0xc6, 0xb5, 0xc7, - 0xe2, 0xda, 0xda, 0x17, 0x70, 0x71, 0x3b, 0xc6, 0xf8, 0x73, 0xec, 0x66, 0x45, 0xac, 0x97, 0x24, - 0xa3, 0xa2, 0xca, 0xcd, 0xac, 0xca, 0xcd, 0x0d, 0x69, 0x50, 0xbf, 0x95, 0x6c, 0xe8, 0xcf, 0xbe, - 0xa1, 0x65, 0x90, 0x77, 0x68, 0x48, 0x38, 0x0e, 0x3b, 0xbc, 0x37, 0xe8, 0x1b, 0x17, 0x45, 0xf0, - 0x11, 0xaf, 0xe8, 0xfb, 0xdf, 0x0d, 0xe0, 0x94, 0x85, 0x36, 0xf3, 0x84, 0x7e, 0x9e, 0x85, 0x97, - 0xc6, 0x3a, 0xc1, 0xc1, 0xac, 0x43, 0x23, 0x86, 0xb5, 0x07, 0x70, 0x3e, 0xcb, 0x00, 0x48, 0x99, - 0xb8, 0x33, 0x35, 0x13, 0xb2, 0x7f, 0x14, 0xef, 0x99, 0xc3, 0xdc, 0xb7, 0x2d, 0x3b, 0xe8, 0x98, - 0xbe, 0x6d, 0xe5, 0xdb, 0xd6, 0x76, 0x61, 0x45, 0xcd, 0x1a, 0xd7, 0x4f, 0xcf, 0x16, 0xa4, 0x8d, - 0x30, 0x5d, 0x2e, 0x37, 0xb0, 0x9f, 0xe7, 0x72, 0xcc, 0x21, 0x72, 0x96, 0x94, 0x6e, 0x5d, 0xaa, - 0x7e, 0x28, 0xc2, 0xf3, 0x5b, 0xac, 0xf9, 0x31, 0xe1, 0x0f, 0x83, 0xd8, 0xdb, 0x3d, 0x55, 0xa3, - 0x85, 0xc3, 0xfc, 0xbc, 0xb2, 0x9e, 0x25, 0xa7, 0x9b, 0x53, 0x73, 0xfa, 0xea, 0x28, 0xa7, 0xc2, - 0x1f, 0x72, 0x16, 0x95, 0x4a, 0xf4, 0x87, 0x76, 0x1f, 0x96, 0x3e, 0xa3, 0x24, 0x72, 0x93, 0x2b, - 0x40, 0x8e, 0x9a, 0xea, 0x58, 0x63, 0xdc, 0xcb, 0xee, 0x87, 0xfa, 0x15, 0x39, 0x6b, 0x96, 0x44, - 0x00, 0x05, 0x45, 0x4f, 0x92, 0xea, 0x3f, 0x9b, 0xc8, 0x89, 0xf1, 0xa4, 0xae, 0x9b, 0x7f, 0x79, - 0x5d, 0xf7, 0x2b, 0x80, 0x97, 0x27, 0x94, 0xc9, 0xff, 0xbd, 0xef, 0xd0, 0x2f, 0x00, 0x96, 0x93, - 0x69, 0x42, 0xdb, 0x6d, 0xec, 0xf3, 0xbb, 0x18, 0xb3, 0xd3, 0x50, 0xf9, 0xa8, 0x07, 0x2f, 0x1e, - 0x3c, 0x95, 0x4a, 0x94, 0x0b, 0xcb, 0xbe, 0x50, 0xe3, 0xc0, 0xdd, 0xc6, 0x98, 0xe9, 0x60, 0xa5, - 0x30, 0xd5, 0x6d, 0x78, 0x10, 0x8e, 0x9c, 0x05, 0xa5, 0x48, 0x02, 0xa1, 0xe7, 0x00, 0x2e, 0xe7, - 0xb1, 0x37, 0xd3, 0xb7, 0x14, 0xd9, 0x39, 0x25, 0xbc, 0x7e, 0x03, 0xe0, 0x95, 0x49, 0x87, 0x53, - 0xf4, 0x3e, 0x82, 0xcb, 0x39, 0x3f, 0x44, 0xad, 0xbf, 0x98, 0xe4, 0xd7, 0x25, 0xc9, 0x97, 0x47, - 0x49, 0xce, 0x9d, 0x20, 0xe7, 0xbc, 0x52, 0xe7, 0xa1, 0xd1, 0x8f, 0x45, 0xa8, 0xa9, 0x0b, 0x51, - 0xe9, 0x4f, 0x8c, 0xee, 0xab, 0x70, 0x51, 0x6d, 0xc9, 0x0d, 0x70, 0x44, 0xc3, 0x94, 0xf3, 0x92, - 0x53, 0x56, 0xea, 0x8d, 0x44, 0x9b, 0x4c, 0xdf, 0xdc, 0x50, 0x4e, 0xdf, 0xe2, 0xd4, 0xd3, 0x57, - 0xf4, 0xaf, 0x9c, 0xbe, 0xa3, 0xfe, 0x90, 0x93, 0xef, 0x45, 0x4e, 0xdf, 0x16, 0x5c, 0xc0, 0x21, - 0x61, 0x8c, 0xd0, 0xc8, 0x4d, 0x9e, 0xf0, 0x72, 0xe0, 0xdf, 0x9d, 0x7a, 0xe0, 0x2f, 0x8b, 0x90, - 0x07, 0x9c, 0x21, 0xe7, 0x95, 0x4c, 0x76, 0x3c, 0x8e, 0xb5, 0x4f, 0x20, 0x64, 0xdc, 0x8b, 0xf9, - 0x61, 0x67, 0x7d, 0xd6, 0x49, 0xb2, 0xc8, 0x72, 0xac, 0x18, 0xf6, 0xa5, 0x54, 0x91, 0x4e, 0xfb, - 0x10, 0xc2, 0xe4, 0x11, 0xd6, 0xed, 0xa4, 0x9e, 0x5f, 0x38, 0xe8, 0x6f, 0xfc, 0xeb, 0xa0, 0x97, - 0xe1, 0x72, 0x87, 0x62, 0xc6, 0x97, 0x42, 0x12, 0xdd, 0x17, 0xf2, 0x5f, 0x05, 0x58, 0x1d, 0xaf, - 0x21, 0x55, 0xd5, 0x13, 0x72, 0x0e, 0x0e, 0x9d, 0xf3, 0xd9, 0xe3, 0xdd, 0xb8, 0x47, 0xc9, 0x79, - 0xe1, 0xa5, 0xe5, 0xbc, 0x78, 0x62, 0x39, 0x3f, 0x73, 0xc2, 0x39, 0xbf, 0xfe, 0x53, 0x11, 0x16, - 0xb6, 0x58, 0x53, 0xfb, 0x1a, 0xc0, 0xf2, 0xc8, 0x77, 0xe5, 0x2d, 0xf3, 0x50, 0x1f, 0xc3, 0xe6, - 0xd8, 0x3b, 0xbc, 0x7a, 0xe7, 0xa8, 0x48, 0x55, 0x6b, 0xdf, 0x02, 0xb8, 0x34, 0xf6, 0x1a, 0xbd, - 0x7d, 0x78, 0xb7, 0xa3, 0xd8, 0x6a, 0xfd, 0xe8, 0x58, 0xb5, 0xa9, 0x2f, 0x01, 0x3c, 0x37, 0xfc, - 0x46, 0xb8, 0x39, 0xc5, 0x31, 0x73, 0x58, 0xf5, 0xfd, 0x23, 0xc1, 0xd4, 0x2e, 0xbe, 0x03, 0xb0, - 0x32, 0x7e, 0xaf, 0xbe, 0x37, 0xb5, 0xd3, 0x1c, 0x5c, 0x5d, 0x3f, 0x06, 0x38, 0xdb, 0x57, 0xfd, - 0xd3, 0xa7, 0x7b, 0x35, 0xf0, 0x6c, 0xaf, 0x06, 0xfe, 0xd8, 0xab, 0x81, 0x27, 0xfb, 0xb5, 0x99, - 0x67, 0xfb, 0xb5, 0x99, 0xdf, 0xf6, 0x6b, 0x33, 0x0f, 0xea, 0x43, 0xad, 0x27, 0x03, 0xad, 0xb5, - 0xbd, 0x06, 0xcb, 0x04, 0x6b, 0xc7, 0xbe, 0x69, 0x3d, 0xfe, 0xc7, 0xff, 0xcd, 0x24, 0xad, 0xd9, - 0x98, 0x4b, 0x4b, 0xff, 0xc6, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x73, 0x5a, 0x90, 0x5a, 0xca, - 0x11, 0x00, 0x00, + // 922 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x57, 0x41, 0x6f, 0xdc, 0x44, + 0x14, 0xce, 0x34, 0x61, 0xd3, 0x9d, 0x2a, 0x9b, 0xac, 0x9b, 0x16, 0x77, 0x5b, 0xd6, 0xab, 0x41, + 0x40, 0x10, 0xc4, 0xae, 0x0b, 0x95, 0xaa, 0x22, 0xa4, 0xe2, 0x44, 0x48, 0x41, 0x8a, 0x84, 0xac, + 0x22, 0xa4, 0x0a, 0xc9, 0xf2, 0xda, 0x93, 0xed, 0x90, 0xb5, 0xc7, 0xf5, 0xcc, 0x26, 0x5d, 0xc4, + 0x8d, 0x03, 0x17, 0x0e, 0x05, 0x09, 0x89, 0x1f, 0xc0, 0x7f, 0xa1, 0x07, 0x0e, 0x3d, 0x80, 0x84, + 0x7a, 0x30, 0x28, 0xb9, 0x71, 0xdc, 0x5f, 0x80, 0xec, 0x19, 0xdb, 0x1b, 0x7b, 0x11, 0xdd, 0x04, + 0x21, 0x91, 0x53, 0x76, 0xde, 0xbc, 0xef, 0xfb, 0x66, 0xbe, 0x99, 0xf7, 0xc6, 0x81, 0x6f, 0x50, + 0x16, 0x50, 0x46, 0x98, 0xe1, 0xd1, 0xd0, 0xc3, 0x21, 0x8f, 0x5d, 0x8e, 0xfd, 0xcd, 0x21, 0x79, + 0x34, 0x22, 0x3e, 0xe1, 0x63, 0x83, 0x3f, 0xd6, 0xa3, 0x98, 0x72, 0xaa, 0xbc, 0x26, 0x13, 0xf5, + 0xe9, 0xc4, 0x22, 0x4f, 0x3f, 0x30, 0xfb, 0x98, 0xbb, 0x66, 0x67, 0x7d, 0x40, 0x07, 0x34, 0x43, + 0x18, 0xe9, 0x2f, 0x01, 0xee, 0x68, 0x03, 0x4a, 0x07, 0x43, 0x6c, 0x64, 0xa3, 0xfe, 0x68, 0xcf, + 0xe0, 0x24, 0xc0, 0x8c, 0xbb, 0x41, 0x24, 0x13, 0xba, 0xd5, 0x04, 0x7f, 0x14, 0xbb, 0x9c, 0xd0, + 0x30, 0x9f, 0xf7, 0x32, 0x79, 0xa3, 0xef, 0x32, 0x6c, 0x48, 0x2d, 0xc3, 0xa3, 0x44, 0xce, 0xa3, + 0xaf, 0x1b, 0xb0, 0xbd, 0xcb, 0x06, 0x5b, 0x31, 0x76, 0x39, 0xfe, 0x98, 0x32, 0x92, 0x62, 0x95, + 0xb7, 0xe0, 0x72, 0x44, 0xe9, 0xd0, 0x21, 0xbe, 0x0a, 0x7a, 0x60, 0x63, 0xc9, 0x52, 0x26, 0x89, + 0xd6, 0x1a, 0xbb, 0xc1, 0xf0, 0x2e, 0x92, 0x13, 0xc8, 0x6e, 0xa4, 0xbf, 0x76, 0x7c, 0xe5, 0x4d, + 0xd8, 0x60, 0x38, 0xf4, 0x71, 0xac, 0x5e, 0xe8, 0x81, 0x8d, 0xa6, 0xd5, 0x9e, 0x24, 0xda, 0x8a, + 0xc8, 0x15, 0x71, 0x64, 0xcb, 0x04, 0xe5, 0x5d, 0x08, 0x87, 0xf4, 0x10, 0xc7, 0x0e, 0x27, 0xde, + 0xbe, 0xba, 0xd8, 0x03, 0x1b, 0x8b, 0xd6, 0x95, 0x49, 0xa2, 0xb5, 0x45, 0x7a, 0x39, 0x87, 0xec, + 0x66, 0x36, 0xb8, 0x4f, 0xbc, 0xfd, 0x14, 0x35, 0x8a, 0xa2, 0x1c, 0xb5, 0x54, 0x45, 0x95, 0x73, + 0xc8, 0x6e, 0x66, 0x83, 0x0c, 0xe5, 0xc0, 0x16, 0xa7, 0xfb, 0x38, 0x74, 0x7c, 0xcc, 0x48, 0x8c, + 0xfd, 0x9b, 0xea, 0x4b, 0x3d, 0xb0, 0x71, 0xe9, 0xd6, 0x35, 0x5d, 0x58, 0xa2, 0xa7, 0x96, 0xe4, + 0xf6, 0xeb, 0x5b, 0x94, 0x84, 0xd6, 0x2b, 0x4f, 0x13, 0x6d, 0x61, 0x92, 0x68, 0x57, 0x04, 0xf1, + 0x49, 0x38, 0xb2, 0x57, 0xb2, 0xc0, 0xb6, 0x1c, 0xd7, 0x04, 0x4c, 0xb5, 0x71, 0x16, 0x01, 0xb3, + 0x22, 0x60, 0x2a, 0x07, 0xb0, 0x2d, 0x32, 0x02, 0x12, 0x3a, 0x6e, 0x40, 0x47, 0x21, 0xbf, 0xa9, + 0x2e, 0x67, 0x1e, 0x7f, 0x94, 0x12, 0x3d, 0x4f, 0xb4, 0xd7, 0x07, 0x84, 0x3f, 0x1c, 0xf5, 0x75, + 0x8f, 0x06, 0x86, 0x3c, 0x69, 0xf1, 0x67, 0x93, 0xf9, 0xfb, 0x06, 0x1f, 0x47, 0x98, 0xe9, 0x3b, + 0x21, 0x9f, 0x24, 0x9a, 0x3a, 0x2d, 0x39, 0x45, 0x88, 0xec, 0xd5, 0x2c, 0xb6, 0x4b, 0xc2, 0x0f, + 0x44, 0x64, 0x96, 0xae, 0xa9, 0x5e, 0xfc, 0x77, 0x75, 0xcd, 0x9a, 0xae, 0xa9, 0x7c, 0x09, 0x57, + 0xf7, 0x62, 0x8c, 0xbf, 0xc0, 0x4e, 0x7e, 0x89, 0xd5, 0xa6, 0x74, 0x54, 0xdc, 0x72, 0x3d, 0xbf, + 0xe5, 0xfa, 0xb6, 0x4c, 0xb0, 0xee, 0xa4, 0x0b, 0xfa, 0x33, 0xd1, 0x94, 0x1c, 0xf2, 0x36, 0x0d, + 0x08, 0xc7, 0x41, 0xc4, 0xc7, 0x93, 0x44, 0xbb, 0x2a, 0xc4, 0x2b, 0xac, 0xe8, 0x87, 0xdf, 0x35, + 0x60, 0xb7, 0x44, 0x34, 0x67, 0x42, 0x3f, 0x5f, 0x80, 0xd7, 0x6a, 0x95, 0x60, 0x63, 0x16, 0xd1, + 0x90, 0x61, 0xe5, 0x01, 0x5c, 0xce, 0x4f, 0x00, 0x64, 0x4e, 0xdc, 0x9b, 0xdb, 0x09, 0x59, 0x3f, + 0x85, 0xef, 0x39, 0x61, 0xc9, 0x6d, 0xca, 0x0a, 0x3a, 0x23, 0xb7, 0x59, 0x70, 0x9b, 0xca, 0x21, + 0x6c, 0x17, 0xbd, 0xc6, 0xf1, 0xb2, 0xbd, 0xf9, 0x59, 0x21, 0xcc, 0x77, 0x96, 0xdb, 0xd8, 0x2b, + 0xcf, 0xb2, 0x46, 0x88, 0xec, 0xb5, 0x22, 0xb6, 0x25, 0x43, 0x3f, 0x2e, 0xc1, 0xcb, 0xbb, 0x6c, + 0xf0, 0x29, 0xe1, 0x0f, 0xfd, 0xd8, 0x3d, 0x3c, 0x57, 0xad, 0x85, 0xc3, 0x72, 0xbf, 0xf2, 0x3e, + 0x4b, 0x4f, 0x77, 0xe6, 0xf6, 0xf4, 0xe5, 0xaa, 0xa7, 0x82, 0x0f, 0xd9, 0xab, 0x45, 0x48, 0xd4, + 0x87, 0xf2, 0x09, 0x6c, 0x7e, 0x4e, 0x49, 0xe8, 0xa4, 0x4f, 0x80, 0x6c, 0x35, 0x9d, 0x5a, 0x61, + 0xdc, 0xcf, 0xdf, 0x07, 0xeb, 0x86, 0xec, 0x35, 0x6b, 0x42, 0xa0, 0x80, 0xa2, 0x27, 0xe9, 0xed, + 0xbf, 0x98, 0x8e, 0xd3, 0xe4, 0x59, 0x55, 0xb7, 0xfc, 0xdf, 0x55, 0xdd, 0xaf, 0x00, 0x5e, 0x9f, + 0x71, 0x4d, 0xfe, 0xef, 0x75, 0x87, 0x7e, 0x01, 0xb0, 0x95, 0x76, 0x13, 0x3a, 0x1c, 0x62, 0x8f, + 0x7f, 0x88, 0x31, 0x3b, 0x0f, 0x37, 0x1f, 0x8d, 0xe1, 0xd5, 0x93, 0xbb, 0x2a, 0x0e, 0xca, 0x81, + 0x2d, 0x4f, 0x84, 0xb1, 0xef, 0xec, 0x61, 0xcc, 0x54, 0xd0, 0x5b, 0x9c, 0xeb, 0x35, 0x3c, 0x09, + 0x47, 0xf6, 0x4a, 0x11, 0x48, 0x85, 0xd0, 0x73, 0x00, 0xd7, 0x4b, 0xed, 0x9d, 0xec, 0x5b, 0x8a, + 0x1c, 0x9c, 0x13, 0x5f, 0xbf, 0x05, 0xf0, 0xc6, 0xac, 0xcd, 0x15, 0xf6, 0x3e, 0x82, 0xeb, 0xa5, + 0x3f, 0xa4, 0x98, 0xff, 0x67, 0x93, 0x5f, 0x95, 0x26, 0x5f, 0xaf, 0x9a, 0x5c, 0x92, 0x20, 0xfb, + 0x72, 0x11, 0x2e, 0xa5, 0x6f, 0xfd, 0xb4, 0x04, 0x17, 0x77, 0xd9, 0x40, 0xf9, 0x06, 0xc0, 0x56, + 0xe5, 0xfb, 0xf0, 0x8e, 0xfe, 0x42, 0x1f, 0xb5, 0x7a, 0xed, 0x3d, 0xed, 0xdc, 0x3b, 0x2d, 0xb2, + 0x70, 0xe2, 0x3b, 0x00, 0xd7, 0x6a, 0xaf, 0xca, 0xdd, 0x17, 0xa7, 0xad, 0x62, 0x3b, 0xd6, 0xe9, + 0xb1, 0xc5, 0xa2, 0xbe, 0x02, 0xf0, 0xd2, 0x74, 0xad, 0xdf, 0x9e, 0x63, 0x9b, 0x25, 0xac, 0xf3, + 0xfe, 0xa9, 0x60, 0xc5, 0x2a, 0xbe, 0x07, 0xb0, 0x5d, 0xaf, 0x8f, 0xf7, 0xe6, 0x26, 0x2d, 0xc1, + 0x9d, 0xad, 0x33, 0x80, 0xf3, 0x75, 0x59, 0x9f, 0x3d, 0x3d, 0xea, 0x82, 0x67, 0x47, 0x5d, 0xf0, + 0xc7, 0x51, 0x17, 0x3c, 0x39, 0xee, 0x2e, 0x3c, 0x3b, 0xee, 0x2e, 0xfc, 0x76, 0xdc, 0x5d, 0x78, + 0x60, 0x4d, 0x75, 0x5a, 0x29, 0xb4, 0x39, 0x74, 0xfb, 0x2c, 0x1f, 0x18, 0x07, 0xe6, 0x6d, 0xe3, + 0xf1, 0xdf, 0xfe, 0x8f, 0x95, 0x76, 0xe2, 0x7e, 0x23, 0x7b, 0x9f, 0xde, 0xf9, 0x2b, 0x00, 0x00, + 0xff, 0xff, 0x93, 0x6f, 0x8b, 0x14, 0x92, 0x0d, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1361,150 +1207,6 @@ func (m *MsgCollectIncentivesResponse) MarshalToSizedBuffer(dAtA []byte) (int, e return len(dAtA) - i, nil } -func (m *MsgCreateIncentive) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgCreateIncentive) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgCreateIncentive) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - n6, err6 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MinUptime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime):]) - if err6 != nil { - return 0, err6 - } - i -= n6 - i = encodeVarintTx(dAtA, i, uint64(n6)) - i-- - dAtA[i] = 0x3a - n7, err7 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) - if err7 != nil { - return 0, err7 - } - i -= n7 - i = encodeVarintTx(dAtA, i, uint64(n7)) - i-- - dAtA[i] = 0x32 - { - size := m.EmissionRate.Size() - i -= size - if _, err := m.EmissionRate.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size := m.IncentiveAmount.Size() - i -= size - if _, err := m.IncentiveAmount.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - if len(m.IncentiveDenom) > 0 { - i -= len(m.IncentiveDenom) - copy(dAtA[i:], m.IncentiveDenom) - i = encodeVarintTx(dAtA, i, uint64(len(m.IncentiveDenom))) - i-- - dAtA[i] = 0x1a - } - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) - i-- - dAtA[i] = 0x12 - } - if m.PoolId != 0 { - i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *MsgCreateIncentiveResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgCreateIncentiveResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgCreateIncentiveResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - n8, err8 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MinUptime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime):]) - if err8 != nil { - return 0, err8 - } - i -= n8 - i = encodeVarintTx(dAtA, i, uint64(n8)) - i-- - dAtA[i] = 0x2a - n9, err9 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) - if err9 != nil { - return 0, err9 - } - i -= n9 - i = encodeVarintTx(dAtA, i, uint64(n9)) - i-- - dAtA[i] = 0x22 - { - size := m.EmissionRate.Size() - i -= size - if _, err := m.EmissionRate.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.IncentiveAmount.Size() - i -= size - if _, err := m.IncentiveAmount.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.IncentiveDenom) > 0 { - i -= len(m.IncentiveDenom) - copy(dAtA[i:], m.IncentiveDenom) - i = encodeVarintTx(dAtA, i, uint64(len(m.IncentiveDenom))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -1678,55 +1380,6 @@ func (m *MsgCollectIncentivesResponse) Size() (n int) { return n } -func (m *MsgCreateIncentive) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolId != 0 { - n += 1 + sovTx(uint64(m.PoolId)) - } - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.IncentiveDenom) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.IncentiveAmount.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.EmissionRate.Size() - n += 1 + l + sovTx(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) - n += 1 + l + sovTx(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime) - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgCreateIncentiveResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.IncentiveDenom) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.IncentiveAmount.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.EmissionRate.Size() - n += 1 + l + sovTx(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) - n += 1 + l + sovTx(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.MinUptime) - n += 1 + l + sovTx(uint64(l)) - return n -} - func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -2994,489 +2647,6 @@ func (m *MsgCollectIncentivesResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgCreateIncentive) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgCreateIncentive: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgCreateIncentive: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sender = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IncentiveDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.IncentiveDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IncentiveAmount", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.IncentiveAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EmissionRate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.EmissionRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinUptime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.MinUptime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgCreateIncentiveResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgCreateIncentiveResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgCreateIncentiveResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IncentiveDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.IncentiveDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IncentiveAmount", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.IncentiveAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EmissionRate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.EmissionRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinUptime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.MinUptime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 From fd86d6a598ae3654fe93e91a2ea331a673237980 Mon Sep 17 00:00:00 2001 From: alpo Date: Sat, 11 Mar 2023 16:32:44 -0800 Subject: [PATCH 134/136] make unit tests more robust --- x/concentrated-liquidity/incentives.go | 2 +- x/concentrated-liquidity/incentives_test.go | 48 ++++++++++++++++++--- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index f2bcdfc487d..e7ea5700444 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -463,7 +463,7 @@ func (k Keeper) claimAllIncentivesForPosition(ctx sdk.Context, poolId uint64, ow } positionName := string(types.KeyFullPosition(poolId, owner, lowerTick, upperTick, position.JoinTime, position.FreezeDuration)) - collectedIncentivesForPosition := sdk.Coins(nil) + collectedIncentivesForPosition := sdk.Coins{} for uptimeIndex, uptimeAccum := range uptimeAccumulators { hasPosition, err := uptimeAccum.HasPosition(positionName) if err != nil { diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index ef9fd8e3208..3cb940d18a5 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -3054,35 +3054,50 @@ func (s *KeeperTestSuite) TestClaimAllIncentives() { growthInside []sdk.DecCoins growthOutside []sdk.DecCoins forfeitIncentives bool - expectError error + expectedError error }{ "happy path: claim rewards without forfeiting": { + poolId: validPoolId, growthInside: uptimeHelper.hundredTokensMultiDenom, growthOutside: uptimeHelper.twoHundredTokensMultiDenom, }, "claim and forfeit rewards": { + poolId: validPoolId, growthInside: uptimeHelper.hundredTokensMultiDenom, growthOutside: uptimeHelper.twoHundredTokensMultiDenom, forfeitIncentives: true, }, "claim and forfeit rewards when no rewards have accrued": { + poolId: validPoolId, forfeitIncentives: true, }, "claim and forfeit rewards with varying amounts and different denoms": { + poolId: validPoolId, growthInside: uptimeHelper.varyingTokensMultiDenom, growthOutside: uptimeHelper.varyingTokensSingleDenom, forfeitIncentives: true, }, + + // error catching + + "error: non existent pool/accum": { + poolId: validPoolId + 1, + growthInside: uptimeHelper.hundredTokensMultiDenom, + growthOutside: uptimeHelper.twoHundredTokensMultiDenom, + + expectedError: accum.AccumDoesNotExistError{AccumName: "uptime/2/0"}, + }, } for _, tc := range tests { tc := tc s.Run(tc.name, func() { - // Setup test env. + // --- Setup test env --- + s.SetupTest() clPool := s.PrepareConcentratedPool() clKeeper := s.App.ConcentratedLiquidityKeeper - // Initialize position. + // Initialize position err := clKeeper.InitOrUpdatePosition(s.Ctx, validPoolId, defaultSender, DefaultLowerTick, DefaultUpperTick, sdk.OneDec(), s.Ctx.BlockTime(), time.Hour*24*14) s.Require().NoError(err) @@ -3105,12 +3120,27 @@ func (s *KeeperTestSuite) TestClaimAllIncentives() { // Get newly created position to pass into sut function position, err := clKeeper.GetPosition(s.Ctx, validPoolId, defaultSender, DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime(), time.Hour*24*14) - // System under test. - amountClaimed, err := clKeeper.ClaimAllIncentivesForPosition(s.Ctx, validPoolId, defaultSender, position, DefaultLowerTick, DefaultUpperTick, tc.forfeitIncentives) + // Store initial pool and sender balances for comparison later + initSenderBalances := s.App.BankKeeper.GetAllBalances(s.Ctx, defaultSender) + initPoolBalances := s.App.BankKeeper.GetAllBalances(s.Ctx, clPool.GetAddress()) - if tc.expectError != nil { + // --- System under test --- + + amountClaimed, err := clKeeper.ClaimAllIncentivesForPosition(s.Ctx, tc.poolId, defaultSender, position, DefaultLowerTick, DefaultUpperTick, tc.forfeitIncentives) + + // --- Assertions --- + + // Pull new balances for comparison + newSenderBalances := s.App.BankKeeper.GetAllBalances(s.Ctx, defaultSender) + newPoolBalances := s.App.BankKeeper.GetAllBalances(s.Ctx, clPool.GetAddress()) + + if tc.expectedError != nil { s.Require().Error(err) - s.Require().ErrorIs(err, tc.expectError) + s.Require().ErrorIs(err, tc.expectedError) + + // Ensure balances have not been mutated + s.Require().Equal(initSenderBalances, newSenderBalances) + s.Require().Equal(initPoolBalances, newPoolBalances) return } s.Require().NoError(err) @@ -3139,6 +3169,10 @@ func (s *KeeperTestSuite) TestClaimAllIncentives() { s.Require().Equal(normalizedUptimeAccumDelta, amountClaimed) } + + // Ensure balances have not been mutated + s.Require().Equal(initSenderBalances, newSenderBalances) + s.Require().Equal(initPoolBalances, newPoolBalances) }) } } From 8ffa1170747b2da4d1f62514df3ccfd045e69f3b Mon Sep 17 00:00:00 2001 From: alpo Date: Sat, 11 Mar 2023 19:23:09 -0800 Subject: [PATCH 135/136] minor comment cleanup --- x/concentrated-liquidity/incentives_test.go | 2 +- x/concentrated-liquidity/lp.go | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/x/concentrated-liquidity/incentives_test.go b/x/concentrated-liquidity/incentives_test.go index 3cb940d18a5..63bc9689271 100644 --- a/x/concentrated-liquidity/incentives_test.go +++ b/x/concentrated-liquidity/incentives_test.go @@ -3117,7 +3117,7 @@ func (s *KeeperTestSuite) TestClaimAllIncentives() { initUptimeAccumValues, err := clKeeper.GetUptimeAccumulatorValues(s.Ctx, validPoolId) s.Require().NoError(err) - // Get newly created position to pass into sut function + // Get newly created position to pass into `ClaimAllIncentivesForPosition` function position, err := clKeeper.GetPosition(s.Ctx, validPoolId, defaultSender, DefaultLowerTick, DefaultUpperTick, s.Ctx.BlockTime(), time.Hour*24*14) // Store initial pool and sender balances for comparison later diff --git a/x/concentrated-liquidity/lp.go b/x/concentrated-liquidity/lp.go index 7d223800cea..fc9b04c4032 100644 --- a/x/concentrated-liquidity/lp.go +++ b/x/concentrated-liquidity/lp.go @@ -134,12 +134,10 @@ func (k Keeper) withdrawPosition(ctx sdk.Context, poolId uint64, owner sdk.AccAd return sdk.Int{}, sdk.Int{}, fmt.Errorf("If withdrawing from frozen position, must withdraw all liquidity.") } - claimedIncentivesForPos, err := k.claimAllIncentivesForPosition(ctx, poolId, owner, position, lowerTick, upperTick, true) + _, err := k.claimAllIncentivesForPosition(ctx, poolId, owner, position, lowerTick, upperTick, true) if err != nil { return sdk.Int{}, sdk.Int{}, err } - - fmt.Println("claimedIncentivesForPos: ", claimedIncentivesForPos) } // Check if the requested liquidity amount to withdraw is less than or equal to the available liquidity for the position. From 4cd29752f85e296109cec1f9f8323792c548a0ca Mon Sep 17 00:00:00 2001 From: alpo Date: Wed, 15 Mar 2023 11:26:24 -0700 Subject: [PATCH 136/136] fix conflicts --- x/concentrated-liquidity/incentives.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x/concentrated-liquidity/incentives.go b/x/concentrated-liquidity/incentives.go index 52f9d0318e0..d3fe7151edb 100644 --- a/x/concentrated-liquidity/incentives.go +++ b/x/concentrated-liquidity/incentives.go @@ -430,7 +430,8 @@ func (k Keeper) collectIncentives(ctx sdk.Context, poolId uint64, owner sdk.AccA return sdk.Coins{}, err } - positionsInRange, err := k.getAllPositionsWithVaryingFreezeTimes(ctx, poolId, owner, lowerTick, upperTick) + // Get all of owner's positions with the same lower and upper ticks + positionsInRange, err := osmoutils.GatherValuesFromStorePrefixWithKeyParser(ctx.KVStore(k.storeKey), types.KeyPosition(poolId, owner, lowerTick, upperTick), ParseFullPositionFromBytes) if err != nil { return sdk.Coins{}, err }